diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7695a3d..f8fe8f0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,18 @@
+## 1.16.0
+
+### Analyzer
+
+*   Static checking of `for in` statements. These will now produce static
+    warnings:
+
+    ```dart
+    // Not Iterable.
+    for (var i in 1234) { ... }
+
+    // String cannot be assigned to int.
+    for (int n in <String>["a", "b"]) { ... }
+    ```
+
 ## 1.15.0 - 2016-03-09
 
 ### Core library changes
@@ -54,10 +69,18 @@
 
 [configuring the analyzer]: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
 
-## 1.14.2 - 2016-02-09
+## 1.14.2 - 2016-02-10
 
-* Fixes a bug where pub would download packages from pub.dartlang.org even when
-  a different hosted URL was specified.
+Patch release, resolves three issues:
+
+* VM: Fixed a code generation bug on x64.
+  (SDK commit [834b3f02](https://github.com/dart-lang/sdk/commit/834b3f02b6ab740a213fd808e6c6f3269bed80e5))
+
+* `dart:io`: Fixed EOF detection when reading some special device files.
+  (SDK issue [25596](https://github.com/dart-lang/sdk/issues/25596))
+
+* Pub: Fixed an error using hosted dependencies in SDK version 1.14.
+  (Pub issue [1386](https://github.com/dart-lang/pub/issues/1386))
 
 ## 1.14.1 - 2016-02-04
 
diff --git a/DEPS b/DEPS
index 38ccb51..97ab2cc 100644
--- a/DEPS
+++ b/DEPS
@@ -48,11 +48,11 @@
   "http_multi_server_tag" : "@2.0.0",
   "http_parser_tag" : "@1.1.0",
   "http_throttle_rev" : "@a81f08be942cdd608883c7b67795c12226abc235",
-  "idl_parser_rev": "@6316d5982dc24b34d09dd8b10fbeaaff28d83a48",
+  "idl_parser_rev": "@7fbe68cab90c38147dee4f48c30ad0d496c17915",
   "intl_rev": "@a8b480b9c436f6c0ec16730804c914bdb4e30d53",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "@1.1.1",
-  "linter_rev": "@ce7aa0ec03ee738f4d314138228e0b4742845810",
+  "linter_rev": "@f90572f9be203a0ec9744aa3fb3b9509e3ca143d",
   "logging_rev": "@85d83e002670545e9039ad3985f0018ab640e597",
   "markdown_rev": "@4aaadf3d940bb172e1f6285af4d2b1710d309982",
   "matcher_tag": "@0.12.0",
@@ -92,7 +92,7 @@
   "when_tag": "@0.2.0+2",
   "which_tag": "@0.1.3+1",
   "web_components_rev": "@0e636b534d9b12c9e96f841e6679398e91a986ec",
-  "WebCore_rev": "@5ecb723fd9ffcc0d108f5e0e24d12b8b3df7b200",
+  "WebCore_rev": "@a86fe28efadcfc781f836037a80f27e22a5dad17",
   "yaml_tag": "@2.1.5",
   "zlib_rev": "@c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
   "barback-0.13.0_rev": "@34853",
@@ -129,7 +129,7 @@
       Var("chromium_git") + "/chromium/src/third_party/ply.git" +
       Var("ply_rev"),
 
-  Var("dart_root") + "/third_party/idl_parser":
+  Var("dart_root") + "/tools/idl_parser":
       Var("chromium_git") + "/chromium/src/tools/idl_parser.git" +
       Var("idl_parser_rev"),
 
diff --git a/dart.gyp b/dart.gyp
index 918e5d6..9ac4105 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -28,7 +28,7 @@
         'runtime/dart-runtime.gyp:dart_noopt',
         'runtime/dart-runtime.gyp:dart_precompiled_runtime',
         'runtime/dart-runtime.gyp:dart_product',
-        'runtime/dart-runtime.gyp:dart_no_snapshot',
+        'runtime/dart-runtime.gyp:dart_bootstrap#host',
         'runtime/dart-runtime.gyp:run_vm_tests',
         'runtime/dart-runtime.gyp:process_test',
         'packages',
diff --git a/pkg/analysis_server/lib/plugin/analysis/analysis_domain.dart b/pkg/analysis_server/lib/plugin/analysis/analysis_domain.dart
index 821a81e..5040087 100644
--- a/pkg/analysis_server/lib/plugin/analysis/analysis_domain.dart
+++ b/pkg/analysis_server/lib/plugin/analysis/analysis_domain.dart
@@ -33,7 +33,7 @@
     show AnalysisService;
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisContext, ComputedResult;
+    show AnalysisContext, ResultChangedEvent;
 import 'package:analyzer/src/generated/source.dart' show Source;
 import 'package:analyzer/task/model.dart' show ResultDescriptor;
 import 'package:plugin/plugin.dart';
@@ -62,14 +62,14 @@
 abstract class AnalysisDomain {
   /**
    * Return the stream that is notified when a new value for the given
-   * [result] is computed.
+   * [result] is computed or invalidated.
    *
    * This method should be used by plugins that need to perform some additional
    * processing after analysis has completed. One example would be a plugin that
    * needed to send a notification to the client because some data was now
    * invalidated.
    */
-  Stream<ComputedResult> onResultComputed(ResultDescriptor result);
+  Stream<ResultChangedEvent> onResultChanged(ResultDescriptor result);
 
   /**
    * Schedule sending the given [service] notifications for the given [source]
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 887c34b..cc068b3 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -20,6 +20,7 @@
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index2/index2.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -106,6 +107,11 @@
   final Index index;
 
   /**
+   * The [Index2] for this server, may be `null` if indexing is disabled.
+   */
+  final Index2 index2;
+
+  /**
    * The [SearchEngine] for this server, may be `null` if indexing is disabled.
    */
   final SearchEngine searchEngine;
@@ -305,6 +311,7 @@
       this.resourceProvider,
       PubPackageMapProvider packageMapProvider,
       Index _index,
+      Index2 _index2,
       this.serverPlugin,
       this.options,
       this.defaultSdkCreator,
@@ -313,6 +320,7 @@
       EmbeddedResolverProvider embeddedResolverProvider: null,
       this.rethrowExceptions: true})
       : index = _index,
+        index2 = _index2,
         searchEngine = _index != null ? createSearchEngine(_index) : null {
     _performance = performanceDuringStartup;
     defaultContextOptions.incremental = true;
@@ -1270,6 +1278,14 @@
         // Protocol parsing should have ensured that we never get here.
         throw new AnalysisException('Illegal change type');
       }
+
+      AnalysisContext containingContext = getContainingContext(file);
+
+      // Check for an implicitly added but missing source.
+      // (For example, the target of an import might not exist yet.)
+      // We need to do this before setContents, which changes the stamp.
+      bool wasMissing = containingContext?.getModificationStamp(source) == -1;
+
       overlayState.setContents(source, newContents);
       // If the source does not exist, then it was an overlay-only one.
       // Remove it from contexts.
@@ -1289,6 +1305,11 @@
         List<Source> sources = context.getSourcesWithFullName(file);
         sources.forEach((Source source) {
           anyContextUpdated = true;
+          if (context == containingContext && wasMissing) {
+            // Promote missing source to an explicitly added Source.
+            context.applyChanges(new ChangeSet()..addedSource(source));
+            schedulePerformAnalysisOperation(context);
+          }
           if (context.handleContentsChanged(
               source, oldContents, newContents, true)) {
             schedulePerformAnalysisOperation(context);
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 7bfb354..df31682 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -362,9 +362,9 @@
 class AnalysisDomainImpl implements AnalysisDomain {
   final AnalysisServer server;
 
-  final Map<ResultDescriptor, StreamController<engine.ComputedResult>>
+  final Map<ResultDescriptor, StreamController<engine.ResultChangedEvent>>
       controllers =
-      <ResultDescriptor, StreamController<engine.ComputedResult>>{};
+      <ResultDescriptor, StreamController<engine.ResultChangedEvent>>{};
 
   AnalysisDomainImpl(this.server) {
     server.onContextsChanged.listen((ContextsChangedEvent event) {
@@ -373,11 +373,12 @@
   }
 
   @override
-  Stream<engine.ComputedResult> onResultComputed(ResultDescriptor descriptor) {
-    Stream<engine.ComputedResult> stream = controllers
-        .putIfAbsent(descriptor,
-            () => new StreamController<engine.ComputedResult>.broadcast())
-        .stream;
+  Stream<engine.ResultChangedEvent> onResultChanged(
+      ResultDescriptor descriptor) {
+    Stream<engine.ResultChangedEvent> stream =
+        controllers.putIfAbsent(descriptor, () {
+      return new StreamController<engine.ResultChangedEvent>.broadcast();
+    }).stream;
     server.analysisContexts.forEach(_subscribeForContext);
     return stream;
   }
@@ -398,8 +399,8 @@
 
   void _subscribeForContext(engine.AnalysisContext context) {
     for (ResultDescriptor descriptor in controllers.keys) {
-      context.onResultComputed(descriptor).listen((result) {
-        StreamController<engine.ComputedResult> controller =
+      context.onResultChanged(descriptor).listen((result) {
+        StreamController<engine.ResultChangedEvent> controller =
             controllers[result.descriptor];
         if (controller != null) {
           controller.add(result);
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 3b2c724..b3623b0 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -459,6 +459,7 @@
         Index index = server.index;
         AnalysisContext context = unit.element.context;
         index.index(context, unit);
+        server.index2?.indexUnit(unit);
       } catch (exception, stackTrace) {
         server.sendServerErrorNotification(
             'Failed to index: $file', exception, stackTrace);
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_plugin.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_plugin.dart
index f1a8a05..d5b4916 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_plugin.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_plugin.dart
@@ -57,7 +57,7 @@
   /**
    * Return a list containing all of the Dart specific completion contributors.
    */
-  Iterable<DartCompletionContributorFactory> get contributors =>
+  Iterable<DartCompletionContributor> get contributors =>
       _contributorExtensionPoint.extensions
           .map((DartCompletionContributorFactory factory) => factory());
 
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index 112db5d..0608764 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -91,8 +91,14 @@
   SearchResult _newDeclarationResult(Element refElement) {
     int nameOffset = refElement.nameOffset;
     int nameLength = refElement.nameLength;
-    SearchMatch searchMatch = new SearchMatch(MatchKind.DECLARATION, refElement,
-        new SourceRange(nameOffset, nameLength), true, false);
+    SearchMatch searchMatch = new SearchMatch(
+        refElement.context,
+        refElement.library.source.uri.toString(),
+        refElement.source.uri.toString(),
+        MatchKind.DECLARATION,
+        new SourceRange(nameOffset, nameLength),
+        true,
+        false);
     return newSearchResult_fromMatch(searchMatch);
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index dc66c45..3fdd5f9 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -700,10 +700,14 @@
       return;
     }
     ClassElement targetElement = constructorElement.enclosingElement;
-    String targetFile = targetElement.source.fullName;
-    ClassDeclaration targetClass = getParsedClassElementNode(targetElement);
+    // prepare location for a new constructor
+    AstNode targetTypeNode = getParsedClassElementNode(targetElement);
+    if (targetTypeNode is! ClassDeclaration) {
+      return;
+    }
     _ConstructorLocation targetLocation =
-        _prepareNewConstructorLocation(targetClass);
+        _prepareNewConstructorLocation(targetTypeNode);
+    String targetFile = targetElement.source.fullName;
     // build method source
     SourceBuilder sb = new SourceBuilder(targetFile, targetLocation.offset);
     {
@@ -753,11 +757,15 @@
     if (targetType is! InterfaceType) {
       return;
     }
+    // prepare location for a new constructor
     ClassElement targetElement = targetType.element as ClassElement;
-    String targetFile = targetElement.source.fullName;
-    ClassDeclaration targetClass = getParsedClassElementNode(targetElement);
+    AstNode targetTypeNode = getParsedClassElementNode(targetElement);
+    if (targetTypeNode is! ClassDeclaration) {
+      return;
+    }
     _ConstructorLocation targetLocation =
-        _prepareNewConstructorLocation(targetClass);
+        _prepareNewConstructorLocation(targetTypeNode);
+    String targetFile = targetElement.source.fullName;
     // build method source
     SourceBuilder sb = new SourceBuilder(targetFile, targetLocation.offset);
     {
@@ -1990,13 +1998,17 @@
         }
         ClassElement targetClassElement = targetType.element as ClassElement;
         targetElement = targetClassElement;
-        // may be static
+        // prepare target ClassDeclaration
+        AstNode targetTypeNode = getParsedClassElementNode(targetClassElement);
+        if (targetTypeNode is! ClassDeclaration) {
+          return;
+        }
+        ClassDeclaration targetClassNode = targetTypeNode;
+        // maybe static
         if (target is Identifier) {
           staticModifier = target.bestElement.kind == ElementKind.CLASS;
         }
         // prepare insert offset
-        ClassDeclaration targetClassNode =
-            getParsedClassElementNode(targetClassElement);
         prefix = '  ';
         insertOffset = targetClassNode.end - 1;
         if (targetClassNode.members.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/services/index2/index2.dart b/pkg/analysis_server/lib/src/services/index2/index2.dart
new file mode 100644
index 0000000..a3da32b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/index2/index2.dart
@@ -0,0 +1,456 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary/index_unit.dart';
+import 'package:collection/collection.dart';
+
+/**
+ * Return a new [Index2] instance that keeps information in memory.
+ */
+Index2 createMemoryIndex2() {
+  _MemoryPackageIndexStore store = new _MemoryPackageIndexStore();
+  return new Index2(store);
+}
+
+/**
+ * Return the index of the first occurrence of the [value] in the [sortedList],
+ * or `-1` if the [value] is not in the list.
+ */
+int _findFirstOccurrence(List<int> sortedList, int value) {
+  // Find an occurrence.
+  int i = binarySearch(sortedList, value);
+  if (i == -1) {
+    return -1;
+  }
+  // Find the first occurrence.
+  while (i > 0 && sortedList[i - 1] == value) {
+    i--;
+  }
+  return i;
+}
+
+/**
+ * Interface for storing and requesting relations.
+ */
+class Index2 {
+  final PackageIndexStore _store;
+
+  Index2(this._store);
+
+  /**
+   * Complete with a list of locations where elements of the given [kind] with
+   * names satisfying the given [regExp] are defined.
+   */
+  Future<List<Location>> getDefinedNames(
+      RegExp regExp, IndexNameKind kind) async {
+    List<Location> locations = <Location>[];
+    Iterable<PackageIndexId> ids = await _store.getIds();
+    for (PackageIndexId id in ids) {
+      PackageIndex index = await _store.getIndex(id);
+      _PackageIndexRequester requester = new _PackageIndexRequester(index);
+      List<Location> packageLocations = requester.getDefinedNames(regExp, kind);
+      locations.addAll(packageLocations);
+    }
+    return locations;
+  }
+
+  /**
+   * Complete with a list of locations where the given [element] has relation
+   * of the given [kind].
+   */
+  Future<List<Location>> getRelations(
+      Element element, IndexRelationKind kind) async {
+    List<Location> locations = <Location>[];
+    Iterable<PackageIndexId> ids = await _store.getIds();
+    for (PackageIndexId id in ids) {
+      PackageIndex index = await _store.getIndex(id);
+      _PackageIndexRequester requester = new _PackageIndexRequester(index);
+      List<Location> packageLocations = requester.getRelations(element, kind);
+      locations.addAll(packageLocations);
+    }
+    return locations;
+  }
+
+  /**
+   * Complete with a list of locations where a class members with the given
+   * [name] is referenced with a qualifier, but is not resolved.
+   */
+  Future<List<Location>> getUnresolvedMemberReferences(String name) async {
+    List<Location> locations = <Location>[];
+    Iterable<PackageIndexId> ids = await _store.getIds();
+    for (PackageIndexId id in ids) {
+      PackageIndex index = await _store.getIndex(id);
+      _PackageIndexRequester requester = new _PackageIndexRequester(index);
+      List<Location> packageLocations =
+          requester.getUnresolvedMemberReferences(name);
+      locations.addAll(packageLocations);
+    }
+    return locations;
+  }
+
+  /**
+   * Index the given fully resolved [unit].
+   */
+  void indexUnit(CompilationUnit unit) {
+    PackageIndexAssembler assembler = new PackageIndexAssembler();
+    assembler.index(unit);
+    PackageIndexBuilder indexBuilder = assembler.assemble();
+    String unitLibraryUri = unit.element.library.source.uri.toString();
+    String unitUnitUri = unit.element.source.uri.toString();
+    _store.putIndex(unitLibraryUri, unitUnitUri, indexBuilder);
+  }
+}
+
+/**
+ * Information about location of a single relation in the index.
+ *
+ * The location is expressed as a library specific unit containing the index
+ * relation, offset within this [Source] and  length.
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class Location {
+  /**
+   * The URI of the source of the library containing this location.
+   */
+  final String libraryUri;
+
+  /**
+   * The URI of the source of the unit containing this location.
+   */
+  final String unitUri;
+
+  /**
+   * The offset of this location within the [unitUri].
+   */
+  final int offset;
+
+  /**
+   * The length of this location.
+   */
+  final int length;
+
+  /**
+   * Is `true` if this location is qualified.
+   */
+  final bool isQualified;
+
+  Location(this.libraryUri, this.unitUri, this.offset, this.length,
+      this.isQualified);
+
+  @override
+  String toString() => 'Location{librarySourceUri: $libraryUri, '
+      'unitSourceUri: $unitUri, offset: $offset, length: $length, '
+      'isQualified: $isQualified}';
+}
+
+/**
+ * Opaque identifier of a [PackageIndex].
+ */
+abstract class PackageIndexId {}
+
+/**
+ * Storage of [PackageIndex] objects.
+ */
+abstract class PackageIndexStore {
+  /**
+   * Complete with identifiers of all [PackageIndex] objects.
+   */
+  Future<Iterable<PackageIndexId>> getIds();
+
+  /**
+   * Complete with the [PackageIndex] with the given [id].
+   */
+  Future<PackageIndex> getIndex(PackageIndexId id);
+
+  /**
+   * Put the given [indexBuilder] into the store.
+   */
+  void putIndex(String unitLibraryUri, String unitUnitUri,
+      PackageIndexBuilder indexBuilder);
+}
+
+/**
+ * A [PackageIndexId] for [_MemoryPackageIndexStore].
+ */
+class _MemoryPackageIndexId implements PackageIndexId {
+  final String key;
+
+  _MemoryPackageIndexId(this.key);
+}
+
+/**
+ * A [PackageIndexStore] that keeps objects in memory;
+ */
+class _MemoryPackageIndexStore implements PackageIndexStore {
+  final Map<String, PackageIndex> indexMap = <String, PackageIndex>{};
+
+  @override
+  Future<Iterable<PackageIndexId>> getIds() async {
+    return indexMap.keys.map((key) => new _MemoryPackageIndexId(key));
+  }
+
+  @override
+  Future<PackageIndex> getIndex(PackageIndexId id) async {
+    return indexMap[(id as _MemoryPackageIndexId).key];
+  }
+
+  @override
+  putIndex(String unitLibraryUri, String unitUnitUri,
+      PackageIndexBuilder indexBuilder) {
+    List<int> indexBytes = indexBuilder.toBuffer();
+    PackageIndex index = new PackageIndex.fromBuffer(indexBytes);
+    String key = '$unitLibraryUri;$unitUnitUri';
+    indexMap[key] = index;
+  }
+}
+
+/**
+ * Helper for requesting information from a single [PackageIndex].
+ */
+class _PackageIndexRequester {
+  final PackageIndex index;
+
+  _PackageIndexRequester(this.index);
+
+  /**
+   * Return the [element]'s identifier in the [index] or `-1` if the
+   * [element] is not referenced in the [index].
+   */
+  int findElementId(Element element) {
+    // Find the id of the element's unit.
+    int unitId = getUnitId(element);
+    if (unitId == -1) {
+      return -1;
+    }
+    // Prepare the offset of the element.
+    int offset = element.nameOffset;
+    if (element is LibraryElement || element is CompilationUnitElement) {
+      offset = 0;
+    }
+    // Find the first occurrence of an element with the same offset.
+    int elementId = _findFirstOccurrence(index.elementOffsets, offset);
+    if (elementId == -1) {
+      return -1;
+    }
+    // Try to find the element id using offset, unit and kind.
+    IndexSyntheticElementKind kind =
+        PackageIndexAssembler.getIndexElementKind(element);
+    for (;
+        elementId < index.elementOffsets.length &&
+            index.elementOffsets[elementId] == offset;
+        elementId++) {
+      if (index.elementUnits[elementId] == unitId &&
+          index.elementKinds[elementId] == kind) {
+        return elementId;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * Complete with a list of locations where elements of the given [kind] with
+   * names satisfying the given [regExp] are defined.
+   */
+  List<Location> getDefinedNames(RegExp regExp, IndexNameKind kind) {
+    List<Location> locations = <Location>[];
+    for (UnitIndex unitIndex in index.units) {
+      _UnitIndexRequester requester = new _UnitIndexRequester(this, unitIndex);
+      List<Location> unitLocations = requester.getDefinedNames(regExp, kind);
+      locations.addAll(unitLocations);
+    }
+    return locations;
+  }
+
+  /**
+   * Complete with a list of locations where the given [element] has relation
+   * of the given [kind].
+   */
+  List<Location> getRelations(Element element, IndexRelationKind kind) {
+    int elementId = findElementId(element);
+    if (elementId == -1) {
+      return const <Location>[];
+    }
+    List<Location> locations = <Location>[];
+    for (UnitIndex unitIndex in index.units) {
+      _UnitIndexRequester requester = new _UnitIndexRequester(this, unitIndex);
+      List<Location> unitLocations = requester.getRelations(elementId, kind);
+      locations.addAll(unitLocations);
+    }
+    return locations;
+  }
+
+  /**
+   * Return the identifier of [str] in the [index] or `-1` if [str] is not used
+   * in the [index].
+   */
+  int getStringId(String str) {
+    return binarySearch(index.strings, str);
+  }
+
+  /**
+   * Return the identifier of the [CompilationUnitElement] containing the
+   * [element] in the [index] or `-1` if not found.
+   */
+  int getUnitId(Element element) {
+    CompilationUnitElement unitElement =
+        PackageIndexAssembler.getUnitElement(element);
+    int libraryUriId = getUriId(unitElement.library.source.uri);
+    if (libraryUriId == -1) {
+      return -1;
+    }
+    int unitUriId = getUriId(unitElement.source.uri);
+    if (unitUriId == -1) {
+      return -1;
+    }
+    for (int i = 0; i < index.unitLibraryUris.length; i++) {
+      if (index.unitLibraryUris[i] == libraryUriId &&
+          index.unitUnitUris[i] == unitUriId) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * Return the URI of the library source of the library specific [unit].
+   */
+  String getUnitLibraryUri(int unit) {
+    int id = index.unitLibraryUris[unit];
+    return index.strings[id];
+  }
+
+  /**
+   * Return the URI of the unit source of the library specific [unit].
+   */
+  String getUnitUnitUri(int unit) {
+    int id = index.unitUnitUris[unit];
+    return index.strings[id];
+  }
+
+  /**
+   * Complete with a list of locations where a class members with the given
+   * [name] is referenced with a qualifier, but is not resolved.
+   */
+  List<Location> getUnresolvedMemberReferences(String name) {
+    List<Location> locations = <Location>[];
+    for (UnitIndex unitIndex in index.units) {
+      _UnitIndexRequester requester = new _UnitIndexRequester(this, unitIndex);
+      List<Location> unitLocations =
+          requester.getUnresolvedMemberReferences(name);
+      locations.addAll(unitLocations);
+    }
+    return locations;
+  }
+
+  /**
+   * Return the identifier of the [uri] in the [index] or `-1` if the [uri] is
+   * not used in the [index].
+   */
+  int getUriId(Uri uri) {
+    String str = uri.toString();
+    return getStringId(str);
+  }
+}
+
+/**
+ * Helper for requesting information from a single [UnitIndex].
+ */
+class _UnitIndexRequester {
+  final _PackageIndexRequester packageRequester;
+  final UnitIndex unitIndex;
+
+  _UnitIndexRequester(this.packageRequester, this.unitIndex);
+
+  /**
+   * Complete with a list of locations where elements of the given [kind] with
+   * names satisfying the given [regExp] are defined.
+   */
+  List<Location> getDefinedNames(RegExp regExp, IndexNameKind kind) {
+    List<Location> locations = <Location>[];
+    String unitLibraryUri = null;
+    String unitUnitUri = null;
+    for (int i = 0; i < unitIndex.definedNames.length; i++) {
+      if (unitIndex.definedNameKinds[i] == kind) {
+        int nameIndex = unitIndex.definedNames[i];
+        String name = packageRequester.index.strings[nameIndex];
+        if (regExp.matchAsPrefix(name) != null) {
+          unitLibraryUri ??= packageRequester.getUnitLibraryUri(unitIndex.unit);
+          unitUnitUri ??= packageRequester.getUnitUnitUri(unitIndex.unit);
+          locations.add(new Location(unitLibraryUri, unitUnitUri,
+              unitIndex.definedNameOffsets[i], name.length, false));
+        }
+      }
+    }
+    return locations;
+  }
+
+  /**
+   * Return a list of locations where an element with the given [elementId] has
+   * relation of the given [kind].
+   */
+  List<Location> getRelations(int elementId, IndexRelationKind kind) {
+    // Find the first usage of the element.
+    int i = _findFirstOccurrence(unitIndex.usedElements, elementId);
+    if (i == -1) {
+      return const <Location>[];
+    }
+    // Create locations for every usage of the element.
+    List<Location> locations = <Location>[];
+    String unitLibraryUri = null;
+    String unitUnitUri = null;
+    for (;
+        i < unitIndex.usedElements.length &&
+            unitIndex.usedElements[i] == elementId;
+        i++) {
+      if (unitIndex.usedElementKinds[i] == kind) {
+        unitLibraryUri ??= packageRequester.getUnitLibraryUri(unitIndex.unit);
+        unitUnitUri ??= packageRequester.getUnitUnitUri(unitIndex.unit);
+        locations.add(new Location(
+            unitLibraryUri,
+            unitUnitUri,
+            unitIndex.usedElementOffsets[i],
+            unitIndex.usedElementLengths[i],
+            unitIndex.usedElementIsQualifiedFlags[i]));
+      }
+    }
+    return locations;
+  }
+
+  /**
+   * Complete with a list of locations where a class members with the given
+   * [name] is referenced with a qualifier, but is not resolved.
+   */
+  List<Location> getUnresolvedMemberReferences(String name) {
+    // Find the name ID in the package index.
+    int nameId = packageRequester.getStringId(name);
+    if (nameId == -1) {
+      return const <Location>[];
+    }
+    // Find the first usage of the name.
+    int i =_findFirstOccurrence(unitIndex.usedNames, nameId);
+    if (i == -1) {
+      return const <Location>[];
+    }
+    // Create locations for every usage of the name.
+    List<Location> locations = <Location>[];
+    String unitLibraryUri = null;
+    String unitUnitUri = null;
+    for (; i < unitIndex.usedNames.length &&
+        unitIndex.usedNames[i] == nameId; i++) {
+      unitLibraryUri ??= packageRequester.getUnitLibraryUri(unitIndex.unit);
+      unitUnitUri ??= packageRequester.getUnitUnitUri(unitIndex.unit);
+      locations.add(new Location(unitLibraryUri, unitUnitUri,
+          unitIndex.usedNameOffsets[i], name.length, true));
+    }
+    return locations;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/linter/linter.dart b/pkg/analysis_server/lib/src/services/linter/linter.dart
index 675836ce..964c238 100644
--- a/pkg/analysis_server/lib/src/services/linter/linter.dart
+++ b/pkg/analysis_server/lib/src/services/linter/linter.dart
@@ -40,9 +40,10 @@
       //TODO(pq): migrate this to a proper API once there is one.
       Iterable<String> registeredLints = ruleRegistry.map((r) => r.name);
       rules.nodes.forEach((YamlNode ruleNode) {
-        if (!registeredLints.contains(ruleNode.value)) {
+        Object value = ruleNode.value;
+        if (value != null && !registeredLints.contains(value)) {
           reporter.reportErrorForSpan(
-              UNDEFINED_LINT_WARNING, ruleNode.span, [ruleNode.value]);
+              UNDEFINED_LINT_WARNING, ruleNode.span, [value]);
         }
       });
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 1cb713a..b2223d0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -667,7 +667,7 @@
       variableType = _getTypeCode(_returnType);
       if (_hasAwait) {
         if (_returnType.element != futureType.element) {
-          returnType = _getTypeCode(futureType.substitute4([_returnType]));
+          returnType = _getTypeCode(futureType.instantiate([_returnType]));
         }
       } else {
         returnType = variableType;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
index f435ff9..17fdb68 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
@@ -12,9 +12,17 @@
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/generated/source.dart';
 
 /**
+ * Return a new [SourceReference] instance for the given [match].
+ */
+SourceReference getSourceReference(SearchMatch match) {
+  return new SourceReference(match);
+}
+
+/**
  * When a [Source] (a file) is used in more than one context, [SearchEngine]
  * will return separate [SearchMatch]s for each context. But in rename
  * refactorings we want to update each [Source] only once.
@@ -22,11 +30,7 @@
 List<SourceReference> getSourceReferences(List<SearchMatch> matches) {
   var uniqueReferences = new HashMap<SourceReference, SourceReference>();
   for (SearchMatch match in matches) {
-    Element element = match.element;
-    String file = element.source.fullName;
-    SourceRange range = match.sourceRange;
-    SourceReference newReference = new SourceReference(
-        file, range, element, match.isResolved, match.isQualified);
+    SourceReference newReference = getSourceReference(match);
     SourceReference oldReference = uniqueReferences[newReference];
     if (oldReference == null) {
       uniqueReferences[newReference] = newReference;
@@ -56,16 +60,22 @@
 
 /**
  * The [SourceRange] in some [Source].
+ *
+ * TODO(scheglov) inline this class as SearchMatch
  */
 class SourceReference {
-  final String file;
-  final SourceRange range;
-  final Element element;
-  final bool isResolved;
-  final bool isQualified;
+  final SearchMatch _match;
 
-  SourceReference(
-      this.file, this.range, this.element, this.isResolved, this.isQualified);
+  SourceReference(this._match);
+
+  AnalysisContext get context => _match.context;
+
+  Element get element => _match.element;
+
+  /**
+   * The full path of the file containing the match.
+   */
+  String get file => _match.file;
 
   @override
   int get hashCode {
@@ -74,6 +84,12 @@
     return hash;
   }
 
+  bool get isResolved => _match.isResolved;
+
+  SourceRange get range => _match.sourceRange;
+
+  Source get unitSource => _match.unitSource;
+
   @override
   bool operator ==(Object other) {
     if (identical(other, this)) {
@@ -90,7 +106,7 @@
    */
   void addEdit(SourceChange change, String newText, {String id}) {
     SourceEdit edit = createEdit(newText, id: id);
-    doSourceChange_addElementEdit(change, element, edit);
+    doSourceChange_addSourceEdit(change, context, unitSource, edit);
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index ec36d00..b6f54c1 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -98,7 +98,7 @@
     return false;
   }
   Source localSource = localElement.source;
-  Source referenceSource = reference.element.source;
+  Source referenceSource = reference.unitSource;
   SourceRange localRange = localElement.visibleRange;
   SourceRange referenceRange = reference.sourceRange;
   return referenceSource == localSource &&
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 6080479..06b88c0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -192,13 +192,27 @@
             newLocation_fromElement(elementClass));
       }
     }
-    // check shadowing in hierarchy
+    // usage of the renamed Element is shadowed by a local element
+    {
+      _MatchShadowedByLocal conflict = _getShadowingLocalElement();
+      if (conflict != null) {
+        LocalElement localElement = conflict.localElement;
+        result.addError(
+            format(
+                "Usage of renamed {0} will be shadowed by {1} '{2}'.",
+                elementKind.displayName,
+                getElementKindName(localElement),
+                localElement.displayName),
+            newLocation_fromMatch(conflict.match));
+      }
+    }
+    // check shadowing in the hierarchy
     List<SearchMatch> declarations =
-        await searchEngine.searchElementDeclarations(name);
+        await searchEngine.searchMemberDeclarations(name);
     for (SearchMatch declaration in declarations) {
       Element nameElement = getSyntheticAccessorVariable(declaration.element);
       Element nameClass = nameElement.enclosingElement;
-      // renamed Element shadows member of superclass
+      // the renamed Element shadows a member of a superclass
       if (superClasses.contains(nameClass)) {
         result.addError(
             format(
@@ -210,7 +224,7 @@
                 getElementQualifiedName(nameElement)),
             newLocation_fromElement(nameElement));
       }
-      // renamed Element is shadowed by member of subclass
+      // the renamed Element is shadowed by a member of a subclass
       if (isRename && subClasses.contains(nameClass)) {
         result.addError(
             format(
@@ -220,26 +234,6 @@
                 getElementQualifiedName(nameElement)),
             newLocation_fromElement(nameElement));
       }
-      // renamed Element is shadowed by local
-      if (nameElement is LocalElement) {
-        LocalElement localElement = nameElement;
-        ClassElement enclosingClass =
-            nameElement.getAncestor((element) => element is ClassElement);
-        if (enclosingClass == elementClass ||
-            subClasses.contains(enclosingClass)) {
-          for (SearchMatch reference in references) {
-            if (isReferenceInLocalRange(localElement, reference)) {
-              result.addError(
-                  format(
-                      "Usage of renamed {0} will be shadowed by {1} '{2}'.",
-                      elementKind.displayName,
-                      getElementKindName(localElement),
-                      localElement.displayName),
-                  newLocation_fromMatch(reference));
-            }
-          }
-        }
-      }
     }
     // visibility
     if (isRename) {
@@ -249,6 +243,31 @@
     return result;
   }
 
+  _MatchShadowedByLocal _getShadowingLocalElement() {
+    for (SearchMatch match in references) {
+      // qualified reference cannot be shadowed by a local element
+      if (match.isQualified) {
+        continue;
+      }
+      // check local elements of the enclosing executable
+      Element containingElement = match.element;
+      if (containingElement is ExecutableElement) {
+        Iterable<LocalElement> localElements = <Iterable<LocalElement>>[
+          containingElement.functions,
+          containingElement.localVariables,
+          containingElement.parameters
+        ].expand((Iterable<LocalElement> x) => x);
+        for (LocalElement localElement in localElements) {
+          if (localElement.displayName == name &&
+              localElement.visibleRange.intersects(match.sourceRange)) {
+            return new _MatchShadowedByLocal(match, localElement);
+          }
+        }
+      }
+    }
+    return null;
+  }
+
   /**
    * Fills [elements] with [Element]s to rename.
    */
@@ -293,3 +312,10 @@
     }
   }
 }
+
+class _MatchShadowedByLocal {
+  final SearchMatch match;
+  final LocalElement localElement;
+
+  _MatchShadowedByLocal(this.match, this.localElement);
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index 460896e..23e0342 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -86,7 +86,13 @@
     } else {
       sourceRange = rangeStartLength(element.nameEnd, 0);
     }
-    String file = element.source.fullName;
-    return new SourceReference(file, sourceRange, element, true, true);
+    return new SourceReference(new SearchMatch(
+        element.context,
+        element.library.source.uri.toString(),
+        element.source.uri.toString(),
+        MatchKind.DECLARATION,
+        sourceRange,
+        true,
+        true));
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine.dart b/pkg/analysis_server/lib/src/services/search/search_engine.dart
index dbae817..217048c 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine.dart
@@ -9,6 +9,9 @@
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/visitor.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -75,13 +78,6 @@
   Future<List<SearchMatch>> searchAllSubtypes(ClassElement type);
 
   /**
-   * Returns declarations of elements with the given name.
-   *
-   * [name] - the name being declared by the found matches.
-   */
-  Future<List<SearchMatch>> searchElementDeclarations(String name);
-
-  /**
    * Returns declarations of class members with the given name.
    *
    * [name] - the name being declared by the found matches.
@@ -125,16 +121,26 @@
  */
 class SearchMatch {
   /**
+   * The [AnalysisContext] containing the match.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The URI of the source of the library containing the match.
+   */
+  final String libraryUri;
+
+  /**
+   * The URI of the source of the unit containing the match.
+   */
+  final String unitUri;
+
+  /**
    * The kind of the match.
    */
   final MatchKind kind;
 
   /**
-   * The element containing the source range that was matched.
-   */
-  final Element element;
-
-  /**
    * The source range that was matched.
    */
   final SourceRange sourceRange;
@@ -149,11 +155,61 @@
    */
   final bool isQualified;
 
-  SearchMatch(this.kind, this.element, this.sourceRange, this.isResolved,
-      this.isQualified);
+  Source _librarySource;
+  Source _unitSource;
+  LibraryElement _libraryElement;
+  Element _element;
+
+  SearchMatch(this.context, this.libraryUri, this.unitUri, this.kind,
+      this.sourceRange, this.isResolved, this.isQualified);
+
+  /**
+   * Return the [Element] containing the match.
+   */
+  Element get element {
+    if (_element == null) {
+      CompilationUnitElement unitElement =
+          context.getCompilationUnitElement(unitSource, librarySource);
+      _ContainingElementFinder finder =
+          new _ContainingElementFinder(sourceRange.offset);
+      unitElement.accept(finder);
+      _element = finder.containingElement;
+    }
+    return _element;
+  }
+
+  /**
+   * The absolute path of the file containing the match.
+   */
+  String get file => unitSource.fullName;
 
   @override
-  int get hashCode => JavaArrays.makeHashCode([element, sourceRange, kind]);
+  int get hashCode =>
+      JavaArrays.makeHashCode([libraryUri, unitUri, kind, sourceRange]);
+
+  /**
+   * Return the [LibraryElement] for the [libraryUri] in the [context].
+   */
+  LibraryElement get libraryElement {
+    _libraryElement ??= context.getLibraryElement(librarySource);
+    return _libraryElement;
+  }
+
+  /**
+   * The library [Source] of the reference.
+   */
+  Source get librarySource {
+    _librarySource ??= context.sourceFactory.forUri(libraryUri);
+    return _librarySource;
+  }
+
+  /**
+   * The unit [Source] of the reference.
+   */
+  Source get unitSource {
+    _unitSource ??= context.sourceFactory.forUri(unitUri);
+    return _unitSource;
+  }
 
   @override
   bool operator ==(Object object) {
@@ -162,10 +218,11 @@
     }
     if (object is SearchMatch) {
       return kind == object.kind &&
+          libraryUri == object.libraryUri &&
+          unitUri == object.unitUri &&
           isResolved == object.isResolved &&
           isQualified == object.isQualified &&
-          sourceRange == object.sourceRange &&
-          element == object.element;
+          sourceRange == object.sourceRange;
     }
     return false;
   }
@@ -175,8 +232,10 @@
     StringBuffer buffer = new StringBuffer();
     buffer.write("SearchMatch(kind=");
     buffer.write(kind);
-    buffer.write(", element=");
-    buffer.write(element.displayName);
+    buffer.write(", libraryUri=");
+    buffer.write(libraryUri);
+    buffer.write(", unitUri=");
+    buffer.write(unitUri);
     buffer.write(", range=");
     buffer.write(sourceRange);
     buffer.write(", isResolved=");
@@ -187,3 +246,24 @@
     return buffer.toString();
   }
 }
+
+/**
+ * A visitor that finds the deep-most [Element] that contains the [offset].
+ */
+class _ContainingElementFinder extends GeneralizingElementVisitor {
+  final int offset;
+  Element containingElement;
+
+  _ContainingElementFinder(this.offset);
+
+  visitElement(Element element) {
+    if (element is ElementImpl) {
+      if (element.codeOffset != null &&
+          element.codeOffset <= offset &&
+          offset <= element.codeOffset + element.codeLength) {
+        containingElement = element;
+        super.visitElement(element);
+      }
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 12681f7..7718339 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -32,21 +32,18 @@
   }
 
   @override
-  Future<List<SearchMatch>> searchElementDeclarations(String name) {
-    IndexableName indexableName = new IndexableName(name);
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(indexableName, IndexConstants.NAME_IS_DEFINED_BY,
-        MatchKind.DECLARATION);
-    return requestor.merge();
-  }
-
-  @override
-  Future<List<SearchMatch>> searchMemberDeclarations(String name) {
-    return searchElementDeclarations(name).then((matches) {
-      return matches.where((match) {
-        return match.element.enclosingElement is ClassElement;
-      }).toList();
-    });
+  Future<List<SearchMatch>> searchMemberDeclarations(String name) async {
+    List<SearchMatch> matches;
+    {
+      IndexableName indexableName = new IndexableName(name);
+      _Requestor requestor = new _Requestor(_index);
+      requestor.add(indexableName, IndexConstants.NAME_IS_DEFINED_BY,
+          MatchKind.DECLARATION);
+      matches = await requestor.merge();
+    }
+    return matches.where((match) {
+      return match.element.enclosingElement is ClassElement;
+    }).toList();
   }
 
   @override
@@ -119,8 +116,14 @@
         _index.getTopLevelDeclarations((String name) => regExp.hasMatch(name));
     List<SearchMatch> matches = <SearchMatch>[];
     for (Element element in elements) {
-      matches.add(new SearchMatch(MatchKind.DECLARATION, element,
-          rangeElementName(element), true, false));
+      matches.add(new SearchMatch(
+          element.context,
+          element.library.source.uri.toString(),
+          element.source.uri.toString(),
+          MatchKind.DECLARATION,
+          rangeElementName(element),
+          true,
+          false));
     }
     return new Future.value(matches);
   }
@@ -230,9 +233,12 @@
       for (LocationImpl location in locations) {
         IndexableObject indexable = location.indexable;
         if (indexable is IndexableElement) {
+          Element element = indexable.element;
           matches.add(new SearchMatch(
+              element.context,
+              element.library.source.uri.toString(),
+              element.source.uri.toString(),
               kind,
-              indexable.element,
               new SourceRange(location.offset, location.length),
               location.isResolved,
               location.isQualified));
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal2.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal2.dart
new file mode 100644
index 0000000..2bb0d33
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal2.dart
@@ -0,0 +1,370 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.search.search_engine2;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/index2/index2.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
+import 'package:analyzer/src/generated/resolver.dart' show NamespaceBuilder;
+import 'package:analyzer/src/generated/source.dart' show Source, SourceRange;
+import 'package:analyzer/src/summary/idl.dart';
+
+/**
+ * A [SearchEngine] implementation.
+ */
+class SearchEngineImpl2 implements SearchEngine {
+  final AnalysisContext context;
+  final Index2 _index;
+
+  SearchEngineImpl2(this.context, this._index);
+
+  @override
+  Future<List<SearchMatch>> searchAllSubtypes(ClassElement type) async {
+    List<SearchMatch> matches = <SearchMatch>[];
+    await _addMatches(
+        matches, type, IndexRelationKind.IS_ANCESTOR_OF, MatchKind.DECLARATION);
+    return matches;
+  }
+
+  @override
+  Future<List<SearchMatch>> searchMemberDeclarations(String pattern) {
+    return _searchDefinedNames(pattern, IndexNameKind.classMember);
+  }
+
+  @override
+  Future<List<SearchMatch>> searchMemberReferences(String name) async {
+    List<Location> locations = await _index.getUnresolvedMemberReferences(name);
+    return locations.map((location) {
+      return _newMatchForLocation(location, MatchKind.REFERENCE);
+    }).toList();
+  }
+
+  @override
+  Future<List<SearchMatch>> searchReferences(Element element) {
+    ElementKind kind = element.kind;
+    if (kind == ElementKind.CLASS ||
+        kind == ElementKind.COMPILATION_UNIT ||
+        kind == ElementKind.CONSTRUCTOR ||
+        kind == ElementKind.FUNCTION_TYPE_ALIAS ||
+        kind == ElementKind.GETTER ||
+        kind == ElementKind.SETTER) {
+      return _searchReferences(element);
+    } else if (kind == ElementKind.FIELD ||
+        kind == ElementKind.TOP_LEVEL_VARIABLE) {
+      return _searchReferences_Field(element);
+    } else if (kind == ElementKind.FUNCTION || kind == ElementKind.METHOD) {
+      if (element.enclosingElement is ExecutableElement) {
+        return _searchReferences_Local(element, (n) => n is Block);
+      }
+      return _searchReferences_Function(element);
+    } else if (kind == ElementKind.IMPORT) {
+      return _searchReferences_Import(element);
+    } else if (kind == ElementKind.LABEL ||
+        kind == ElementKind.LOCAL_VARIABLE) {
+      return _searchReferences_Local(element, (n) => n is Block);
+    } else if (kind == ElementKind.LIBRARY) {
+      return _searchReferences_Library(element);
+    } else if (kind == ElementKind.PARAMETER) {
+      return _searchReferences_Parameter(element);
+    } else if (kind == ElementKind.PREFIX) {
+      return _searchReferences_Prefix(element);
+    } else if (kind == ElementKind.TYPE_PARAMETER) {
+      return _searchReferences_Local(element, (n) => n is ClassDeclaration);
+    }
+    return new Future.value(<SearchMatch>[]);
+  }
+
+  @override
+  Future<List<SearchMatch>> searchSubtypes(ClassElement type) async {
+    List<SearchMatch> matches = <SearchMatch>[];
+    await _addMatches(
+        matches, type, IndexRelationKind.IS_EXTENDED_BY, MatchKind.REFERENCE);
+    await _addMatches(
+        matches, type, IndexRelationKind.IS_MIXED_IN_BY, MatchKind.REFERENCE);
+    await _addMatches(matches, type, IndexRelationKind.IS_IMPLEMENTED_BY,
+        MatchKind.REFERENCE);
+    return matches;
+  }
+
+  @override
+  Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern) {
+    return _searchDefinedNames(pattern, IndexNameKind.topLevel);
+  }
+
+  _addMatches(List<SearchMatch> matches, Element element,
+      IndexRelationKind relationKind, MatchKind kind) async {
+    List<Location> locations = await _index.getRelations(element, relationKind);
+    for (Location location in locations) {
+      SearchMatch match = _newMatchForLocation(location, kind);
+      matches.add(match);
+    }
+  }
+
+  SearchMatch _newMatchForLocation(Location location, MatchKind kind) =>
+      new SearchMatch(
+          context,
+          location.libraryUri,
+          location.unitUri,
+          kind,
+          new SourceRange(location.offset, location.length),
+          true,
+          location.isQualified);
+
+  Future<List<SearchMatch>> _searchDefinedNames(
+      String pattern, IndexNameKind nameKind) async {
+    RegExp regExp = new RegExp(pattern);
+    List<Location> locations = await _index.getDefinedNames(regExp, nameKind);
+    return locations.map((location) {
+      return _newMatchForLocation(location, MatchKind.DECLARATION);
+    }).toList();
+  }
+
+  Future<List<SearchMatch>> _searchReferences(Element element) async {
+    List<SearchMatch> matches = <SearchMatch>[];
+    await _addMatches(matches, element, IndexRelationKind.IS_REFERENCED_BY,
+        MatchKind.REFERENCE);
+    return matches;
+  }
+
+  Future<List<SearchMatch>> _searchReferences_Field(
+      PropertyInducingElement field) async {
+    List<SearchMatch> matches = <SearchMatch>[];
+    PropertyAccessorElement getter = field.getter;
+    PropertyAccessorElement setter = field.setter;
+    // field itself
+    await _addMatches(matches, field, IndexRelationKind.IS_REFERENCED_BY,
+        MatchKind.REFERENCE);
+    // getter
+    if (getter != null) {
+      await _addMatches(
+          matches, getter, IndexRelationKind.IS_REFERENCED_BY, MatchKind.READ);
+      await _addMatches(matches, getter, IndexRelationKind.IS_INVOKED_BY,
+          MatchKind.INVOCATION);
+    }
+    // setter
+    if (setter != null) {
+      await _addMatches(
+          matches, setter, IndexRelationKind.IS_REFERENCED_BY, MatchKind.WRITE);
+    }
+    // done
+    return matches;
+  }
+
+  Future<List<SearchMatch>> _searchReferences_Function(Element element) async {
+    if (element is Member) {
+      element = (element as Member).baseElement;
+    }
+    List<SearchMatch> matches = <SearchMatch>[];
+    await _addMatches(matches, element, IndexRelationKind.IS_REFERENCED_BY,
+        MatchKind.REFERENCE);
+    await _addMatches(matches, element, IndexRelationKind.IS_INVOKED_BY,
+        MatchKind.INVOCATION);
+    return matches;
+  }
+
+  Future<List<SearchMatch>> _searchReferences_Import(
+      ImportElement element) async {
+    List<SearchMatch> matches = <SearchMatch>[];
+    LibraryElement libraryElement = element.library;
+    Source librarySource = libraryElement.source;
+    for (CompilationUnitElement unitElement in libraryElement.units) {
+      Source unitSource = unitElement.source;
+      CompilationUnit unit =
+          context.resolveCompilationUnit2(unitSource, librarySource);
+      _ImportElementReferencesVisitor visitor =
+          new _ImportElementReferencesVisitor(
+              element, unitSource.uri.toString());
+      unit.accept(visitor);
+      matches.addAll(visitor.matches);
+    }
+    return matches;
+  }
+
+  Future<List<SearchMatch>> _searchReferences_Library(Element element) async {
+    List<SearchMatch> matches = <SearchMatch>[];
+    LibraryElement libraryElement = element.library;
+    Source librarySource = libraryElement.source;
+    for (CompilationUnitElement unitElement in libraryElement.parts) {
+      Source unitSource = unitElement.source;
+      CompilationUnit unit =
+          context.resolveCompilationUnit2(unitSource, librarySource);
+      for (Directive directive in unit.directives) {
+        if (directive is PartOfDirective &&
+            directive.element == libraryElement) {
+          matches.add(new SearchMatch(
+              context,
+              librarySource.uri.toString(),
+              unitSource.uri.toString(),
+              MatchKind.REFERENCE,
+              rangeNode(directive.libraryName),
+              true,
+              false));
+        }
+      }
+    }
+    return matches;
+  }
+
+  Future<List<SearchMatch>> _searchReferences_Local(
+      Element element, bool isRootNode(AstNode n)) async {
+    _LocalReferencesVisitor visitor = new _LocalReferencesVisitor(element);
+    AstNode node = element.computeNode();
+    AstNode enclosingNode = node?.getAncestor(isRootNode);
+    enclosingNode?.accept(visitor);
+    return visitor.matches;
+  }
+
+  Future<List<SearchMatch>> _searchReferences_Parameter(
+      ParameterElement parameter) async {
+    List<SearchMatch> matches = <SearchMatch>[];
+    matches.addAll(await _searchReferences(parameter));
+    matches.addAll(await _searchReferences_Local(
+        parameter, (n) => n is MethodDeclaration || n is FunctionExpression));
+    return matches;
+  }
+
+  Future<List<SearchMatch>> _searchReferences_Prefix(
+      PrefixElement element) async {
+    List<SearchMatch> matches = <SearchMatch>[];
+    LibraryElement libraryElement = element.library;
+    Source librarySource = libraryElement.source;
+    for (CompilationUnitElement unitElement in libraryElement.units) {
+      Source unitSource = unitElement.source;
+      CompilationUnit unit =
+          context.resolveCompilationUnit2(unitSource, librarySource);
+      _LocalReferencesVisitor visitor =
+          new _LocalReferencesVisitor(element, unitSource.uri.toString());
+      unit.accept(visitor);
+      matches.addAll(visitor.matches);
+    }
+    return matches;
+  }
+}
+
+/**
+ * Visitor that adds [SearchMatch]es for [importElement], both with an explicit
+ * prefix or an implicit one.
+ */
+class _ImportElementReferencesVisitor extends RecursiveAstVisitor {
+  final List<SearchMatch> matches = <SearchMatch>[];
+
+  final ImportElement importElement;
+  final AnalysisContext context;
+  final String libraryUri;
+  final String unitUri;
+  Set<Element> importedElements;
+
+  _ImportElementReferencesVisitor(ImportElement element, this.unitUri)
+      : importElement = element,
+        context = element.context,
+        libraryUri = element.library.source.uri.toString() {
+    importedElements = new NamespaceBuilder()
+        .createImportNamespaceForDirective(element)
+        .definedNames
+        .values
+        .toSet();
+  }
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      return;
+    }
+    if (importElement.prefix != null) {
+      if (node.staticElement == importElement.prefix) {
+        AstNode parent = node.parent;
+        if (parent is PrefixedIdentifier && parent.prefix == node) {
+          if (importedElements.contains(parent.staticElement)) {
+            _addMatchForPrefix(node, parent.identifier);
+          }
+        }
+        if (parent is MethodInvocation && parent.target == node) {
+          if (importedElements.contains(parent.methodName.staticElement)) {
+            _addMatchForPrefix(node, parent.methodName);
+          }
+        }
+      }
+    } else {
+      if (importedElements.contains(node.staticElement)) {
+        SourceRange range = rangeStartLength(node, 0);
+        _addMatchForRange(range);
+      }
+    }
+  }
+
+  void _addMatchForPrefix(SimpleIdentifier prefixNode, AstNode nextNode) {
+    SourceRange range = rangeStartStart(prefixNode, nextNode);
+    _addMatchForRange(range);
+  }
+
+  void _addMatchForRange(SourceRange range) {
+    matches.add(new SearchMatch(
+        context, libraryUri, unitUri, MatchKind.REFERENCE, range, true, false));
+  }
+}
+
+/**
+ * Visitor that adds [SearchMatch]es for local elements of a block, method,
+ * class or a library - labels, local functions, local variables and parameters,
+ * type parameters, import prefixes.
+ */
+class _LocalReferencesVisitor extends RecursiveAstVisitor {
+  final List<SearchMatch> matches = <SearchMatch>[];
+
+  final Element element;
+  final AnalysisContext context;
+  final String libraryUri;
+  final String unitUri;
+
+  _LocalReferencesVisitor(Element element, [String unitUri])
+      : element = element,
+        context = element.context,
+        libraryUri = element.library.source.uri.toString(),
+        unitUri = unitUri ?? element.source.uri.toString();
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      return;
+    }
+    if (node.bestElement == element) {
+      AstNode parent = node.parent;
+      MatchKind kind = MatchKind.REFERENCE;
+      if (element is FunctionElement) {
+        if (parent is MethodInvocation && parent.methodName == node) {
+          kind = MatchKind.INVOCATION;
+        }
+      } else if (element is VariableElement) {
+        bool isGet = node.inGetterContext();
+        bool isSet = node.inSetterContext();
+        if (isGet && isSet) {
+          kind = MatchKind.READ_WRITE;
+        } else if (isGet) {
+          if (parent is MethodInvocation && parent.methodName == node) {
+            kind = MatchKind.INVOCATION;
+          } else {
+            kind = MatchKind.READ;
+          }
+        } else if (isSet) {
+          kind = MatchKind.WRITE;
+        }
+      }
+      _addMatch(node, kind);
+    }
+  }
+
+  void _addMatch(AstNode node, MatchKind kind) {
+    bool isQualified = node is SimpleIdentifier && node.isQualified;
+    matches.add(new SearchMatch(context, libraryUri, unitUri, kind,
+        rangeNode(node), true, isQualified));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index ad1baaa..9c0a809 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/index/local_file_index.dart';
+import 'package:analysis_server/src/services/index2/index2.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/plugin/embedded_resolver_provider.dart';
@@ -92,11 +93,14 @@
       index.run();
     }
 
+    Index2 index2 = createMemoryIndex2();
+
     analysisServer = new AnalysisServer(
         serverChannel,
         resourceProvider,
         new PubPackageMapProvider(resourceProvider, defaultSdk),
         index,
+        index2,
         serverPlugin,
         analysisServerOptions,
         defaultSdkCreator,
diff --git a/pkg/analysis_server/test/analysis/update_content_test.dart b/pkg/analysis_server/test/analysis/update_content_test.dart
index 3e09632..7ca1fba 100644
--- a/pkg/analysis_server/test/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/analysis/update_content_test.dart
@@ -42,7 +42,8 @@
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_ERRORS) {
       var decoded = new AnalysisErrorsParams.fromNotification(notification);
-      filesErrors[decoded.file] = decoded.errors;
+      _format(AnalysisError e) => "${e.location.startLine}: ${e.message}";
+      filesErrors[decoded.file] = decoded.errors.map(_format).toList();
     }
     if (notification.event == ANALYSIS_NAVIGATION) {
       navigationCount++;
@@ -188,6 +189,29 @@
     expect(_getUserSources(context2), isEmpty);
   }
 
+  test_overlay_addPreviouslyImported() async {
+    Folder project = resourceProvider.newFolder('/project');
+    handleSuccessfulRequest(
+        new AnalysisSetAnalysisRootsParams([project.path], []).toRequest('0'));
+
+    server.updateContent('1',
+        {'/project/main.dart': new AddContentOverlay('import "target.dart";')});
+    await server.onAnalysisComplete;
+    expect(filesErrors, {
+      '/project/main.dart': ["1: Target of URI does not exist: 'target.dart'"],
+      '/project/target.dart': []
+    });
+
+    server.updateContent('1',
+        {'/project/target.dart': new AddContentOverlay('import "none.dart";')});
+    await server.onAnalysisComplete;
+    expect(filesErrors, {
+      '/project/main.dart': ["1: Unused import"],
+      '/project/target.dart': ["1: Target of URI does not exist: 'none.dart'"],
+      '/project/none.dart': []
+    });
+  }
+
   test_removeOverlay_incrementalChange() async {
     createProject();
     addTestFile('main() { print(1); }');
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 3541d91..8286482 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_plugin.dart';
 import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index2/index2.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -124,6 +125,7 @@
         resourceProvider,
         packageMapProvider,
         index,
+        createMemoryIndex2(),
         serverPlugin,
         new AnalysisServerOptions(),
         () => new MockSdk(),
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 85a6bbc..6710d43 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -142,6 +142,7 @@
         resourceProvider,
         packageMapProvider,
         null,
+        null,
         plugin,
         new AnalysisServerOptions(),
         () => new MockSdk(),
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 1472027..17bfcab 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -392,6 +392,7 @@
   language:
     enableGenericMethods: true
     enableAsync: false
+    enableConditionalDirectives: true
   errors:
     unused_local_variable: false
 linter:
@@ -417,6 +418,8 @@
     expect(context.analysisOptions.enableAsync, isFalse);
     // * from `.analysis_options`:
     expect(context.analysisOptions.enableGenericMethods, isTrue);
+    expect(context.analysisOptions.enableConditionalDirectives, isTrue);
+
     // * verify tests are excluded
     expect(
         callbacks.currentContextFilePaths[projPath].keys,
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index f8c0afd..3566385 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -45,6 +45,7 @@
         resourceProvider,
         new MockPackageMapProvider(),
         null,
+        null,
         serverPlugin,
         new AnalysisServerOptions(),
         () => new MockSdk(),
@@ -472,6 +473,7 @@
         resourceProvider,
         new MockPackageMapProvider(),
         null,
+        null,
         serverPlugin,
         new AnalysisServerOptions(),
         () => new MockSdk(),
diff --git a/pkg/analysis_server/test/domain_diagnostic_test.dart b/pkg/analysis_server/test/domain_diagnostic_test.dart
index 277279a..543aba6 100644
--- a/pkg/analysis_server/test/domain_diagnostic_test.dart
+++ b/pkg/analysis_server/test/domain_diagnostic_test.dart
@@ -51,6 +51,7 @@
         resourceProvider,
         new MockPackageMapProvider(),
         null,
+        null,
         serverPlugin,
         new AnalysisServerOptions(),
         () => new MockSdk(),
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index e6d1dfb..6c1882f 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -46,6 +46,7 @@
           provider,
           new MockPackageMapProvider(),
           null,
+          null,
           serverPlugin,
           new AnalysisServerOptions(),
           () => new MockSdk(),
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 6dc24d1..81ab9ef 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -35,6 +35,7 @@
         resourceProvider,
         new MockPackageMapProvider(),
         null,
+        null,
         serverPlugin,
         new AnalysisServerOptions(),
         () => new MockSdk(),
diff --git a/pkg/analysis_server/test/plugin/set_analysis_domain_test.dart b/pkg/analysis_server/test/plugin/set_analysis_domain_test.dart
index a92c943..36e1522 100644
--- a/pkg/analysis_server/test/plugin/set_analysis_domain_test.dart
+++ b/pkg/analysis_server/test/plugin/set_analysis_domain_test.dart
@@ -149,7 +149,7 @@
   }
 
   void _setAnalysisDomain(AnalysisDomain domain) {
-    domain.onResultComputed(PARSED_UNIT).listen((result) {
+    domain.onResultChanged(PARSED_UNIT).listen((result) {
       expect(result.context, isNotNull);
       expect(result.target, isNotNull);
       expect(result.value, isNotNull);
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index da08e99..853a448 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -4341,6 +4341,16 @@
     await assertNoFix(DartFixKind.CREATE_METHOD);
   }
 
+  test_undefinedMethod_create_BAD_targetIsEnum() async {
+    resolveTestUnit('''
+enum MyEnum {A, B}
+main() {
+  MyEnum.foo();
+}
+''');
+    await assertNoFix(DartFixKind.CREATE_METHOD);
+  }
+
   test_undefinedMethod_create_generic_BAD_argumentType() async {
     resolveTestUnit('''
 class A<T> {
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
index 555b5824..fe0aae6 100644
--- a/pkg/analysis_server/test/services/correction/status_test.dart
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -41,7 +41,14 @@
     resolveTestUnit('class MyClass {}');
     Element element = findElement('MyClass');
     SourceRange range = rangeElementName(element);
-    SearchMatch match = new SearchMatch(null, element, range, true, false);
+    SearchMatch match = new SearchMatch(
+        context,
+        element.library.source.uri.toString(),
+        element.source.uri.toString(),
+        null,
+        range,
+        true,
+        false);
     // check
     Location location = newLocation_fromMatch(match);
     expect(location.file, '/test.dart');
diff --git a/pkg/analysis_server/test/services/index2/index2_test.dart b/pkg/analysis_server/test/services/index2/index2_test.dart
new file mode 100644
index 0000000..5a9abb0
--- /dev/null
+++ b/pkg/analysis_server/test/services/index2/index2_test.dart
@@ -0,0 +1,213 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/index2/index2.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../abstract_single_unit.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  defineReflectiveTests(Index2Test);
+}
+
+@reflectiveTest
+class Index2Test extends AbstractSingleUnitTest {
+  Index2 index = createMemoryIndex2();
+
+  /**
+   * Return the [Location] with given properties, or fail.
+   */
+  Location findLocation(List<Location> locations, String libraryUri,
+      String unitUri, int offset, int length) {
+    for (Location location in locations) {
+      if (location.libraryUri == libraryUri &&
+          location.unitUri == unitUri &&
+          location.offset == offset &&
+          location.length == length) {
+        return location;
+      }
+    }
+    fail('No at $offset with length $length in\n${locations.join('\n')}');
+    return null;
+  }
+
+  /**
+   * Return the [Location] with given properties, or fail.
+   */
+  Location findLocationSource(
+      List<Location> locations, Source source, String search,
+      {int length}) {
+    String code = source.contents.data;
+    int offset = code.indexOf(search);
+    expect(offset, isNonNegative, reason: 'Not found "$search" in\n$code');
+    length ??= getLeadingIdentifierLength(search);
+    String uri = source.uri.toString();
+    return findLocation(locations, uri, uri, offset, length);
+  }
+
+  /**
+   * Return the [Location] with given properties, or fail.
+   */
+  Location findLocationTest(List<Location> locations, String search,
+      {int length}) {
+    int offset = findOffset(search);
+    length ??= getLeadingIdentifierLength(search);
+    String testUri = testSource.uri.toString();
+    return findLocation(locations, testUri, testUri, offset, length);
+  }
+
+  void setUp() {
+    super.setUp();
+  }
+
+  void tearDown() {
+    super.tearDown();
+    index = null;
+  }
+
+  test_getDefinedNames_classMember() async {
+    _indexTestUnit('''
+class A {
+  test() {}
+}
+class B {
+  int test = 1;
+  main() {
+    int test = 2;
+  }
+}
+''');
+    ClassElement classA = findElement('A');
+    ClassElement classB = findElement('B');
+    List<Location> locations = await index.getDefinedNames(
+        new RegExp(r'^test$'), IndexNameKind.classMember);
+    expect(locations, hasLength(2));
+    _assertHasDefinedName(locations, classA.methods[0]);
+    _assertHasDefinedName(locations, classB.fields[0]);
+  }
+
+  test_getDefinedNames_topLevel() async {
+    _indexTestUnit('''
+class A {} // A
+class B = Object with A;
+typedef C();
+D() {}
+var E = null;
+class NoMatchABCDE {}
+''');
+    Element topA = findElement('A');
+    Element topB = findElement('B');
+    Element topC = findElement('C');
+    Element topD = findElement('D');
+    Element topE = findElement('E');
+    List<Location> locations = await index.getDefinedNames(
+        new RegExp(r'^[A-E]$'), IndexNameKind.topLevel);
+    expect(locations, hasLength(5));
+    _assertHasDefinedName(locations, topA);
+    _assertHasDefinedName(locations, topB);
+    _assertHasDefinedName(locations, topC);
+    _assertHasDefinedName(locations, topD);
+    _assertHasDefinedName(locations, topE);
+  }
+
+  test_getRelations_isExtendedBy() async {
+    _indexTestUnit(r'''
+class A {}
+class B extends A {} // B
+''');
+    Source source2 = _indexUnit(
+        '/test2.dart',
+        r'''
+import 'test.dart';
+class C extends A {} // C
+''');
+    ClassElement elementA = testUnitElement.getType('A');
+    List<Location> locations =
+        await index.getRelations(elementA, IndexRelationKind.IS_EXTENDED_BY);
+    findLocationTest(locations, 'A {} // B');
+    findLocationSource(locations, source2, 'A {} // C');
+  }
+
+  test_getRelations_isReferencedBy() async {
+    _indexTestUnit(r'''
+main(int a, int b) {
+}
+''');
+    ClassElement intElement = context.typeProvider.intType.element;
+    List<Location> locations = await index.getRelations(
+        intElement, IndexRelationKind.IS_REFERENCED_BY);
+    findLocationTest(locations, 'int a');
+    findLocationTest(locations, 'int b');
+  }
+
+  test_getUnresolvedMemberReferences() async {
+    _indexTestUnit('''
+class A {
+  var test; // A
+  mainA() {
+    test(); // a-inv-r-nq
+    test = 1; // a-ref-r-nq
+    test += 2; // a-ref-r-nq
+    print(test); // a-ref-r-nq
+  }
+}
+main(A a, p) {
+  a.test(); // a-inv-r-q
+  a.test = 1; // a-ref-r-q
+  a.test += 2; // a-ref-r-q
+  print(a.test); // a-ref-r-q
+  p.test(); // p-inv-ur-q
+  p.test = 1; // p-ref-ur-q
+  p.test += 2; // p-ref-ur-q
+  print(p.test); // p-ref-ur-q
+  print(p.test2); // not requested
+}
+''');
+    List<Location> locations =
+        await index.getUnresolvedMemberReferences('test');
+    expect(locations, hasLength(4));
+    findLocationTest(locations, 'test(); // p-inv-ur-q');
+    findLocationTest(locations, 'test = 1; // p-ref-ur-q');
+    findLocationTest(locations, 'test += 2; // p-ref-ur-q');
+    findLocationTest(locations, 'test); // p-ref-ur-q');
+  }
+
+  /**
+   * Assert that the given list of [locations] has a [Location] corresponding
+   * to the [element].
+   */
+  void _assertHasDefinedName(List<Location> locations, Element element) {
+    String libraryUri = element.library.source.uri.toString();
+    String unitUri = element.source.uri.toString();
+    for (Location location in locations) {
+      if (location.libraryUri == libraryUri &&
+          location.unitUri == unitUri &&
+          location.offset == element.nameOffset &&
+          location.length == element.nameLength) {
+        return;
+      }
+    }
+    fail('No declaration of $element at ${element.nameOffset} in\n'
+        '${locations.join('\n')}');
+  }
+
+  void _indexTestUnit(String code) {
+    resolveTestUnit(code);
+    index.indexUnit(testUnit);
+  }
+
+  Source _indexUnit(String path, String code) {
+    Source source = addSource(path, code);
+    CompilationUnit unit = resolveLibraryUnit(source);
+    index.indexUnit(unit);
+    return source;
+  }
+}
diff --git a/pkg/analysis_server/test/services/index2/test_all.dart b/pkg/analysis_server/test/services/index2/test_all.dart
new file mode 100644
index 0000000..ebc17d6
--- /dev/null
+++ b/pkg/analysis_server/test/services/index2/test_all.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:unittest/unittest.dart';
+
+import '../../utils.dart';
+import 'index2_test.dart' as index_test;
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  initializeTestEnvironment();
+  group('index', () {
+    index_test.main();
+  });
+}
diff --git a/pkg/analysis_server/test/services/linter/linter_test.dart b/pkg/analysis_server/test/services/linter/linter_test.dart
index a1f57eb..00a9fd6 100644
--- a/pkg/analysis_server/test/services/linter/linter_test.dart
+++ b/pkg/analysis_server/test/services/linter/linter_test.dart
@@ -21,7 +21,7 @@
 
 @reflectiveTest
 class LinterRuleOptionsValidatorTest {
-  final LinterRuleOptionsValidator validator= new LinterRuleOptionsValidator();
+  final LinterRuleOptionsValidator validator = new LinterRuleOptionsValidator();
   final AnalysisOptionsProvider optionsProvider = new AnalysisOptionsProvider();
 
   RecordingErrorListener recorder;
@@ -53,6 +53,17 @@
         []);
   }
 
+  test_linter_null_rule() {
+    validate(
+        '''
+linter:
+  rules:
+    -
+
+    ''',
+        []);
+  }
+
   test_linter_undefined_rule() {
     validate(
         '''
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index 43a0a35..46ed173 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -135,7 +135,27 @@
         expectedMessage: "Renamed method will be invisible in 'my.lib'.");
   }
 
-  test_checkFinalConditions_shadowed_byLocal_inSameClass() async {
+  test_checkFinalConditions_shadowed_byLocalFunction_inSameClass() async {
+    indexTestUnit('''
+class A {
+  test() {}
+  main() {
+    newName() {}
+    test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    RefactoringStatus status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Usage of renamed method will be shadowed by function 'newName'.",
+        expectedContextSearch: 'test(); // marker');
+  }
+
+  test_checkFinalConditions_shadowed_byLocalVariable_inSameClass() async {
     indexTestUnit('''
 class A {
   test() {}
@@ -155,7 +175,7 @@
         expectedContextSearch: 'test(); // marker');
   }
 
-  test_checkFinalConditions_shadowed_byLocal_inSubClass() async {
+  test_checkFinalConditions_shadowed_byLocalVariable_inSubClass() async {
     indexTestUnit('''
 class A {
   test() {}
@@ -177,7 +197,7 @@
         expectedContextSearch: 'test(); // marker');
   }
 
-  test_checkFinalConditions_shadowed_byLocal_OK_qualifiedReference() async {
+  test_checkFinalConditions_shadowed_byLocalVariable_OK_qualifiedReference() async {
     indexTestUnit('''
 class A {
   test() {}
@@ -194,7 +214,7 @@
     assertRefactoringStatusOK(status);
   }
 
-  test_checkFinalConditions_shadowed_byLocal_OK_renamedNotUsed() async {
+  test_checkFinalConditions_shadowed_byLocalVariable_OK_renamedNotUsed() async {
     indexTestUnit('''
 class A {
   test() {}
diff --git a/pkg/analysis_server/test/services/search/search_engine2_test.dart b/pkg/analysis_server/test/services/search/search_engine2_test.dart
new file mode 100644
index 0000000..782c892
--- /dev/null
+++ b/pkg/analysis_server/test/services/search/search_engine2_test.dart
@@ -0,0 +1,714 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.src.search.search_engine2;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/services/index2/index2.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal2.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../abstract_single_unit.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  defineReflectiveTests(SearchEngineImpl2Test);
+}
+
+class ExpectedMatch {
+  final Element element;
+  final MatchKind kind;
+  SourceRange range;
+  final bool isResolved;
+  final bool isQualified;
+
+  ExpectedMatch(this.element, this.kind, int offset, int length,
+      {this.isResolved: true, this.isQualified: false}) {
+    this.range = new SourceRange(offset, length);
+  }
+
+  bool operator ==(SearchMatch match) {
+    return match.element == this.element &&
+        match.kind == this.kind &&
+        match.isResolved == this.isResolved &&
+        match.isQualified == this.isQualified &&
+        match.sourceRange == this.range;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("ExpectedMatch(kind=");
+    buffer.write(kind);
+    buffer.write(", element=");
+    buffer.write(element != null ? element.displayName : 'null');
+    buffer.write(", range=");
+    buffer.write(range);
+    buffer.write(", isResolved=");
+    buffer.write(isResolved);
+    buffer.write(", isQualified=");
+    buffer.write(isQualified);
+    buffer.write(")");
+    return buffer.toString();
+  }
+}
+
+@reflectiveTest
+class SearchEngineImpl2Test extends AbstractSingleUnitTest {
+  Index2 index;
+  SearchEngineImpl2 searchEngine;
+
+  void setUp() {
+    super.setUp();
+    index = createMemoryIndex2();
+    searchEngine = new SearchEngineImpl2(context, index);
+  }
+
+  test_searchAllSubtypes() async {
+    _indexTestUnit('''
+class T {}
+class A extends T {}
+class B extends A {}
+class C implements B {}
+''');
+    ClassElement element = findElement('T');
+    ClassElement elementA = findElement('A');
+    ClassElement elementB = findElement('B');
+    ClassElement elementC = findElement('C');
+    var expected = [
+      _expectId(elementA, MatchKind.DECLARATION, 'A extends T'),
+      _expectId(elementB, MatchKind.DECLARATION, 'B extends A'),
+      _expectId(elementC, MatchKind.DECLARATION, 'C implements B')
+    ];
+    List<SearchMatch> matches = await searchEngine.searchAllSubtypes(element);
+    _assertMatches(matches, expected);
+  }
+
+  test_searchMemberDeclarations() async {
+    _indexTestUnit('''
+class A {
+  test() {}
+}
+class B {
+  int test = 1;
+  main() {
+    int test = 2;
+  }
+}
+''');
+    ClassElement elementA = findElement('A');
+    ClassElement elementB = findElement('B');
+    var expected = [
+      _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'),
+      _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 1;')
+    ];
+    List<SearchMatch> matches =
+        await searchEngine.searchMemberDeclarations('test');
+    _assertMatches(matches, expected);
+  }
+
+  test_searchMemberReferences() async {
+    _indexTestUnit('''
+class A {
+  var test; // A
+  mainA() {
+    test(); // a-inv-r-nq
+    test = 1; // a-ref-r-nq
+    test += 2; // a-ref-r-nq
+    print(test); // a-ref-r-nq
+  }
+}
+main(A a, p) {
+  a.test(); // a-inv-r-q
+  a.test = 1; // a-ref-r-q
+  a.test += 2; // a-ref-r-q
+  print(a.test); // a-ref-r-q
+  p.test(); // p-inv-ur-q
+  p.test = 1; // p-ref-ur-q
+  p.test += 2; // p-ref-ur-q
+  print(p.test); // p-ref-ur-q
+}
+''');
+    Element main = findElement('main');
+    var expected = [
+      _expectIdQ(main, MatchKind.REFERENCE, 'test(); // p-inv-ur-q'),
+      _expectIdQ(main, MatchKind.REFERENCE, 'test = 1; // p-ref-ur-q'),
+      _expectIdQ(main, MatchKind.REFERENCE, 'test += 2; // p-ref-ur-q'),
+      _expectIdQ(main, MatchKind.REFERENCE, 'test); // p-ref-ur-q'),
+    ];
+    List<SearchMatch> matches =
+        await searchEngine.searchMemberReferences('test');
+    _assertMatches(matches, expected);
+  }
+
+  test_searchReferences_ClassElement() async {
+    _indexTestUnit('''
+class A {}
+main(A p) {
+  A v;
+}
+''');
+    ClassElement element = findElement('A');
+    Element pElement = findElement('p');
+    Element vElement = findElement('v');
+    var expected = [
+      _expectId(pElement, MatchKind.REFERENCE, 'A p'),
+      _expectId(vElement, MatchKind.REFERENCE, 'A v')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_CompilationUnitElement() async {
+    addSource(
+        '/my_part.dart',
+        '''
+part of lib;
+''');
+    _indexTestUnit('''
+library lib;
+part 'my_part.dart';
+''');
+    CompilationUnitElement element = testLibraryElement.parts[0];
+    var expected = [
+      _expectIdQ(testUnitElement, MatchKind.REFERENCE, "'my_part.dart'",
+          length: "'my_part.dart'".length)
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_ConstructorElement() async {
+    _indexTestUnit('''
+class A {
+  A.named() {}
+}
+main() {
+  new A.named();
+}
+''');
+    ConstructorElement element = findElement('named');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectIdQ(mainElement, MatchKind.REFERENCE, '.named();', length: 6)
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_Element_unknown() async {
+    await _verifyReferences(DynamicElementImpl.instance, []);
+  }
+
+  test_searchReferences_FieldElement() async {
+    _indexTestUnit('''
+class A {
+  var field;
+  A({this.field});
+  main() {
+    new A(field: 1);
+    // getter
+    print(field); // ref-nq
+    print(this.field); // ref-q
+    field(); // inv-nq
+    this.field(); // inv-q
+    // setter
+    field = 2; // ref-nq;
+    this.field = 3; // ref-q;
+  }
+}
+''');
+    FieldElement element = findElement('field');
+    Element main = findElement('main');
+    Element fieldParameter = findElement('field', ElementKind.PARAMETER);
+    var expected = [
+      _expectIdQ(fieldParameter, MatchKind.REFERENCE, 'field}'),
+      _expectIdQ(main, MatchKind.REFERENCE, 'field: 1'),
+      _expectId(main, MatchKind.READ, 'field); // ref-nq'),
+      _expectIdQ(main, MatchKind.READ, 'field); // ref-q'),
+      _expectId(main, MatchKind.INVOCATION, 'field(); // inv-nq'),
+      _expectIdQ(main, MatchKind.INVOCATION, 'field(); // inv-q'),
+      _expectId(main, MatchKind.WRITE, 'field = 2; // ref-nq'),
+      _expectIdQ(main, MatchKind.WRITE, 'field = 3; // ref-q'),
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_FunctionElement() async {
+    _indexTestUnit('''
+test() {}
+main() {
+  test();
+  print(test);
+}
+''');
+    FunctionElement element = findElement('test');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(mainElement, MatchKind.INVOCATION, 'test();'),
+      _expectId(mainElement, MatchKind.REFERENCE, 'test);')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_FunctionElement_local() async {
+    _indexTestUnit('''
+main() {
+  test() {}
+  test();
+  print(test);
+}
+''');
+    FunctionElement element = findElement('test');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(mainElement, MatchKind.INVOCATION, 'test();'),
+      _expectId(mainElement, MatchKind.REFERENCE, 'test);')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_FunctionTypeAliasElement() async {
+    _indexTestUnit('''
+typedef Test();
+main() {
+  Test a;
+  Test b;
+}
+''');
+    FunctionTypeAliasElement element = findElement('Test');
+    Element aElement = findElement('a');
+    Element bElement = findElement('b');
+    var expected = [
+      _expectId(aElement, MatchKind.REFERENCE, 'Test a;'),
+      _expectId(bElement, MatchKind.REFERENCE, 'Test b;')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_ImportElement_noPrefix() async {
+    _indexTestUnit('''
+import 'dart:math';
+main() {
+  print(PI);
+  print(new Random());
+  print(max(1, 2));
+}
+Random bar() => null;
+''');
+    ImportElement element = testLibraryElement.imports[0];
+    Element mainElement = findElement('main');
+    Element barElement = findElement('bar');
+    var kind = MatchKind.REFERENCE;
+    var expected = [
+      _expectId(mainElement, kind, 'PI);', length: 0),
+      _expectId(mainElement, kind, 'Random()', length: 0),
+      _expectId(mainElement, kind, 'max(', length: 0),
+      _expectId(barElement, kind, 'Random bar()', length: 0),
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_ImportElement_withPrefix() async {
+    _indexTestUnit('''
+import 'dart:math' as math;
+main() {
+  print(math.PI);
+  print(new math.Random());
+  print(math.max(1, 2));
+}
+math.Random bar() => null;
+''');
+    ImportElement element = testLibraryElement.imports[0];
+    Element mainElement = findElement('main');
+    Element barElement = findElement('bar');
+    var kind = MatchKind.REFERENCE;
+    var length = 'math.'.length;
+    var expected = [
+      _expectId(mainElement, kind, 'math.PI);', length: length),
+      _expectId(mainElement, kind, 'math.Random()', length: length),
+      _expectId(mainElement, kind, 'math.max(', length: length),
+      _expectId(barElement, kind, 'math.Random bar()', length: length),
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_LabelElement() async {
+    _indexTestUnit('''
+main() {
+label:
+  while (true) {
+    if (true) {
+      break label; // 1
+    }
+    break label; // 2
+  }
+}
+''');
+    LabelElement element = findElement('label');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(mainElement, MatchKind.REFERENCE, 'label; // 1'),
+      _expectId(mainElement, MatchKind.REFERENCE, 'label; // 2')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_LibraryElement() async {
+    var codeA = 'part of lib; // A';
+    var codeB = 'part of lib; // B';
+    addSource('/unitA.dart', codeA);
+    addSource('/unitB.dart', codeB);
+    _indexTestUnit('''
+library lib;
+part 'unitA.dart';
+part 'unitB.dart';
+''');
+    LibraryElement element = testLibraryElement;
+    CompilationUnitElement unitElementA = element.parts[0];
+    CompilationUnitElement unitElementB = element.parts[1];
+    index.indexUnit(unitElementA.computeNode());
+    index.indexUnit(unitElementB.computeNode());
+    var expected = [
+      new ExpectedMatch(unitElementA, MatchKind.REFERENCE,
+          codeA.indexOf('lib; // A'), 'lib'.length),
+      new ExpectedMatch(unitElementB, MatchKind.REFERENCE,
+          codeB.indexOf('lib; // B'), 'lib'.length),
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_LocalVariableElement() async {
+    _indexTestUnit('''
+main() {
+  var v;
+  v = 1;
+  v += 2;
+  print(v);
+  v();
+}
+''');
+    LocalVariableElement element = findElement('v');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(mainElement, MatchKind.WRITE, 'v = 1;'),
+      _expectId(mainElement, MatchKind.READ_WRITE, 'v += 2;'),
+      _expectId(mainElement, MatchKind.READ, 'v);'),
+      _expectId(mainElement, MatchKind.INVOCATION, 'v();')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_MethodElement() async {
+    _indexTestUnit('''
+class A {
+  m() {}
+  main() {
+    m(); // 1
+    this.m(); // 2
+    print(m); // 3
+    print(this.m); // 4
+  }
+}
+''');
+    MethodElement method = findElement('m');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(mainElement, MatchKind.INVOCATION, 'm(); // 1'),
+      _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // 2'),
+      _expectId(mainElement, MatchKind.REFERENCE, 'm); // 3'),
+      _expectIdQ(mainElement, MatchKind.REFERENCE, 'm); // 4')
+    ];
+    await _verifyReferences(method, expected);
+  }
+
+  test_searchReferences_MethodMember() async {
+    _indexTestUnit('''
+class A<T> {
+  T m() => null;
+}
+main(A<int> a) {
+  a.m(); // ref
+}
+''');
+    MethodMember method = findNodeElementAtString('m(); // ref');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // ref')
+    ];
+    await _verifyReferences(method, expected);
+  }
+
+  test_searchReferences_ParameterElement_ofLocalFunction() async {
+    _indexTestUnit('''
+main() {
+  foo({p}) {
+    p = 1;
+    p += 2;
+    print(p);
+    p();
+  }
+  foo(p: 42);
+}
+''');
+    ParameterElement element = findElement('p');
+    Element fooElement = findElement('foo');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(fooElement, MatchKind.WRITE, 'p = 1;'),
+      _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'),
+      _expectId(fooElement, MatchKind.READ, 'p);'),
+      _expectId(fooElement, MatchKind.INVOCATION, 'p();'),
+      _expectIdQ(mainElement, MatchKind.REFERENCE, 'p: 42')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_ParameterElement_ofMethod() async {
+    _indexTestUnit('''
+class C {
+  foo({p}) {
+    p = 1;
+    p += 2;
+    print(p);
+    p();
+  }
+}
+main(C c) {
+  c.foo(p: 42);
+}
+''');
+    ParameterElement element = findElement('p');
+    Element fooElement = findElement('foo');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(fooElement, MatchKind.WRITE, 'p = 1;'),
+      _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'),
+      _expectId(fooElement, MatchKind.READ, 'p);'),
+      _expectId(fooElement, MatchKind.INVOCATION, 'p();'),
+      _expectIdQ(mainElement, MatchKind.REFERENCE, 'p: 42')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_ParameterElement_ofTopLevelFunction() async {
+    _indexTestUnit('''
+foo({p}) {
+  p = 1;
+  p += 2;
+  print(p);
+  p();
+}
+main() {
+  foo(p: 42);
+}
+''');
+    ParameterElement element = findElement('p');
+    Element fooElement = findElement('foo');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(fooElement, MatchKind.WRITE, 'p = 1;'),
+      _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'),
+      _expectId(fooElement, MatchKind.READ, 'p);'),
+      _expectId(fooElement, MatchKind.INVOCATION, 'p();'),
+      _expectIdQ(mainElement, MatchKind.REFERENCE, 'p: 42')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_PrefixElement() async {
+    _indexTestUnit('''
+import 'dart:async' as ppp;
+main() {
+  ppp.Future a;
+  ppp.Stream b;
+}
+''');
+    PrefixElement element = findNodeElementAtString('ppp;');
+    Element elementA = findElement('a');
+    Element elementB = findElement('b');
+    var expected = [
+      _expectId(elementA, MatchKind.REFERENCE, 'ppp.Future'),
+      _expectId(elementB, MatchKind.REFERENCE, 'ppp.Stream')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_PropertyAccessorElement_getter() async {
+    _indexTestUnit('''
+class A {
+  get g => null;
+  main() {
+    g; // 1
+    this.g; // 2
+  }
+}
+''');
+    PropertyAccessorElement element = findElement('g', ElementKind.GETTER);
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(mainElement, MatchKind.REFERENCE, 'g; // 1'),
+      _expectIdQ(mainElement, MatchKind.REFERENCE, 'g; // 2')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_PropertyAccessorElement_setter() async {
+    _indexTestUnit('''
+class A {
+  set s(x) {}
+  main() {
+    s = 1;
+    this.s = 2;
+  }
+}
+''');
+    PropertyAccessorElement element = findElement('s=');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(mainElement, MatchKind.REFERENCE, 's = 1'),
+      _expectIdQ(mainElement, MatchKind.REFERENCE, 's = 2')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchReferences_TopLevelVariableElement() async {
+    addSource(
+        '/lib.dart',
+        '''
+library lib;
+var V;
+''');
+    _indexTestUnit('''
+import 'lib.dart' show V; // imp
+import 'lib.dart' as pref;
+main() {
+  pref.V = 1; // q
+  print(pref.V); // q
+  pref.V(); // q
+  V = 1; // nq
+  print(V); // nq
+  V(); // nq
+}
+''');
+    ImportElement importElement = testLibraryElement.imports[0];
+    CompilationUnitElement impUnit =
+        importElement.importedLibrary.definingCompilationUnit;
+    TopLevelVariableElement variable = impUnit.topLevelVariables[0];
+    Element main = findElement('main');
+    var expected = [
+      _expectIdQ(testUnitElement, MatchKind.REFERENCE, 'V; // imp'),
+      _expectIdQ(main, MatchKind.WRITE, 'V = 1; // q'),
+      _expectIdQ(main, MatchKind.READ, 'V); // q'),
+      _expectIdQ(main, MatchKind.INVOCATION, 'V(); // q'),
+      _expectId(main, MatchKind.WRITE, 'V = 1; // nq'),
+      _expectId(main, MatchKind.READ, 'V); // nq'),
+      _expectId(main, MatchKind.INVOCATION, 'V(); // nq'),
+    ];
+    await _verifyReferences(variable, expected);
+  }
+
+  test_searchReferences_TypeParameterElement() async {
+    _indexTestUnit('''
+class A<T> {
+  main(T a, T b) {}
+}
+''');
+    TypeParameterElement element = findElement('T');
+    Element aElement = findElement('a');
+    Element bElement = findElement('b');
+    var expected = [
+      _expectId(aElement, MatchKind.REFERENCE, 'T a'),
+      _expectId(bElement, MatchKind.REFERENCE, 'T b')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
+  test_searchSubtypes() async {
+    _indexTestUnit('''
+class T {}
+class A extends T {} // A
+class B = Object with T; // B
+class C implements T {} // C
+''');
+    ClassElement element = findElement('T');
+    ClassElement elementA = findElement('A');
+    ClassElement elementB = findElement('B');
+    ClassElement elementC = findElement('C');
+    var expected = [
+      _expectId(elementA, MatchKind.REFERENCE, 'T {} // A'),
+      _expectId(elementB, MatchKind.REFERENCE, 'T; // B'),
+      _expectId(elementC, MatchKind.REFERENCE, 'T {} // C')
+    ];
+    List<SearchMatch> matches = await searchEngine.searchSubtypes(element);
+    _assertMatches(matches, expected);
+  }
+
+  test_searchTopLevelDeclarations() async {
+    _indexTestUnit('''
+class A {} // A
+class B = Object with A;
+typedef C();
+D() {}
+var E = null;
+class NoMatchABCDE {}
+''');
+    Element topA = findElement('A');
+    Element topB = findElement('B');
+    Element topC = findElement('C');
+    Element topD = findElement('D');
+    Element topE = findElement('E');
+    var expected = [
+      _expectId(topA, MatchKind.DECLARATION, 'A {} // A'),
+      _expectId(topB, MatchKind.DECLARATION, 'B ='),
+      _expectId(topC, MatchKind.DECLARATION, 'C()'),
+      _expectId(topD, MatchKind.DECLARATION, 'D() {}'),
+      _expectId(topE, MatchKind.DECLARATION, 'E = null')
+    ];
+    List<SearchMatch> matches =
+        await searchEngine.searchTopLevelDeclarations(r'^[A-E]$');
+    _assertMatches(matches, expected);
+  }
+
+  ExpectedMatch _expectId(Element element, MatchKind kind, String search,
+      {int length, bool isResolved: true, bool isQualified: false}) {
+    int offset = findOffset(search);
+    if (length == null) {
+      length = getLeadingIdentifierLength(search);
+    }
+    return new ExpectedMatch(element, kind, offset, length,
+        isResolved: isResolved, isQualified: isQualified);
+  }
+
+  ExpectedMatch _expectIdQ(Element element, MatchKind kind, String search,
+      {int length}) {
+    return _expectId(element, kind, search, isQualified: true, length: length);
+  }
+
+//  ExpectedMatch _expectIdU(Element element, MatchKind kind, String search) {
+//    return _expectId(element, kind, search,
+//        isQualified: true, isResolved: false);
+//  }
+
+  void _indexTestUnit(String code) {
+    resolveTestUnit(code);
+    index.indexUnit(testUnit);
+  }
+
+  Future _verifyReferences(
+      Element element, List<ExpectedMatch> expectedMatches) async {
+    List<SearchMatch> matches = await searchEngine.searchReferences(element);
+    _assertMatches(matches, expectedMatches);
+  }
+
+  static void _assertMatches(
+      List<SearchMatch> matches, List<ExpectedMatch> expectedMatches) {
+    expect(matches, unorderedEquals(expectedMatches));
+  }
+}
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 0e38446..c4e757c 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
 import '../../abstract_single_unit.dart';
@@ -64,8 +63,6 @@
   }
 }
 
-class MockIndex extends TypedMock implements Index {}
-
 @reflectiveTest
 class SearchEngineImplTest extends AbstractSingleUnitTest {
   Index index;
@@ -98,31 +95,6 @@
     });
   }
 
-  Future test_searchElementDeclarations() {
-    _indexTestUnit('''
-class A {
-  test() {}
-}
-class B {
-  int test = 1;
-  main() {
-    int test = 2;
-  }
-}
-''');
-    ClassElement elementA = findElement('A');
-    ClassElement elementB = findElement('B');
-    Element element_test = findElement('test', ElementKind.LOCAL_VARIABLE);
-    var expected = [
-      _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'),
-      _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 1;'),
-      _expectId(element_test, MatchKind.DECLARATION, 'test = 2;'),
-    ];
-    return searchEngine.searchElementDeclarations('test').then((matches) {
-      _assertMatches(matches, expected);
-    });
-  }
-
   Future test_searchMemberDeclarations() {
     _indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/search/test_all.dart b/pkg/analysis_server/test/services/search/test_all.dart
index 187d3f3..513c397 100644
--- a/pkg/analysis_server/test/services/search/test_all.dart
+++ b/pkg/analysis_server/test/services/search/test_all.dart
@@ -8,6 +8,7 @@
 
 import '../../utils.dart';
 import 'hierarchy_test.dart' as hierarchy_test;
+import 'search_engine2_test.dart' as search_engine2_test;
 import 'search_engine_test.dart' as search_engine_test;
 
 /**
@@ -17,6 +18,7 @@
   initializeTestEnvironment();
   group('search', () {
     hierarchy_test.main();
+    search_engine2_test.main();
     search_engine_test.main();
   });
 }
diff --git a/pkg/analysis_server/test/services/test_all.dart b/pkg/analysis_server/test/services/test_all.dart
index e0c2086..6373800 100644
--- a/pkg/analysis_server/test/services/test_all.dart
+++ b/pkg/analysis_server/test/services/test_all.dart
@@ -9,6 +9,7 @@
 import 'correction/test_all.dart' as correction_all;
 import 'dependencies/test_all.dart' as dependencies_all;
 import 'index/test_all.dart' as index_all;
+import 'index2/test_all.dart' as index2_all;
 import 'linter/linter_test.dart' as linter_all;
 import 'refactoring/test_all.dart' as refactoring_all;
 import 'search/test_all.dart' as search_all;
@@ -20,6 +21,7 @@
   correction_all.main();
   dependencies_all.main();
   index_all.main();
+  index2_all.main();
   linter_all.main();
   refactoring_all.main();
   search_all.main();
diff --git a/pkg/analysis_server/test/src/utilities/change_builder_dart_test.dart b/pkg/analysis_server/test/src/utilities/change_builder_dart_test.dart
index 5db934d..3d4f6ae 100644
--- a/pkg/analysis_server/test/src/utilities/change_builder_dart_test.dart
+++ b/pkg/analysis_server/test/src/utilities/change_builder_dart_test.dart
@@ -60,8 +60,8 @@
     DartChangeBuilderImpl builder = new DartChangeBuilderImpl(context);
     builder.addFileEdit(source, 1, (DartFileEditBuilderImpl builder) {
       builder.addInsertion(0, (DartEditBuilder builder) {
-        builder.writeClassDeclaration('C',
-            interfaces: [declaration.element.type]);
+        builder
+            .writeClassDeclaration('C', interfaces: [declaration.element.type]);
       });
     });
     SourceEdit edit = getEdit(builder);
@@ -549,7 +549,7 @@
     builder.addFileEdit(source, 1, (DartFileEditBuilderImpl builder) {
       builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
         builder
-            .writeType(classB.element.type.substitute4([classA.element.type]));
+            .writeType(classB.element.type.instantiate([classA.element.type]));
       });
     });
     SourceEdit edit = getEdit(builder);
diff --git a/pkg/analyzer/.analysis_options b/pkg/analyzer/.analysis_options
index 7c974bd..2b11248 100644
--- a/pkg/analyzer/.analysis_options
+++ b/pkg/analyzer/.analysis_options
@@ -1,5 +1,6 @@
 linter:
   rules:
-    - annotate_overrides
+    # TODO(pq): re-enable once we have a bulk edit tool
+    # - annotate_overrides
     - empty_constructor_bodies
     - unnecessary_brace_in_string_interp
diff --git a/pkg/analyzer/README.md b/pkg/analyzer/README.md
index c6ad981..18dd9b2 100644
--- a/pkg/analyzer/README.md
+++ b/pkg/analyzer/README.md
@@ -15,7 +15,7 @@
 
 ## Configuring the analyzer
 
-Both the dartanalyzer and Dart Analysis Server can be configured
+Both `dartanalyzer` and Dart Analysis Server can be configured
 with a `.analysis_options` file. This YAML file can control which files
 and paths are analyzed, which lints are applied, and more.
 
@@ -25,14 +25,14 @@
 
 The `.analysis_options` file should live
 at the root of your project (for example, next to your `pubspec.yaml`).
-Different embedders of analyzer, such as dartanalyzer or Dart Analysis Server,
+Different embedders of analyzer, such as `dartanalyzer` or Dart Analysis Server,
 may choose to find the file in various different ways. Consult their
 documentation to learn more.
 
 Here is an example file that instructs the analyzer
 to ignore two files:
 
-```
+```yaml
 analyzer:
   exclude:
     - test/_data/p4/lib/lib1.dart
@@ -45,14 +45,14 @@
 
 Here is an example file that enables the analyzer's [strong mode][strongmode]:
 
-```
+```yaml
 analyzer:
   strong-mode: true
 ```
 
 Here is an example file that enables two lint rules:
 
-```
+```yaml
 linter:
   rules:
     - camel_case_types
@@ -64,7 +64,7 @@
 You can combine the `analyzer` section and the `linter` section into a single
 configuration. Here is an example:
 
-```
+```yaml
 analyzer:
   exclude:
     - test/_data/p4/lib/lib1.dart
@@ -77,17 +77,16 @@
 
 Many tools embed this library, such as:
 
-* dartfmt - a formatter for Dart code
-* dartdoc - a documentation generator for Dart code
-* Dart Analysis Server - a stateful server that supports IDEs and editors
+* [dartfmt] - a formatter for Dart code
+* [dartdoc] - a documentation generator for Dart code
+* [Dart Analysis Server][analysis_sever] - a stateful server that supports IDEs and editors
 
 ## Support
 
-Questions and requests for additional functionality are welcome.
-Please open an issue at
-[http://dartbug.com](http://dartbug.com)
-or by email
-[analyzer-discuss@dartlang.org][list].
+Post issues and feature requests at https://github.com/dart-lang/sdk/issues
+
+Questions and discussions are welcome at the
+[Dart Analyzer Discussion Group][list].
 
 ## Background
 
@@ -103,11 +102,15 @@
 
 ## License
 
-See the LICENSE file.
+See the [LICENSE] file.
 
-[serverapi]: http://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html
-[analyzercli]: https://github.com/dart-lang/analyzer_cli
+[serverapi]: https://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html
+[analyzercli]: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_cli
 [list]: https://groups.google.com/a/dartlang.org/forum/#!forum/analyzer-discuss
 [lintrules]: http://dart-lang.github.io/linter/lints/
 [strongmode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
 [glob]: https://pub.dartlang.org/packages/glob
+[LICENSE]: https://github.com/dart-lang/sdk/blob/master/pkg/analyzer/LICENSE
+[dartfmt]: https://github.com/dart-lang/dart_style
+[dartdoc]: https://github.com/dart-lang/dartdoc
+[analysis_sever]: https://github.com/dart-lang/sdk/tree/master/pkg/analysis_server
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index fffb006..5cbc96a 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -35,8 +35,7 @@
 /// parsed.
 CompilationUnit parseCompilationUnit(String contents,
     {String name, bool suppressErrors: false, bool parseFunctionBodies: true}) {
-  if (name == null) name = '<unknown source>';
-  var source = new StringSource(contents, name);
+  Source source = new StringSource(contents, name);
   return _parseSource(contents, source,
       suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
 }
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index e89eb22..17e2f54 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -813,6 +813,11 @@
    */
   bool get isOverride;
 
+  /**
+   * Return `true` if this annotation marks the associated member as requiring
+   * overriding methods to call super.
+   */
+  bool get isMustCallSuper;
 
   /**
    * Return `true` if this annotation marks the associated member as being
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 3ff2ce8..11c97e8 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -132,6 +132,15 @@
   bool isSupertypeOf(DartType type);
 
   /**
+   * If this type is a [TypeParameterType], returns its bound if it has one, or
+   * [objectType] otherwise.
+   *
+   * For any other type, returns `this`. Applies recursively -- if the bound is
+   * itself a type parameter, that is resolved too.
+   */
+  DartType resolveToBound(DartType objectType);
+
+  /**
    * Return the type resulting from substituting the given [argumentTypes] for
    * the given [parameterTypes] in this type. The specification defines this
    * operation in section 2:
@@ -150,15 +159,6 @@
    */
   DartType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes);
-
-  /**
-   * If this type is a [TypeParameterType], returns its bound if it has one, or
-   * [objectType] otherwise.
-   *
-   * For any other type, returns `this`. Applies recursively -- if the bound is
-   * itself a type parameter, that is resolved too.
-   */
-  DartType resolveToBound(DartType objectType);
 }
 
 /**
@@ -242,10 +242,7 @@
    */
   List<TypeParameterElement> get typeFormals;
 
-  /**
-   * Return the type resulting from instantiating (replacing) the given
-   * [argumentTypes] for this function's bound type parameters.
-   */
+  @override
   FunctionType instantiate(List<DartType> argumentTypes);
 
   /**
@@ -401,6 +398,9 @@
    */
   PropertyAccessorElement getSetter(String name);
 
+  @override
+  InterfaceType instantiate(List<DartType> argumentTypes);
+
   /**
    * Return `true` if this type is a direct supertype of the given [type]. The
    * implicit interface of class <i>I</i> is a direct supertype of the implicit
@@ -633,12 +633,7 @@
    * type's parameters. This is fully equivalent to `substitute2(argumentTypes,
    * getTypeArguments())`.
    */
-  // TODO(jmesserly): introduce a new "instantiate" and deprecate this.
-  // The new "instantiate" should work similar to FunctionType.instantiate,
-  // which uses [typeFormals] to model type parameters that haven't been
-  // filled in yet. Those are kept separate from already-substituted type
-  // parameters or free variables from the enclosing scopes, which allows nested
-  // generics to work, such as a generic method in a generic class.
+  @deprecated // use instantiate
   InterfaceType substitute4(List<DartType> argumentTypes);
 
   /**
@@ -665,7 +660,7 @@
  * This substitution will be propagated to its members. For example, say our
  * `Foo<T>` class has a field `T bar;`. When we look up this field, we will get
  * back a [FieldElement] that tracks the substituted type as `{S/T}T`, so when
- * we ask for the field type we will get`S`.
+ * we ask for the field type we will get `S`.
  *
  * Clients may not extend, implement or mix-in this class.
  */
@@ -684,6 +679,12 @@
    * Return a list containing all of the type parameters declared for this type.
    */
   List<TypeParameterElement> get typeParameters;
+
+  /**
+   * Return the type resulting from instantiating (replacing) the given
+   * [argumentTypes] for this type's bound type parameters.
+   */
+  ParameterizedType instantiate(List<DartType> argumentTypes);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/context/cache.dart b/pkg/analyzer/lib/src/context/cache.dart
index bbb0e69..de913f3 100644
--- a/pkg/analyzer/lib/src/context/cache.dart
+++ b/pkg/analyzer/lib/src/context/cache.dart
@@ -1095,7 +1095,7 @@
 /**
  * [InvalidatedResult] describes an invalidated result.
  */
-class InvalidatedResult {
+class InvalidatedResult<V> {
   /**
    * The target in which the result was invalidated.
    */
@@ -1104,12 +1104,13 @@
   /**
    * The descriptor of the result which was invalidated.
    */
-  final ResultDescriptor descriptor;
+  final ResultDescriptor<V> descriptor;
 
   /**
-   * The value of the result which was invalidated.
+   * The value of the result before it was invalidated, may be the default
+   * value if the result was flushed.
    */
-  final Object value;
+  final V value;
 
   InvalidatedResult(this.entry, this.descriptor, this.value);
 
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index def719f..2c4ef43 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -194,6 +194,13 @@
   ResultProvider resultProvider;
 
   /**
+   * The map of [ResultChangedEvent] controllers.
+   */
+  final Map<ResultDescriptor, StreamController<ResultChangedEvent>>
+      _resultChangedControllers =
+      <ResultDescriptor, StreamController<ResultChangedEvent>>{};
+
+  /**
    * The most recently incrementally resolved source, or `null` when it was
    * already validated, or the most recent change was not incrementally resolved.
    */
@@ -682,10 +689,19 @@
     if (sdk == null) {
       return new AnalysisCache(<CachePartition>[_privatePartition]);
     }
-    return new AnalysisCache(<CachePartition>[
+    AnalysisCache cache = new AnalysisCache(<CachePartition>[
       AnalysisEngine.instance.partitionManager.forSdk(sdk),
       _privatePartition
     ]);
+    cache.onResultInvalidated.listen((InvalidatedResult event) {
+      StreamController<ResultChangedEvent> controller =
+          _resultChangedControllers[event.descriptor];
+      if (controller != null) {
+        controller.add(new ResultChangedEvent(
+            this, event.entry.target, event.descriptor, event.value, false));
+      }
+    });
+    return cache;
   }
 
   /**
@@ -1099,8 +1115,24 @@
   }
 
   @override
+  Stream<ResultChangedEvent> onResultChanged(ResultDescriptor descriptor) {
+    driver.onResultComputed(descriptor).listen((ResultChangedEvent event) {
+      _resultChangedControllers[descriptor]?.add(event);
+    });
+    return _resultChangedControllers.putIfAbsent(descriptor, () {
+      return new StreamController<ResultChangedEvent>.broadcast(sync: true);
+    }).stream;
+  }
+
+  @override
+  @deprecated
   Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor) {
-    return driver.onResultComputed(descriptor);
+    return onResultChanged(descriptor)
+        .where((event) => event.wasComputed)
+        .map((event) {
+      return new ComputedResult(
+          event.context, event.descriptor, event.target, event.value);
+    });
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index 23869ee..8dfc781 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -204,11 +204,6 @@
   Object visitImportDirective(ImportDirective node) {
     // Remove previous element. (It will remain null if the target is missing.)
     node.element = null;
-
-    String uriContent = node.uriContent;
-    if (DartUriResolver.isDartExtUri(uriContent)) {
-      libraryElement.hasExtUri = true;
-    }
     Source importedSource = node.source;
     if (importedSource != null && context.exists(importedSource)) {
       // The imported source will be null if the URI in the import
@@ -225,7 +220,7 @@
           importElement.uriOffset = uriLiteral.offset;
           importElement.uriEnd = uriLiteral.end;
         }
-        importElement.uri = uriContent;
+        importElement.uri = node.uriContent;
         importElement.deferred = node.deferredKeyword != null;
         importElement.combinators = _buildCombinators(node);
         importElement.importedLibrary = importedLibrary;
@@ -312,7 +307,7 @@
    * The compilation unit element into which the elements being built will be
    * stored.
    */
-  final CompilationUnitElement compilationUnitElement;
+  final CompilationUnitElementImpl compilationUnitElement;
 
   /**
    * The element holder associated with the element that is currently being built.
@@ -339,9 +334,9 @@
   HashMap<String, FieldElement> _fieldMap;
 
   /**
-   * Initialize a newly created element builder to build the elements for a compilation unit.
-   *
-   * @param initialHolder the element holder associated with the compilation unit being built
+   * Initialize a newly created element builder to build the elements for a
+   * compilation unit. The [initialHolder] is the element holder to which the
+   * children of the visited compilation unit node will be added.
    */
   ElementBuilder(ElementHolder initialHolder, this.compilationUnitElement) {
     _currentHolder = initialHolder;
@@ -484,7 +479,7 @@
   @override
   Object visitCompilationUnit(CompilationUnit node) {
     if (compilationUnitElement is ElementImpl) {
-      _setCodeRange(compilationUnitElement as ElementImpl, node);
+      _setCodeRange(compilationUnitElement, node);
     }
     return super.visitCompilationUnit(node);
   }
@@ -626,6 +621,27 @@
     // to subclass, mix-in, implement, or explicitly instantiate an enum).  So
     // we represent this as having no constructors.
     enumElement.constructors = ConstructorElement.EMPTY_LIST;
+    //
+    // Build the elements for the constants. These are minimal elements; the
+    // rest of the constant elements (and elements for other fields) must be
+    // built later after we can access the type provider.
+    //
+    List<FieldElement> fields = new List<FieldElement>();
+    NodeList<EnumConstantDeclaration> constants = node.constants;
+    for (EnumConstantDeclaration constant in constants) {
+      SimpleIdentifier constantName = constant.name;
+      FieldElementImpl constantField =
+          new ConstFieldElementImpl.forNode(constantName);
+      constantField.static = true;
+      constantField.const3 = true;
+      constantField.type = enumType;
+      setElementDocumentationComment(constantField, constant);
+      fields.add(constantField);
+      _createGetter(constantField);
+      constantName.staticElement = constantField;
+    }
+    enumElement.fields = fields;
+
     _currentHolder.addEnum(enumElement);
     enumName.staticElement = enumElement;
     return super.visitEnumDeclaration(node);
@@ -633,7 +649,9 @@
 
   @override
   Object visitExportDirective(ExportDirective node) {
-    _createElementAnnotations(node.metadata);
+    List<ElementAnnotation> annotations =
+        _createElementAnnotations(node.metadata);
+    compilationUnitElement.setAnnotations(node.offset, annotations);
     return super.visitExportDirective(node);
   }
 
@@ -895,7 +913,9 @@
 
   @override
   Object visitImportDirective(ImportDirective node) {
-    _createElementAnnotations(node.metadata);
+    List<ElementAnnotation> annotations =
+        _createElementAnnotations(node.metadata);
+    compilationUnitElement.setAnnotations(node.offset, annotations);
     return super.visitImportDirective(node);
   }
 
@@ -906,7 +926,6 @@
       SimpleIdentifier labelName = label.label;
       LabelElementImpl element =
           new LabelElementImpl.forNode(labelName, onSwitchStatement, false);
-      _setCodeRange(element, node);
       _currentHolder.addLabel(element);
       labelName.staticElement = element;
     }
@@ -915,7 +934,9 @@
 
   @override
   Object visitLibraryDirective(LibraryDirective node) {
-    _createElementAnnotations(node.metadata);
+    List<ElementAnnotation> annotations =
+        _createElementAnnotations(node.metadata);
+    compilationUnitElement.setAnnotations(node.offset, annotations);
     return super.visitLibraryDirective(node);
   }
 
@@ -1078,7 +1099,9 @@
 
   @override
   Object visitPartDirective(PartDirective node) {
-    _createElementAnnotations(node.metadata);
+    List<ElementAnnotation> annotations =
+        _createElementAnnotations(node.metadata);
+    compilationUnitElement.setAnnotations(node.offset, annotations);
     return super.visitPartDirective(node);
   }
 
@@ -1314,6 +1337,18 @@
   }
 
   /**
+   * Create a getter that corresponds to the given [field].
+   */
+  void _createGetter(FieldElementImpl field) {
+    PropertyAccessorElementImpl getter =
+        new PropertyAccessorElementImpl.forVariable(field);
+    getter.getter = true;
+    getter.returnType = field.type;
+    getter.type = new FunctionTypeImpl(getter);
+    field.getter = getter;
+  }
+
+  /**
    * Create the types associated with the given type parameters, setting the type of each type
    * parameter, and return an array of types corresponding to the given parameters.
    *
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index e3f4dfe..310e4e9 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -928,6 +928,13 @@
   Source librarySource;
 
   /**
+   * A table mapping the offset of a directive to the annotations associated
+   * with that directive, or `null` if none of the annotations in the
+   * compilation unit have annotations.
+   */
+  Map<int, List<ElementAnnotation>> annotationMap = null;
+
+  /**
    * A list containing all of the top-level accessors (getters and setters)
    * contained in this compilation unit.
    */
@@ -1103,6 +1110,18 @@
   @override
   CompilationUnit computeNode() => unit;
 
+  /**
+   * Return the annotations associated with the directive at the given [offset],
+   * or an empty list if the directive has no annotations or if there is no
+   * directive at the given offset.
+   */
+  List<ElementAnnotation> getAnnotations(int offset) {
+    if (annotationMap == null) {
+      return ElementAnnotation.EMPTY_LIST;
+    }
+    return annotationMap[offset] ?? ElementAnnotation.EMPTY_LIST;
+  }
+
   @override
   ElementImpl getChild(String identifier) {
     //
@@ -1181,6 +1200,15 @@
     _variables[index] = to;
   }
 
+  /**
+   * Set the annotations associated with the directive at the given [offset] to
+   * the given list of [annotations].
+   */
+  void setAnnotations(int offset, List<ElementAnnotation> annotations) {
+    annotationMap ??= new HashMap<int, List<ElementAnnotation>>();
+    annotationMap[offset] = annotations;
+  }
+
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
@@ -1573,6 +1601,12 @@
   static String _META_LIB_NAME = "meta";
 
   /**
+   * The name of the top-level variable used to mark a method as requiring
+   * overriders to call super.
+   */
+  static String _MUST_CALL_SUPER_VARIABLE_NAME = "mustCallSuper";
+
+  /**
    * The name of the top-level variable used to mark a method as being expected
    * to override an inherited method.
    */
@@ -1639,6 +1673,12 @@
   }
 
   @override
+  bool get isMustCallSuper =>
+      element is PropertyAccessorElement &&
+      element.name == _MUST_CALL_SUPER_VARIABLE_NAME &&
+      element.library?.name == _META_LIB_NAME;
+
+  @override
   bool get isOverride =>
       element is PropertyAccessorElement &&
       element.name == _OVERRIDE_VARIABLE_NAME &&
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 29658fb..b0851de 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -731,10 +731,7 @@
 
   @override
   bool isSubtypeOf(DartType type) {
-    return relate(
-        this,
-        type,
-        (DartType t, DartType s) => t.isAssignableTo(s),
+    return relate(this, type, (DartType t, DartType s) => t.isAssignableTo(s),
         new TypeSystemImpl().instantiateToBounds);
   }
 
@@ -854,56 +851,6 @@
   }
 
   /**
-   * Given two functions [f1] and [f2] where f1 and f2 are known to be
-   * generic function types (both have type formals), this checks that they
-   * have the same number of formals, and that those formals have bounds
-   * (e.g. `<T extends LowerBound>`) that satisfy [relation].
-   *
-   * The return value will be a new list of fresh type variables, that can be
-   * used to instantiate both function types, allowing further comparison.
-   * For example, given `<T>T -> T` and `<U>U -> U` we can instantiate them with
-   * `F` to get `F -> F` and `F -> F`, which we can see are equal.
-   */
-  static List<DartType> relateTypeFormals(
-      FunctionType f1, FunctionType f2, bool relation(DartType t, DartType s)) {
-    List<TypeParameterElement> params1 = f1.typeFormals;
-    List<TypeParameterElement> params2 = f2.typeFormals;
-    int count = params1.length;
-    if (params2.length != count) {
-      return null;
-    }
-    // We build up a substitution matching up the type parameters
-    // from the two types, {variablesFresh/variables1} and
-    // {variablesFresh/variables2}
-    List<DartType> variables1 = <DartType>[];
-    List<DartType> variables2 = <DartType>[];
-    List<DartType> variablesFresh = <DartType>[];
-    for (int i = 0; i < count; i++) {
-      TypeParameterElement p1 = params1[i];
-      TypeParameterElement p2 = params2[i];
-      TypeParameterElementImpl pFresh =
-          new TypeParameterElementImpl.synthetic(p2.name);
-
-      DartType variable1 = p1.type;
-      DartType variable2 = p2.type;
-      DartType variableFresh = new TypeParameterTypeImpl(pFresh);
-
-      variables1.add(variable1);
-      variables2.add(variable2);
-      variablesFresh.add(variableFresh);
-      DartType bound1 = p1.bound ?? DynamicTypeImpl.instance;
-      DartType bound2 = p2.bound ?? DynamicTypeImpl.instance;
-      bound1 = bound1.substitute2(variablesFresh, variables1);
-      bound2 = bound2.substitute2(variablesFresh, variables2);
-      pFresh.bound = bound2;
-      if (!relation(bound2, bound1)) {
-        return null;
-      }
-    }
-    return variablesFresh;
-  }
-
-  /**
    * Compares two function types [t] and [s] to see if their corresponding
    * parameter types match [parameterRelation] and their return types match
    * [returnRelation].
@@ -920,7 +867,6 @@
       bool parameterRelation(DartType t, DartType s),
       FunctionType instantiateToBounds(FunctionType t),
       {bool returnRelation(DartType t, DartType s)}) {
-
     returnRelation ??= parameterRelation;
 
     // Trivial base cases.
@@ -1024,6 +970,56 @@
   }
 
   /**
+   * Given two functions [f1] and [f2] where f1 and f2 are known to be
+   * generic function types (both have type formals), this checks that they
+   * have the same number of formals, and that those formals have bounds
+   * (e.g. `<T extends LowerBound>`) that satisfy [relation].
+   *
+   * The return value will be a new list of fresh type variables, that can be
+   * used to instantiate both function types, allowing further comparison.
+   * For example, given `<T>T -> T` and `<U>U -> U` we can instantiate them with
+   * `F` to get `F -> F` and `F -> F`, which we can see are equal.
+   */
+  static List<DartType> relateTypeFormals(
+      FunctionType f1, FunctionType f2, bool relation(DartType t, DartType s)) {
+    List<TypeParameterElement> params1 = f1.typeFormals;
+    List<TypeParameterElement> params2 = f2.typeFormals;
+    int count = params1.length;
+    if (params2.length != count) {
+      return null;
+    }
+    // We build up a substitution matching up the type parameters
+    // from the two types, {variablesFresh/variables1} and
+    // {variablesFresh/variables2}
+    List<DartType> variables1 = <DartType>[];
+    List<DartType> variables2 = <DartType>[];
+    List<DartType> variablesFresh = <DartType>[];
+    for (int i = 0; i < count; i++) {
+      TypeParameterElement p1 = params1[i];
+      TypeParameterElement p2 = params2[i];
+      TypeParameterElementImpl pFresh =
+          new TypeParameterElementImpl.synthetic(p2.name);
+
+      DartType variable1 = p1.type;
+      DartType variable2 = p2.type;
+      DartType variableFresh = new TypeParameterTypeImpl(pFresh);
+
+      variables1.add(variable1);
+      variables2.add(variable2);
+      variablesFresh.add(variableFresh);
+      DartType bound1 = p1.bound ?? DynamicTypeImpl.instance;
+      DartType bound2 = p2.bound ?? DynamicTypeImpl.instance;
+      bound1 = bound1.substitute2(variablesFresh, variables1);
+      bound2 = bound2.substitute2(variablesFresh, variables2);
+      pFresh.bound = bound2;
+      if (!relation(bound2, bound1)) {
+        return null;
+      }
+    }
+    return variablesFresh;
+  }
+
+  /**
    * Return `true` if all of the name/type pairs in the first map ([firstTypes])
    * are equal to the corresponding name/type pairs in the second map
    * ([secondTypes]). The maps are expected to iterate over their entries in the
@@ -1313,6 +1309,10 @@
       PropertyAccessorMember.from(element.getSetter(setterName), this);
 
   @override
+  InterfaceTypeImpl instantiate(List<DartType> argumentTypes) =>
+      substitute2(argumentTypes, typeArguments);
+
+  @override
   bool isDirectSupertypeOf(InterfaceType type) {
     InterfaceType i = this;
     InterfaceType j = type;
@@ -1732,9 +1732,10 @@
     return newType;
   }
 
+  @deprecated
   @override
   InterfaceTypeImpl substitute4(List<DartType> argumentTypes) =>
-      substitute2(argumentTypes, typeArguments);
+      instantiate(argumentTypes);
 
   /**
    * Starting from this type, search its class hierarchy for types of the form
@@ -1827,6 +1828,62 @@
       _computeSuperinterfaceSet(type, new HashSet<InterfaceType>());
 
   /**
+   * If there is a single type which is at least as specific as all of the
+   * types in [types], return it.  Otherwise return `null`.
+   */
+  static DartType findMostSpecificType(
+      List<DartType> types, TypeSystem typeSystem) {
+    // The << relation ("more specific than") is a partial ordering on types,
+    // so to find the most specific type of a set, we keep a bucket of the most
+    // specific types seen so far such that no type in the bucket is more
+    // specific than any other type in the bucket.
+    List<DartType> bucket = <DartType>[];
+
+    // Then we consider each type in turn.
+    for (DartType type in types) {
+      // If any existing type in the bucket is more specific than this type,
+      // then we can ignore this type.
+      if (bucket.any((DartType t) => typeSystem.isMoreSpecificThan(t, type))) {
+        continue;
+      }
+      // Otherwise, we need to add this type to the bucket and remove any types
+      // that are less specific than it.
+      bool added = false;
+      int i = 0;
+      while (i < bucket.length) {
+        if (typeSystem.isMoreSpecificThan(type, bucket[i])) {
+          if (added) {
+            if (i < bucket.length - 1) {
+              bucket[i] = bucket.removeLast();
+            } else {
+              bucket.removeLast();
+            }
+          } else {
+            bucket[i] = type;
+            i++;
+            added = true;
+          }
+        } else {
+          i++;
+        }
+      }
+      if (!added) {
+        bucket.add(type);
+      }
+    }
+
+    // Now that we are finished, if there is exactly one type left in the
+    // bucket, it is the most specific type.
+    if (bucket.length == 1) {
+      return bucket[0];
+    }
+
+    // Otherwise, there is no single type that is more specific than the
+    // others.
+    return null;
+  }
+
+  /**
    * Returns a "smart" version of the "least upper bound" of the given types.
    *
    * If these types have the same element and differ only in terms of the type
@@ -1920,62 +1977,6 @@
   }
 
   /**
-   * If there is a single type which is at least as specific as all of the
-   * types in [types], return it.  Otherwise return `null`.
-   */
-  static DartType findMostSpecificType(
-      List<DartType> types, TypeSystem typeSystem) {
-    // The << relation ("more specific than") is a partial ordering on types,
-    // so to find the most specific type of a set, we keep a bucket of the most
-    // specific types seen so far such that no type in the bucket is more
-    // specific than any other type in the bucket.
-    List<DartType> bucket = <DartType>[];
-
-    // Then we consider each type in turn.
-    for (DartType type in types) {
-      // If any existing type in the bucket is more specific than this type,
-      // then we can ignore this type.
-      if (bucket.any((DartType t) => typeSystem.isMoreSpecificThan(t, type))) {
-        continue;
-      }
-      // Otherwise, we need to add this type to the bucket and remove any types
-      // that are less specific than it.
-      bool added = false;
-      int i = 0;
-      while (i < bucket.length) {
-        if (typeSystem.isMoreSpecificThan(type, bucket[i])) {
-          if (added) {
-            if (i < bucket.length - 1) {
-              bucket[i] = bucket.removeLast();
-            } else {
-              bucket.removeLast();
-            }
-          } else {
-            bucket[i] = type;
-            i++;
-            added = true;
-          }
-        } else {
-          i++;
-        }
-      }
-      if (!added) {
-        bucket.add(type);
-      }
-    }
-
-    // Now that we are finished, if there is exactly one type left in the
-    // bucket, it is the most specific type.
-    if (bucket.length == 1) {
-      return bucket[0];
-    }
-
-    // Otherwise, there is no single type that is more specific than the
-    // others.
-    return null;
-  }
-
-  /**
    * Return the intersection of the [first] and [second] sets of types, where
    * intersection is based on the equality of the types themselves.
    */
@@ -2217,6 +2218,9 @@
    */
   TypeImpl pruned(List<FunctionTypeAliasElement> prune);
 
+  @override
+  DartType resolveToBound(DartType objectType) => this;
+
   /**
    * Return the type resulting from substituting the given [argumentTypes] for
    * the given [parameterTypes] in this type.
@@ -2232,9 +2236,6 @@
       [List<FunctionTypeAliasElement> prune]);
 
   @override
-  DartType resolveToBound(DartType objectType) => this;
-
-  @override
   String toString() {
     StringBuffer buffer = new StringBuffer();
     appendTo(buffer);
@@ -2372,6 +2373,15 @@
   TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
 
   @override
+  DartType resolveToBound(DartType objectType) {
+    if (element.bound == null) {
+      return objectType;
+    }
+
+    return element.bound.resolveToBound(objectType);
+  }
+
+  @override
   DartType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes,
       [List<FunctionTypeAliasElement> prune]) {
@@ -2400,15 +2410,6 @@
     }
     return types;
   }
-
-  @override
-  DartType resolveToBound(DartType objectType) {
-    if (element.bound == null) {
-      return objectType;
-    }
-
-    return element.bound.resolveToBound(objectType);
-  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/error.dart b/pkg/analyzer/lib/src/error.dart
index 166ba13..f39d1ae 100644
--- a/pkg/analyzer/lib/src/error.dart
+++ b/pkg/analyzer/lib/src/error.dart
@@ -26,7 +26,9 @@
 
     // Print a less friendly string representation to ensure that
     // error.source.contents is not executed, as .contents it isn't async
-    builder.write("Error in ${error.source.shortName}: ${error.message}");
+    String sourceName = error.source.shortName;
+    sourceName ??= '<unknown source>';
+    builder.write("Error in $sourceName: ${error.message}");
 
 //    var content = error.source.contents.data;
 //    var beforeError = content.substring(0, error.offset);
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 8d4de8e..db35618 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -1734,7 +1734,7 @@
         elementType = type;
       }
     }
-    InterfaceType listType = _typeProvider.listType.substitute4([elementType]);
+    InterfaceType listType = _typeProvider.listType.instantiate([elementType]);
     return new DartObjectImpl(listType, new ListState(elements));
   }
 
@@ -1774,7 +1774,7 @@
       }
     }
     InterfaceType mapType =
-        _typeProvider.mapType.substitute4([keyType, valueType]);
+        _typeProvider.mapType.instantiate([keyType, valueType]);
     return new DartObjectImpl(mapType, new MapState(map));
   }
 
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 57d35d9..60b1acf 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -514,9 +514,16 @@
   bool isServerLibrary(Source librarySource);
 
   /**
+   * Return the stream that is notified when a result with the given
+   * [descriptor] is changed, e.g. computed or invalidated.
+   */
+  Stream<ResultChangedEvent> onResultChanged(ResultDescriptor descriptor);
+
+  /**
    * Return the stream that is notified when a new value for the given
    * [descriptor] is computed.
    */
+  @deprecated
   Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor);
 
   /**
@@ -545,7 +552,7 @@
    * analysis results. This method can be long running.
    *
    * The implementation that uses the task model notifies subscribers of
-   * [onResultComputed] about computed results.
+   * [onResultChanged] about computed results.
    *
    * The following results are computed for Dart sources.
    *
@@ -1282,6 +1289,7 @@
     dart2jsHint = options.dart2jsHint;
     enableAssertMessage = options.enableAssertMessage;
     enableAsync = options.enableAsync;
+    enableConditionalDirectives = options.enableConditionalDirectives;
     enableStrictCallChecks = options.enableStrictCallChecks;
     enableGenericMethods = options.enableGenericMethods;
     enableSuperMixins = options.enableSuperMixins;
@@ -1841,6 +1849,7 @@
 /**
  * [ComputedResult] describes a value computed for a [ResultDescriptor].
  */
+@deprecated
 class ComputedResult<V> {
   /**
    * The context in which the value was computed.
@@ -1865,7 +1874,7 @@
   ComputedResult(this.context, this.descriptor, this.target, this.value);
 
   @override
-  String toString() => '$descriptor of $target in $context';
+  String toString() => 'Computed $descriptor of $target in $context';
 }
 
 /**
@@ -2408,6 +2417,57 @@
 }
 
 /**
+ * [ResultChangedEvent] describes a change to an analysis result.
+ */
+class ResultChangedEvent<V> {
+  /**
+   * The context in which the result was changed.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The target for which the result was changed.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * The descriptor of the result which was changed.
+   */
+  final ResultDescriptor<V> descriptor;
+
+  /**
+   * If the result [wasComputed], the new value of the result. If the result
+   * [wasInvalidated], the value of before it was invalidated, may be the
+   * default value if the result was flushed.
+   */
+  final V value;
+
+  /**
+   * Is `true` if the result was computed, or `false` is is was invalidated.
+   */
+  final bool _wasComputed;
+
+  ResultChangedEvent(this.context, this.target, this.descriptor, this.value,
+      this._wasComputed);
+
+  /**
+   * Returns `true` if the result was computed.
+   */
+  bool get wasComputed => _wasComputed;
+
+  /**
+   * Returns `true` if the result was invalidated.
+   */
+  bool get wasInvalidated => !_wasComputed;
+
+  @override
+  String toString() {
+    String operation = _wasComputed ? 'Computed' : 'Invalidated';
+    return '$operation $descriptor of $target in $context';
+  }
+}
+
+/**
  * [SourcesChangedEvent] indicates which sources have been added, removed,
  * or whose contents have changed.
  */
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 59879fc..7d77680 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -2743,6 +2743,8 @@
     StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
     StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
     StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+    StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
+    StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
     StaticWarningCode.AMBIGUOUS_IMPORT,
     StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
     StaticWarningCode.ASSIGNMENT_TO_CONST,
@@ -3435,9 +3437,8 @@
    * 0: the name of the actual argument type
    * 1: the name of the expected type
    */
-  static const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const HintCode(
-      'ARGUMENT_TYPE_NOT_ASSIGNABLE',
-      "The argument type '{0}' cannot be assigned to the parameter type '{1}'");
+  static const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE =
+      shared_messages.ARGUMENT_TYPE_NOT_ASSIGNABLE_HINT;
 
   /**
    * When the target expression uses '?.' operator, it can be `null`, so all the
@@ -3568,6 +3569,18 @@
       "Either add a return statement or change the return type to 'void'");
 
   /**
+   * Generate a hint for methods that override methods annotated `@mustCallSuper`
+   * that do not invoke the overridden super method.
+   *
+   * Parameters:
+   * 0: the name of the class declaring the overriden method
+   */
+  static const HintCode MUST_CALL_SUPER = const HintCode(
+      'MUST_CALL_SUPER',
+      "This method overrides a method annotated as @mustCall super in '{0}', "
+          "but does invoke the overriden method");
+
+  /**
    * A condition in a control flow statement could evaluate to `null` because it
    * uses the null-aware '?.' operator.
    */
@@ -3630,8 +3643,8 @@
    * 0: the name of the getter
    * 1: the name of the enclosing type where the getter is being looked for
    */
-  static const HintCode UNDEFINED_GETTER = const HintCode('UNDEFINED_GETTER',
-      "The getter '{0}' is not defined for the class '{1}'");
+  static const HintCode UNDEFINED_GETTER =
+      shared_messages.UNDEFINED_GETTER_HINT;
 
   /**
    * This hint is generated anywhere where the
@@ -3642,8 +3655,8 @@
    * 0: the name of the method that is undefined
    * 1: the resolved type name that the method lookup is happening on
    */
-  static const HintCode UNDEFINED_METHOD = const HintCode('UNDEFINED_METHOD',
-      "The method '{0}' is not defined for the class '{1}'");
+  static const HintCode UNDEFINED_METHOD =
+      shared_messages.UNDEFINED_METHOD_HINT;
 
   /**
    * This hint is generated anywhere where the
@@ -3654,9 +3667,8 @@
    * 0: the name of the operator
    * 1: the name of the enclosing type where the operator is being looked for
    */
-  static const HintCode UNDEFINED_OPERATOR = const HintCode(
-      'UNDEFINED_OPERATOR',
-      "The operator '{0}' is not defined for the class '{1}'");
+  static const HintCode UNDEFINED_OPERATOR =
+      shared_messages.UNDEFINED_OPERATOR_HINT;
 
   /**
    * This hint is generated anywhere where the
@@ -3668,8 +3680,8 @@
    * 0: the name of the setter
    * 1: the name of the enclosing type where the setter is being looked for
    */
-  static const HintCode UNDEFINED_SETTER = const HintCode('UNDEFINED_SETTER',
-      "The setter '{0}' is not defined for the class '{1}'");
+  static const HintCode UNDEFINED_SETTER =
+      shared_messages.UNDEFINED_SETTER_HINT;
 
   /**
    * Unnecessary cast.
@@ -4125,8 +4137,7 @@
    * 2: the name of the method
    */
   static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE =
-      const StaticTypeWarningCode('RETURN_OF_INVALID_TYPE',
-          "The return type '{0}' is not a '{1}', as defined by the method '{2}'");
+      shared_messages.RETURN_OF_INVALID_TYPE;
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type
@@ -4183,8 +4194,7 @@
    * 1: the name of the enumeration used to access the constant
    */
   static const StaticTypeWarningCode UNDEFINED_ENUM_CONSTANT =
-      const StaticTypeWarningCode('UNDEFINED_ENUM_CONSTANT',
-          "There is no constant named '{0}' in '{1}'");
+      shared_messages.UNDEFINED_ENUM_CONSTANT;
 
   /**
    * 12.15.3 Unqualified Invocation: If there exists a lexically visible
@@ -4199,8 +4209,7 @@
    * 0: the name of the method that is undefined
    */
   static const StaticTypeWarningCode UNDEFINED_FUNCTION =
-      const StaticTypeWarningCode(
-          'UNDEFINED_FUNCTION', "The function '{0}' is not defined");
+      shared_messages.UNDEFINED_FUNCTION;
 
   /**
    * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
@@ -4211,8 +4220,7 @@
    * 1: the name of the enclosing type where the getter is being looked for
    */
   static const StaticTypeWarningCode UNDEFINED_GETTER =
-      const StaticTypeWarningCode('UNDEFINED_GETTER',
-          "The getter '{0}' is not defined for the class '{1}'");
+      shared_messages.UNDEFINED_GETTER_STATIC_TYPE_WARNING;
 
   /**
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
@@ -4224,8 +4232,7 @@
    * 1: the resolved type name that the method lookup is happening on
    */
   static const StaticTypeWarningCode UNDEFINED_METHOD =
-      const StaticTypeWarningCode('UNDEFINED_METHOD',
-          "The method '{0}' is not defined for the class '{1}'");
+      shared_messages.UNDEFINED_METHOD_STATIC_TYPE_WARNING;
 
   /**
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
@@ -4237,10 +4244,7 @@
    * 1: the resolved type name that the method lookup is happening on
    */
   static const StaticTypeWarningCode UNDEFINED_METHOD_WITH_CONSTRUCTOR =
-      const StaticTypeWarningCode(
-          'UNDEFINED_METHOD_WITH_CONSTRUCTOR',
-          "The method '{0}' is not defined for the class '{1}', but a constructor with that name is defined",
-          "Add 'new' or 'const' to invoke the constuctor, or change the method name.");
+      shared_messages.UNDEFINED_METHOD_WITH_CONSTRUCTOR;
 
   /**
    * 12.18 Assignment: Evaluation of an assignment of the form
@@ -4263,8 +4267,7 @@
    * 1: the name of the enclosing type where the operator is being looked for
    */
   static const StaticTypeWarningCode UNDEFINED_OPERATOR =
-      const StaticTypeWarningCode('UNDEFINED_OPERATOR',
-          "The operator '{0}' is not defined for the class '{1}'");
+      shared_messages.UNDEFINED_OPERATOR_STATIC_TYPE_WARNING;
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
@@ -4278,8 +4281,7 @@
    * See [INACCESSIBLE_SETTER].
    */
   static const StaticTypeWarningCode UNDEFINED_SETTER =
-      const StaticTypeWarningCode('UNDEFINED_SETTER',
-          "The setter '{0}' is not defined for the class '{1}'");
+      shared_messages.UNDEFINED_SETTER_STATIC_TYPE_WARNING;
 
   /**
    * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
@@ -4290,8 +4292,7 @@
    * 1: the name of the enclosing type where the getter is being looked for
    */
   static const StaticTypeWarningCode UNDEFINED_SUPER_GETTER =
-      const StaticTypeWarningCode('UNDEFINED_SUPER_GETTER',
-          "The getter '{0}' is not defined in a superclass of '{1}'");
+      shared_messages.UNDEFINED_SUPER_GETTER_STATIC_TYPE_WARNING;
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -4305,8 +4306,7 @@
    * 1: the resolved type name that the method lookup is happening on
    */
   static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD =
-      const StaticTypeWarningCode('UNDEFINED_SUPER_METHOD',
-          "The method '{0}' is not defined in a superclass of '{1}'");
+      shared_messages.UNDEFINED_SUPER_METHOD;
 
   /**
    * 12.18 Assignment: Evaluation of an assignment of the form
@@ -4329,8 +4329,7 @@
    * 1: the name of the enclosing type where the operator is being looked for
    */
   static const StaticTypeWarningCode UNDEFINED_SUPER_OPERATOR =
-      const StaticTypeWarningCode('UNDEFINED_SUPER_OPERATOR',
-          "The operator '{0}' is not defined in a superclass of '{1}'");
+      shared_messages.UNDEFINED_SUPER_OPERATOR;
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
@@ -4344,8 +4343,7 @@
    * See [INACCESSIBLE_SETTER].
    */
   static const StaticTypeWarningCode UNDEFINED_SUPER_SETTER =
-      const StaticTypeWarningCode('UNDEFINED_SUPER_SETTER',
-          "The setter '{0}' is not defined in a superclass of '{1}'");
+      shared_messages.UNDEFINED_SUPER_SETTER_STATIC_TYPE_WARNING;
 
   /**
    * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
@@ -4400,6 +4398,32 @@
           "The type '{0}' implied by the 'yield' expression must be assignable to '{1}'");
 
   /**
+   * 17.6.2 For-in. If the iterable expression does not implement Iterable,
+   * this warning is reported.
+   *
+   * Parameters:
+   * 0: The type of the iterable expression.
+   * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
+   */
+  static const StaticTypeWarningCode FOR_IN_OF_INVALID_TYPE =
+  const StaticTypeWarningCode('FOR_IN_OF_INVALID_TYPE',
+      "The type '{0}' used in the 'for' loop must implement {1}");
+
+  /**
+   * 17.6.2 For-in. It the iterable expression does not implement Iterable with
+   * a type argument that can be assigned to the for-in variable's type, this
+   * warning is reported.
+   *
+   * Parameters:
+   * 0: The type of the iterable expression.
+   * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
+   * 2: The loop variable type.
+   */
+  static const StaticTypeWarningCode FOR_IN_OF_INVALID_ELEMENT_TYPE =
+      const StaticTypeWarningCode('FOR_IN_OF_INVALID_ELEMENT_TYPE',
+          "The type '{0}' used in the 'for' loop must implement {1} with a type argument that can be assigned to '{2}'");
+
+  /**
    * Initialize a newly created error code to have the given [name]. The message
    * associated with the error will be created from the given [message]
    * template. The correction associated with the error will be created from the
@@ -4472,8 +4496,7 @@
    * 1: the name of the expected type
    */
   static const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE =
-      const StaticWarningCode('ARGUMENT_TYPE_NOT_ASSIGNABLE',
-          "The argument type '{0}' cannot be assigned to the parameter type '{1}'");
+      shared_messages.ARGUMENT_TYPE_NOT_ASSIGNABLE_STATIC_WARNING;
 
   /**
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause
@@ -5547,9 +5570,8 @@
    * 0: the name of the getter
    * 1: the name of the enclosing type where the getter is being looked for
    */
-  static const StaticWarningCode UNDEFINED_GETTER = const StaticWarningCode(
-      'UNDEFINED_GETTER',
-      "The getter '{0}' is not defined for the class '{1}'");
+  static const StaticWarningCode UNDEFINED_GETTER =
+      shared_messages.UNDEFINED_GETTER_STATIC_WARNING;
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier
@@ -5592,9 +5614,8 @@
    * 0: the name of the getter
    * 1: the name of the enclosing type where the setter is being looked for
    */
-  static const StaticWarningCode UNDEFINED_SETTER = const StaticWarningCode(
-      'UNDEFINED_SETTER',
-      "The setter '{0}' is not defined for the class '{1}'");
+  static const StaticWarningCode UNDEFINED_SETTER =
+      shared_messages.UNDEFINED_SETTER_STATIC_WARNING;
 
   /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not
@@ -5618,8 +5639,7 @@
    * 1: the name of the enclosing type where the getter is being looked for
    */
   static const StaticWarningCode UNDEFINED_SUPER_GETTER =
-      const StaticWarningCode('UNDEFINED_SUPER_GETTER',
-          "The getter '{0}' is not defined in a superclass of '{1}'");
+      shared_messages.UNDEFINED_SUPER_GETTER_STATIC_WARNING;
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form
@@ -5637,8 +5657,7 @@
    * 1: the name of the enclosing type where the setter is being looked for
    */
   static const StaticWarningCode UNDEFINED_SUPER_SETTER =
-      const StaticWarningCode('UNDEFINED_SUPER_SETTER',
-          "The setter '{0}' is not defined in a superclass of '{1}'");
+      shared_messages.UNDEFINED_SUPER_SETTER_STATIC_WARNING;
 
   /**
    * 7.2 Getters: It is a static warning if the return type of a getter is void.
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 32b4d31..7d0c52b 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -9,11 +9,11 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/visitor.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -356,8 +356,7 @@
   Object visitBinaryExpression(BinaryExpression node) {
     Token operator = node.operator;
     TokenType type = operator.type;
-    if (type == TokenType.AMPERSAND_AMPERSAND ||
-        type == TokenType.BAR_BAR) {
+    if (type == TokenType.AMPERSAND_AMPERSAND || type == TokenType.BAR_BAR) {
       String lexeme = operator.lexeme;
       _checkForAssignability(node.leftOperand, _boolType,
           StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
@@ -690,6 +689,12 @@
   }
 
   @override
+  Object visitForEachStatement(ForEachStatement node) {
+    _checkForInIterable(node);
+    return super.visitForEachStatement(node);
+  }
+
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -897,6 +902,7 @@
       _checkForAllInvalidOverrideErrorCodesForMethod(node);
       _checkForTypeAnnotationDeferredClass(returnTypeName);
       _checkForIllegalReturnType(returnTypeName);
+      _checkForMustCallSuper(node);
       return super.visitMethodDeclaration(node);
     } finally {
       _enclosingFunction = previousFunction;
@@ -2842,8 +2848,7 @@
     if (type.element.isAbstract) {
       ConstructorElement element = expression.staticElement;
       if (element != null && !element.isFactory) {
-        if ((expression.keyword as KeywordToken).keyword ==
-            Keyword.CONST) {
+        if ((expression.keyword as KeywordToken).keyword == Keyword.CONST) {
           _errorReporter.reportErrorForNode(
               StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName);
         } else {
@@ -4418,6 +4423,18 @@
     return numSuperInitializers > 0;
   }
 
+  void _checkForMustCallSuper(MethodDeclaration node) {
+    MethodElement element = _findOverriddenMemberThatMustCallSuper(node);
+    if (element != null) {
+      _InvocationCollector collector = new _InvocationCollector();
+      node.accept(collector);
+      if (!collector.superCalls.contains(element.name)) {
+        _errorReporter.reportErrorForNode(HintCode.MUST_CALL_SUPER, node.name,
+            [element.enclosingElement.name]);
+      }
+    }
+  }
+
   /**
    * Checks to ensure that the given native function [body] is in SDK code.
    *
@@ -5652,16 +5669,65 @@
   }
 
   /**
+   * Check for a type mis-match between the iterable expression and the
+   * assigned variable in a for-in statement.
+   */
+  void _checkForInIterable(ForEachStatement node) {
+    // Ignore malformed for statements.
+    if (node.identifier == null && node.loopVariable == null) {
+      return;
+    }
+
+    DartType iterableType = getStaticType(node.iterable);
+    if (iterableType.isDynamic) {
+      return;
+    }
+
+    // The type of the loop variable.
+    SimpleIdentifier variable = node.identifier != null
+        ? node.identifier
+        : node.loopVariable.identifier;
+    DartType variableType = getStaticType(variable);
+
+    DartType loopType = node.awaitKeyword != null
+        ? _typeProvider.streamType
+        : _typeProvider.iterableType;
+
+    // Use an explicit string instead of [loopType] to remove the "<E>".
+    String loopTypeName = node.awaitKeyword != null
+        ? "Stream"
+        : "Iterable";
+
+    // The object being iterated has to implement Iterable<T> for some T that
+    // is assignable to the variable's type.
+    // TODO(rnystrom): Move this into mostSpecificTypeArgument()?
+    iterableType = iterableType.resolveToBound(_typeProvider.objectType);
+    DartType bestIterableType = _typeSystem.mostSpecificTypeArgument(
+        iterableType, loopType);
+    if (bestIterableType == null) {
+      _errorReporter.reportTypeErrorForNode(
+          StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
+          node,
+          [iterableType, loopTypeName]);
+    } else if (!_typeSystem.isAssignableTo(bestIterableType, variableType)) {
+      _errorReporter.reportTypeErrorForNode(
+          StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
+          node,
+          [iterableType, loopTypeName, variableType]);
+    }
+  }
+
+  /**
    * Check for a type mis-match between the yielded type and the declared
    * return type of a generator function.
    *
    * This method should only be called in generator functions.
    */
-  bool _checkForYieldOfInvalidType(
+  void _checkForYieldOfInvalidType(
       Expression yieldExpression, bool isYieldEach) {
     assert(_inGenerator);
     if (_enclosingFunction == null) {
-      return false;
+      return;
     }
     DartType declaredReturnType = _enclosingFunction.returnType;
     DartType staticYieldedType = getStaticType(yieldExpression);
@@ -5670,17 +5736,17 @@
       impliedReturnType = staticYieldedType;
     } else if (_enclosingFunction.isAsynchronous) {
       impliedReturnType =
-          _typeProvider.streamType.substitute4(<DartType>[staticYieldedType]);
+          _typeProvider.streamType.instantiate(<DartType>[staticYieldedType]);
     } else {
       impliedReturnType =
-          _typeProvider.iterableType.substitute4(<DartType>[staticYieldedType]);
+          _typeProvider.iterableType.instantiate(<DartType>[staticYieldedType]);
     }
     if (!_typeSystem.isAssignableTo(impliedReturnType, declaredReturnType)) {
       _errorReporter.reportTypeErrorForNode(
           StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
           yieldExpression,
           [impliedReturnType, declaredReturnType]);
-      return true;
+      return;
     }
     if (isYieldEach) {
       // Since the declared return type might have been "dynamic", we need to
@@ -5697,10 +5763,9 @@
             StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
             yieldExpression,
             [impliedReturnType, requiredReturnType]);
-        return true;
+        return;
       }
     }
-    return false;
   }
 
   /**
@@ -5783,12 +5848,29 @@
     }
     DartType staticReturnType = getStaticType(returnExpression);
     if (staticReturnType != null && _enclosingFunction.isAsynchronous) {
-      return _typeProvider.futureType.substitute4(
+      return _typeProvider.futureType.instantiate(
           <DartType>[staticReturnType.flattenFutures(_typeSystem)]);
     }
     return staticReturnType;
   }
 
+  MethodElement _findOverriddenMemberThatMustCallSuper(MethodDeclaration node) {
+    ExecutableElement overriddenMember = _getOverriddenMember(node.element);
+    List<ExecutableElement> seen = <ExecutableElement>[];
+    while (
+        overriddenMember is MethodElement && !seen.contains(overriddenMember)) {
+      for (ElementAnnotation annotation in overriddenMember.metadata) {
+        if (annotation.isMustCallSuper) {
+          return overriddenMember;
+        }
+      }
+      seen.add(overriddenMember);
+      // Keep looking up the chain.
+      overriddenMember = _getOverriddenMember(overriddenMember);
+    }
+    return null;
+  }
+
   /**
    * Return the error code that should be used when the given class [element]
    * references itself directly.
@@ -5839,6 +5921,19 @@
     }
   }
 
+  ExecutableElement _getOverriddenMember(Element member) {
+    if (member == null || _inheritanceManager == null) {
+      return null;
+    }
+
+    ClassElement classElement =
+        member.getAncestor((element) => element is ClassElement);
+    if (classElement == null) {
+      return null;
+    }
+    return _inheritanceManager.lookupInheritance(classElement, member.name);
+  }
+
   /**
    * Return the type of the first and only parameter of the given [setter].
    */
@@ -6222,3 +6317,17 @@
     }
   }
 }
+
+/**
+ * Recursively visits an AST, looking for method invocations.
+ */
+class _InvocationCollector extends RecursiveAstVisitor {
+  final List<String> superCalls = <String>[];
+
+  @override
+  visitMethodInvocation(MethodInvocation node) {
+    if (node.target is SuperExpression) {
+      superCalls.add(node.methodName.name);
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/generated/generated/shared_messages.dart b/pkg/analyzer/lib/src/generated/generated/shared_messages.dart
index c0be1d2..249e939 100644
--- a/pkg/analyzer/lib/src/generated/generated/shared_messages.dart
+++ b/pkg/analyzer/lib/src/generated/generated/shared_messages.dart
@@ -24,32 +24,32 @@
 
 const ParserErrorCode CONST_CLASS = const ParserErrorCode(
     'CONST_CLASS',
-    "Classes can't be declared to be 'const'",
+    "Classes can't be declared to be 'const'.",
     "Try removing the 'const' keyword or moving to the class' constructor(s).");  // Generated. Don't edit.
 
 const ParserErrorCode CONST_METHOD = const ParserErrorCode(
     'CONST_METHOD',
-    "Getters, setters and methods can't be declared to be 'const'",
+    "Getters, setters and methods can't be declared to be 'const'.",
     "Try removing the 'const' keyword.");  // Generated. Don't edit.
 
 const ParserErrorCode CONST_ENUM = const ParserErrorCode(
     'CONST_ENUM',
-    "Enums can't be declared to be 'const'",
+    "Enums can't be declared to be 'const'.",
     "Try removing the 'const' keyword.");  // Generated. Don't edit.
 
 const ParserErrorCode CONST_TYPEDEF = const ParserErrorCode(
     'CONST_TYPEDEF',
-    "Type aliases can't be declared to be 'const'",
+    "Type aliases can't be declared to be 'const'.",
     "Try removing the 'const' keyword.");  // Generated. Don't edit.
 
 const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode(
     'CONST_AND_FINAL',
-    "Members can't be declared to be both 'const' and 'final'",
+    "Members can't be declared to be both 'const' and 'final'.",
     "Try removing either the 'const' or 'final' keyword.");  // Generated. Don't edit.
 
 const ParserErrorCode CONST_AND_VAR = const ParserErrorCode(
     'CONST_AND_VAR',
-    "Members can't be declared to be both 'const' and 'var'",
+    "Members can't be declared to be both 'const' and 'var'.",
     "Try removing either the 'const' or 'var' keyword.");  // Generated. Don't edit.
 
 const ParserErrorCode CLASS_IN_CLASS = const ParserErrorCode(
@@ -59,7 +59,7 @@
 
 const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = const ParserErrorCode(
     'CONSTRUCTOR_WITH_RETURN_TYPE',
-    "Constructors can't have a return type",
+    "Constructors can't have a return type.",
     "Try removing the return type.");  // Generated. Don't edit.
 
 const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode(
@@ -69,7 +69,7 @@
 
 const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode(
     'RETHROW_OUTSIDE_CATCH',
-    "Rethrow must be inside of catch clause",
+    "Rethrow must be inside of catch clause.",
     "Try moving the expression into a catch clause, or using a 'throw' expression.");  // Generated. Don't edit.
 
 const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode(
@@ -80,4 +80,114 @@
 const CompileTimeErrorCode RETURN_IN_GENERATOR = const CompileTimeErrorCode(
     'RETURN_IN_GENERATOR',
     "Can't return a value from a generator function (using the '{0}' modifier).",
-    "Try removing the value, replacing 'return' with 'yield' or changing the method body modifier");  // Generated. Don't edit.
+    "Try removing the value, replacing 'return' with 'yield' or changing the method body modifier.");  // Generated. Don't edit.
+
+const StaticTypeWarningCode RETURN_OF_INVALID_TYPE = const StaticTypeWarningCode(
+    'RETURN_OF_INVALID_TYPE',
+    "The return type '{0}' is not a '{1}', as defined by the method '{2}'.",
+    null);  // Generated. Don't edit.
+
+const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE_HINT = const HintCode(
+    'ARGUMENT_TYPE_NOT_ASSIGNABLE',
+    "The argument type '{0}' cannot be assigned to the parameter type '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE_STATIC_WARNING = const StaticWarningCode(
+    'ARGUMENT_TYPE_NOT_ASSIGNABLE',
+    "The argument type '{0}' cannot be assigned to the parameter type '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_METHOD_STATIC_TYPE_WARNING = const StaticTypeWarningCode(
+    'UNDEFINED_METHOD',
+    "The method '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const HintCode UNDEFINED_METHOD_HINT = const HintCode(
+    'UNDEFINED_METHOD',
+    "The method '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_METHOD_WITH_CONSTRUCTOR = const StaticTypeWarningCode(
+    'UNDEFINED_METHOD_WITH_CONSTRUCTOR',
+    "The method '{0}' is not defined for the class '{1}', but a constructor with that name is defined.",
+    "Try adding 'new' or 'const' to invoke the constuctor, or change the method name.");  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_GETTER_STATIC_TYPE_WARNING = const StaticTypeWarningCode(
+    'UNDEFINED_GETTER',
+    "The getter '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticWarningCode UNDEFINED_GETTER_STATIC_WARNING = const StaticWarningCode(
+    'UNDEFINED_GETTER',
+    "The getter '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const HintCode UNDEFINED_GETTER_HINT = const HintCode(
+    'UNDEFINED_GETTER',
+    "The getter '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_ENUM_CONSTANT = const StaticTypeWarningCode(
+    'UNDEFINED_ENUM_CONSTANT',
+    "There is no constant named '{0}' in '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_OPERATOR_STATIC_TYPE_WARNING = const StaticTypeWarningCode(
+    'UNDEFINED_OPERATOR',
+    "The operator '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const HintCode UNDEFINED_OPERATOR_HINT = const HintCode(
+    'UNDEFINED_OPERATOR',
+    "The operator '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_SETTER_STATIC_TYPE_WARNING = const StaticTypeWarningCode(
+    'UNDEFINED_SETTER',
+    "The setter '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticWarningCode UNDEFINED_SETTER_STATIC_WARNING = const StaticWarningCode(
+    'UNDEFINED_SETTER',
+    "The setter '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const HintCode UNDEFINED_SETTER_HINT = const HintCode(
+    'UNDEFINED_SETTER',
+    "The setter '{0}' is not defined for the class '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_SUPER_GETTER_STATIC_TYPE_WARNING = const StaticTypeWarningCode(
+    'UNDEFINED_SUPER_GETTER',
+    "The getter '{0}' is not defined in a superclass of '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticWarningCode UNDEFINED_SUPER_GETTER_STATIC_WARNING = const StaticWarningCode(
+    'UNDEFINED_SUPER_GETTER',
+    "The getter '{0}' is not defined in a superclass of '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_SUPER_METHOD = const StaticTypeWarningCode(
+    'UNDEFINED_SUPER_METHOD',
+    "The method '{0}' is not defined in a superclass of '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_SUPER_OPERATOR = const StaticTypeWarningCode(
+    'UNDEFINED_SUPER_OPERATOR',
+    "The operator '{0}' is not defined in a superclass of '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_SUPER_SETTER_STATIC_TYPE_WARNING = const StaticTypeWarningCode(
+    'UNDEFINED_SUPER_SETTER',
+    "The setter '{0}' is not defined in a superclass of '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticWarningCode UNDEFINED_SUPER_SETTER_STATIC_WARNING = const StaticWarningCode(
+    'UNDEFINED_SUPER_SETTER',
+    "The setter '{0}' is not defined in a superclass of '{1}'.",
+    null);  // Generated. Don't edit.
+
+const StaticTypeWarningCode UNDEFINED_FUNCTION = const StaticTypeWarningCode(
+    'UNDEFINED_FUNCTION',
+    "The function '{0}' is not defined.",
+    null);  // Generated. Don't edit.
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart b/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
index cf2c0dd..78b0355 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
@@ -36,7 +36,7 @@
 class _SameResolutionValidator implements AstVisitor {
   final bool validateTypes;
 
-  /// The expected node to compare with the visted node.
+  /// The expected node to compare with the visited node.
   AstNode other;
 
   _SameResolutionValidator(this.validateTypes, this.other);
@@ -848,13 +848,19 @@
     if (a == null && b == null) {
       return;
     }
-    if (a.nameOffset != b.nameOffset) {
-      _fail('Expected: ${b.nameOffset}\n  Actual: ${a.nameOffset}');
+    _verifyEqual('nameOffset', a.nameOffset, b.nameOffset);
+    if (a is ElementImpl && b is ElementImpl) {
+      _verifyEqual('codeOffset', a.codeOffset, b.codeOffset);
+      _verifyEqual('codeLength', a.codeLength, b.codeLength);
     }
     if (a is LocalElement && b is LocalElement) {
-      if (a.visibleRange != b.visibleRange) {
-        _fail('Expected: ${b.visibleRange}\nActual: ${a.visibleRange}');
-      }
+      _verifyEqual('visibleRange', a.visibleRange, b.visibleRange);
+    }
+  }
+
+  void _verifyEqual(String name, actual, expected) {
+    if (actual != expected) {
+      _fail('$name\nExpected: $expected\n  Actual: $actual');
     }
   }
 
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index fc8c860..9f4e419 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -2087,6 +2087,22 @@
         }
       }
     }
+    // code range
+    if (element is ElementImpl) {
+      int oldOffset = element.codeOffset;
+      int oldLength = element.codeLength;
+      if (oldOffset != null) {
+        int newOffset = oldOffset;
+        int newLength = oldLength;
+        newOffset += oldOffset > updateOffset ? updateDelta : 0;
+        if (oldOffset <= updateOffset && updateOffset < oldOffset + oldLength) {
+          newLength += updateDelta;
+        }
+        if (newOffset != oldOffset || newLength != oldLength) {
+          element.setCodeRange(newOffset, newLength);
+        }
+      }
+    }
     // visible range
     if (element is LocalElement) {
       SourceRange visibleRange = element.visibleRange;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 491d391..dce4507 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -36,6 +36,26 @@
 export 'package:analyzer/src/generated/type_system.dart';
 
 /**
+ * Throw an [ElementMismatchException] to report that the element model and the
+ * AST do not match. The [message] will have the path to the given [node]
+ * appended to it.
+ */
+void _mismatch(String message, AstNode node) {
+  StringBuffer buffer = new StringBuffer();
+  buffer.writeln(message);
+  buffer.write('Path to root:');
+  String separator = ' ';
+  AstNode parent = node;
+  while (parent != null) {
+    buffer.write(separator);
+    buffer.write(parent.runtimeType.toString());
+    separator = ', ';
+    parent = parent.parent;
+  }
+  throw new ElementMismatchException(buffer.toString());
+}
+
+/**
  * Instances of the class `BestPracticesVerifier` traverse an AST structure looking for
  * violations of Dart best practices.
  */
@@ -2119,6 +2139,11 @@
 /**
  * A visitor that resolves declarations in an AST structure to already built
  * elements.
+ *
+ * The resulting AST must have everything resolved that would have been resolved
+ * by a [CompilationUnitBuilder] (that is, must be a valid [RESOLVED_UNIT1]).
+ * This class must not assume that the [CompilationUnitElement] passed to it is
+ * any more complete than a [COMPILATION_UNIT_ELEMENT].
  */
 class DeclarationResolver extends RecursiveAstVisitor<Object> {
   /**
@@ -2135,7 +2160,7 @@
   /**
    * The compilation unit containing the AST nodes being visited.
    */
-  CompilationUnitElement _enclosingUnit;
+  CompilationUnitElementImpl _enclosingUnit;
 
   /**
    * The function type alias containing the AST nodes being visited, or `null`
@@ -2200,7 +2225,7 @@
       SimpleIdentifier className = node.name;
       _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
       super.visitClassDeclaration(node);
-      _resolveMetadata(node.metadata, _enclosingClass);
+      _resolveMetadata(node, node.metadata, _enclosingClass);
       return null;
     } finally {
       _enclosingClass = outerClass;
@@ -2214,7 +2239,7 @@
       SimpleIdentifier className = node.name;
       _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
       super.visitClassTypeAlias(node);
-      _resolveMetadata(node.metadata, _enclosingClass);
+      _resolveMetadata(node, node.metadata, _enclosingClass);
       return null;
     } finally {
       _enclosingClass = outerClass;
@@ -2244,7 +2269,7 @@
       _expectedElements.remove(_enclosingExecutable);
       node.element = _enclosingExecutable as ConstructorElement;
       super.visitConstructorDeclaration(node);
-      _resolveMetadata(node.metadata, _enclosingExecutable);
+      _resolveMetadata(node, node.metadata, _enclosingExecutable);
       return null;
     } finally {
       _enclosingExecutable = outerExecutable;
@@ -2257,7 +2282,7 @@
     Element element =
         _findIdentifier(_enclosingExecutable.localVariables, variableName);
     super.visitDeclaredIdentifier(node);
-    _resolveMetadata(node.metadata, element);
+    _resolveMetadata(node, node.metadata, element);
     return null;
   }
 
@@ -2279,7 +2304,7 @@
     try {
       _enclosingParameter = element;
       super.visitDefaultFormalParameter(node);
-      _resolveMetadata(node.metadata, element);
+      _resolveMetadata(node, node.metadata, element);
       return null;
     } finally {
       _enclosingParameter = outerParameter;
@@ -2295,30 +2320,22 @@
       _findIdentifier(constants, constant.name);
     }
     super.visitEnumDeclaration(node);
-    _resolveMetadata(node.metadata, enclosingEnum);
+    _resolveMetadata(node, node.metadata, enclosingEnum);
     return null;
   }
 
   @override
   Object visitExportDirective(ExportDirective node) {
-    String uri = _getStringValue(node.uri);
-    ExportElement exportElement;
-    if (uri != null) {
-      LibraryElement library = _enclosingUnit.library;
-      Source source = _enclosingUnit.context.sourceFactory
-          .resolveUri(_enclosingUnit.source, uri);
-      exportElement = _findExport(node, library.exports, source);
-      node.element = exportElement;
-    }
     super.visitExportDirective(node);
-    _resolveMetadata(node.metadata, exportElement);
+    _resolveAnnotations(
+        node, node.metadata, _enclosingUnit.getAnnotations(node.offset));
     return null;
   }
 
   @override
   Object visitFieldDeclaration(FieldDeclaration node) {
     super.visitFieldDeclaration(node);
-    _resolveMetadata(node.metadata, node.fields.variables[0].element);
+    _resolveMetadata(node, node.metadata, node.fields.variables[0].element);
     return null;
   }
 
@@ -2331,7 +2348,7 @@
       try {
         _enclosingParameter = element;
         super.visitFieldFormalParameter(node);
-        _resolveMetadata(node.metadata, element);
+        _resolveMetadata(node, node.metadata, element);
         return null;
       } finally {
         _enclosingParameter = outerParameter;
@@ -2380,7 +2397,7 @@
       }
       node.functionExpression.element = _enclosingExecutable;
       super.visitFunctionDeclaration(node);
-      _resolveMetadata(node.metadata, _enclosingExecutable);
+      _resolveMetadata(node, node.metadata, _enclosingExecutable);
       return null;
     } finally {
       _enclosingExecutable = outerExecutable;
@@ -2412,7 +2429,7 @@
       _enclosingAlias =
           _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
       super.visitFunctionTypeAlias(node);
-      _resolveMetadata(node.metadata, _enclosingAlias);
+      _resolveMetadata(node, node.metadata, _enclosingAlias);
       return null;
     } finally {
       _enclosingAlias = outerAlias;
@@ -2428,7 +2445,7 @@
       try {
         _enclosingParameter = element;
         super.visitFunctionTypedFormalParameter(node);
-        _resolveMetadata(node.metadata, _enclosingParameter);
+        _resolveMetadata(node, node.metadata, _enclosingParameter);
         return null;
       } finally {
         _enclosingParameter = outerParameter;
@@ -2440,17 +2457,9 @@
 
   @override
   Object visitImportDirective(ImportDirective node) {
-    String uri = _getStringValue(node.uri);
-    ImportElement importElement;
-    if (uri != null) {
-      LibraryElement library = _enclosingUnit.library;
-      Source source = _enclosingUnit.context.sourceFactory
-          .resolveUri(_enclosingUnit.source, uri);
-      importElement = _findImport(node, library.imports, source);
-      node.element = importElement;
-    }
     super.visitImportDirective(node);
-    _resolveMetadata(node.metadata, importElement);
+    _resolveAnnotations(
+        node, node.metadata, _enclosingUnit.getAnnotations(node.offset));
     return null;
   }
 
@@ -2465,10 +2474,9 @@
 
   @override
   Object visitLibraryDirective(LibraryDirective node) {
-    LibraryElement libraryElement = _enclosingUnit.library;
-    node.element = libraryElement;
     super.visitLibraryDirective(node);
-    _resolveMetadata(node.metadata, libraryElement);
+    _resolveAnnotations(
+        node, node.metadata, _enclosingUnit.getAnnotations(node.offset));
     return null;
   }
 
@@ -2500,7 +2508,7 @@
         _enclosingExecutable = accessor;
       }
       super.visitMethodDeclaration(node);
-      _resolveMetadata(node.metadata, _enclosingExecutable);
+      _resolveMetadata(node, node.metadata, _enclosingExecutable);
       return null;
     } finally {
       _enclosingExecutable = outerExecutable;
@@ -2509,16 +2517,9 @@
 
   @override
   Object visitPartDirective(PartDirective node) {
-    String uri = _getStringValue(node.uri);
-    CompilationUnitElement compilationUnitElement;
-    if (uri != null) {
-      Source partSource = _enclosingUnit.context.sourceFactory
-          .resolveUri(_enclosingUnit.source, uri);
-      compilationUnitElement =
-          _findPart(_enclosingUnit.library.parts, node, partSource);
-    }
     super.visitPartDirective(node);
-    _resolveMetadata(node.metadata, compilationUnitElement);
+    _resolveAnnotations(
+        node, node.metadata, _enclosingUnit.getAnnotations(node.offset));
     return null;
   }
 
@@ -2537,7 +2538,7 @@
       try {
         _enclosingParameter = element;
         super.visitSimpleFormalParameter(node);
-        _resolveMetadata(node.metadata, element);
+        _resolveMetadata(node, node.metadata, element);
         return null;
       } finally {
         _enclosingParameter = outerParameter;
@@ -2567,7 +2568,7 @@
   @override
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     super.visitTopLevelVariableDeclaration(node);
-    _resolveMetadata(node.metadata, node.variables.variables[0].element);
+    _resolveMetadata(node, node.metadata, node.variables.variables[0].element);
     return null;
   }
 
@@ -2596,7 +2597,7 @@
           'Could not find type parameter with name "$name" at $offset', node);
     }
     super.visitTypeParameter(node);
-    _resolveMetadata(node.metadata, element);
+    _resolveMetadata(node, node.metadata, element);
     return null;
   }
 
@@ -2634,7 +2635,7 @@
     super.visitVariableDeclarationList(node);
     if (node.parent is! FieldDeclaration &&
         node.parent is! TopLevelVariableDeclaration) {
-      _resolveMetadata(node.metadata, node.variables[0].element);
+      _resolveMetadata(node, node.metadata, node.variables[0].element);
     }
     return null;
   }
@@ -2651,25 +2652,6 @@
       _findWithNameAndOffset(elements, node, '', offset);
 
   /**
-   * Return the export element from the given list of [exports] whose library
-   * has the given [source]. Throw an [ElementMismatchException] if an element
-   * corresponding to the identifier cannot be found.
-   */
-  ExportElement _findExport(
-      ExportDirective node, List<ExportElement> exports, Source source) {
-    if (source == null || !_context.exists(source)) {
-      return null;
-    }
-    for (ExportElement export in exports) {
-      if (export.exportedLibrary.source == source) {
-        return export;
-      }
-    }
-    _mismatch("Could not find export element for '$source'", node);
-    return null; // Never reached
-  }
-
-  /**
    * Return the element in the given list of [elements] that was created for the
    * declaration with the given [identifier]. As a side-effect, associate the
    * returned element with the identifier. Throw an [ElementMismatchException]
@@ -2687,64 +2669,6 @@
   }
 
   /**
-   * Return the import element from the given list of [imports] whose library
-   * has the given [source]. Throw an [ElementMismatchException] if an element
-   * corresponding to the [source] cannot be found.
-   */
-  ImportElement _findImport(
-      ImportDirective node, List<ImportElement> imports, Source source) {
-    if (source == null || !_context.exists(source)) {
-      return null;
-    }
-    SimpleIdentifier prefix = node.prefix;
-    bool foundSource = false;
-    for (ImportElement element in imports) {
-      if (element.importedLibrary.source == source) {
-        foundSource = true;
-        PrefixElement prefixElement = element.prefix;
-        if (prefix == null) {
-          if (prefixElement == null) {
-            return element;
-          }
-        } else {
-          if (prefixElement != null &&
-              prefix.name == prefixElement.displayName) {
-            return element;
-          }
-        }
-      }
-    }
-    if (foundSource) {
-      if (prefix == null) {
-        _mismatch(
-            "Could not find import element for '$source' with no prefix", node);
-      }
-      _mismatch(
-          "Could not find import element for '$source' with prefix ${prefix.name}",
-          node);
-    }
-    _mismatch("Could not find import element for '$source'", node);
-    return null; // Never reached
-  }
-
-  /**
-   * Return the element in the given list of [parts] that was created for the
-   * part with the given [source]. Throw an [ElementMismatchException] if an
-   * element corresponding to the source cannot be found.
-   */
-  CompilationUnitElement _findPart(List<CompilationUnitElement> parts,
-      PartDirective directive, Source source) {
-    for (CompilationUnitElement part in parts) {
-      if (part.source == source) {
-        return part;
-      }
-    }
-    _mismatch(
-        'Could not find compilation unit element for "$source"', directive);
-    return null; // Never reached
-  }
-
-  /**
    * Return the element in the given list of [elements] that was created for the
    * declaration with the given [name] at the given [offset]. Throw an
    * [ElementMismatchException] if an element corresponding to the identifier
@@ -2811,51 +2735,37 @@
   }
 
   /**
-   * Return the value of the given string [literal], or `null` if the string is
-   * not a constant string without any string interpolation.
+   * Associate each of the annotation [nodes] with the corresponding
+   * [ElementAnnotation] in [annotations]. If there is a problem, report it
+   * against the given [parent] node.
    */
-  String _getStringValue(StringLiteral literal) {
-    if (literal is StringInterpolation) {
-      return null;
+  void _resolveAnnotations(AstNode parent, NodeList<Annotation> nodes,
+      List<ElementAnnotation> annotations) {
+    int nodeCount = nodes.length;
+    if (nodeCount != annotations.length) {
+      _mismatch(
+          'Found $nodeCount annotation nodes and '
+          '${annotations.length} element annotations',
+          parent);
     }
-    return literal.stringValue;
+    for (int i = 0; i < nodeCount; i++) {
+      nodes[i].elementAnnotation = annotations[i];
+    }
   }
 
   /**
-   * Throw an [ElementMismatchException] to report that the element model and
-   * the AST do not match. The [message] will have the path to the given [node]
-   * appended to it.
-   */
-  void _mismatch(String message, AstNode node) {
-    StringBuffer buffer = new StringBuffer();
-    buffer.writeln(message);
-    buffer.write('Path to root:');
-    String separator = ' ';
-    AstNode parent = node;
-    while (parent != null) {
-      buffer.write(separator);
-      buffer.write(parent.runtimeType.toString());
-      separator = ', ';
-      parent = parent.parent;
-    }
-    throw new ElementMismatchException(buffer.toString());
-  }
-
-  /**
-   * If [element] is not `null`, associate each [Annotation] in [astMetadata]
-   * with the corresponding [ElementAnnotation] in [element.metadata].
+   * If [element] is not `null`, associate each of the annotation [nodes] with
+   * the corresponding [ElementAnnotation] in [element.metadata]. If there is a
+   * problem, report it against the given [parent] node.
    *
    * If [element] is `null`, do nothing--this allows us to be robust in the
    * case where we are operating on an element model that hasn't been fully
    * built.
    */
-  void _resolveMetadata(NodeList<Annotation> astMetadata, Element element) {
+  void _resolveMetadata(
+      AstNode parent, NodeList<Annotation> nodes, Element element) {
     if (element != null) {
-      List<ElementAnnotation> elementMetadata = element.metadata;
-      assert(astMetadata.length == elementMetadata.length);
-      for (int i = 0; i < astMetadata.length; i++) {
-        astMetadata[i].elementAnnotation = elementMetadata[i];
-      }
+      _resolveAnnotations(parent, nodes, element.metadata);
     }
   }
 
@@ -2878,6 +2788,129 @@
 }
 
 /**
+ * A visitor that resolves directives in an AST structure to already built
+ * elements.
+ *
+ * The resulting AST must have everything resolved that would have been resolved
+ * by a [DirectiveElementBuilder].
+ */
+class DirectiveResolver extends SimpleAstVisitor {
+  CompilationUnitElementImpl _enclosingUnit;
+
+  @override
+  void visitCompilationUnit(CompilationUnit node) {
+    _enclosingUnit = node.element;
+    for (Directive directive in node.directives) {
+      directive.accept(this);
+    }
+  }
+
+  @override
+  void visitExportDirective(ExportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      Source source = _enclosingUnit.context.sourceFactory
+          .resolveUri(_enclosingUnit.source, uri);
+      ExportElement exportElement = _findExport(node, library.exports, source);
+      node.element = exportElement;
+    } else {
+      node.element = null;
+    }
+  }
+
+  @override
+  void visitImportDirective(ImportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      Source source = _enclosingUnit.context.sourceFactory
+          .resolveUri(_enclosingUnit.source, uri);
+      ImportElement importElement = _findImport(node, library.imports, source);
+      node.element = importElement;
+    } else {
+      node.element = null;
+    }
+  }
+
+  @override
+  void visitLibraryDirective(LibraryDirective node) {
+    node.element = _enclosingUnit.library;
+  }
+
+  /**
+   * Return the export element from the given list of [exports] whose library
+   * has the given [source]. Throw an [ElementMismatchException] if an element
+   * corresponding to the identifier cannot be found.
+   */
+  ExportElement _findExport(
+      ExportDirective node, List<ExportElement> exports, Source source) {
+    if (source == null || !_enclosingUnit.context.exists(source)) {
+      return null;
+    }
+    for (ExportElement export in exports) {
+      if (export.exportedLibrary.source == source) {
+        return export;
+      }
+    }
+    _mismatch("Could not find export element for '$source'", node);
+    return null; // Never reached
+  }
+
+  /**
+   * Return the import element from the given list of [imports] whose library
+   * has the given [source]. Throw an [ElementMismatchException] if an element
+   * corresponding to the [source] cannot be found.
+   */
+  ImportElement _findImport(
+      ImportDirective node, List<ImportElement> imports, Source source) {
+    if (source == null || !_enclosingUnit.context.exists(source)) {
+      return null;
+    }
+    SimpleIdentifier prefix = node.prefix;
+    bool foundSource = false;
+    for (ImportElement element in imports) {
+      if (element.importedLibrary.source == source) {
+        foundSource = true;
+        PrefixElement prefixElement = element.prefix;
+        if (prefix == null) {
+          if (prefixElement == null) {
+            return element;
+          }
+        } else {
+          if (prefixElement != null &&
+              prefix.name == prefixElement.displayName) {
+            return element;
+          }
+        }
+      }
+    }
+    if (foundSource) {
+      if (prefix == null) {
+        _mismatch(
+            "Could not find import element for '$source' with no prefix", node);
+      }
+      _mismatch(
+          "Could not find import element for '$source' with prefix ${prefix.name}",
+          node);
+    }
+    _mismatch("Could not find any import element for '$source'", node);
+    return null; // Never reached
+  }
+
+  /**
+   * Return the value of the given string [literal], or `null` if the string is
+   * not a constant string without any string interpolation.
+   */
+  String _getStringValue(StringLiteral literal) {
+    if (literal is StringInterpolation) {
+      return null;
+    }
+    return literal.stringValue;
+  }
+}
+
+/**
  * Instances of the class `ElementHolder` hold on to elements created while traversing an AST
  * structure so that they can be accessed when creating their enclosing element.
  */
@@ -3255,6 +3288,7 @@
   /**
    * The scope in which this scope is lexically enclosed.
    */
+  @override
   final Scope enclosingScope;
 
   /**
@@ -3363,7 +3397,7 @@
     valuesField.static = true;
     valuesField.const3 = true;
     valuesField.synthetic = true;
-    valuesField.type = _typeProvider.listType.substitute4(<DartType>[enumType]);
+    valuesField.type = _typeProvider.listType.instantiate(<DartType>[enumType]);
     fields.add(valuesField);
     getters.add(_createGetter(valuesField));
     //
@@ -3374,13 +3408,7 @@
     int constantCount = constants.length;
     for (int i = 0; i < constantCount; i++) {
       EnumConstantDeclaration constant = constants[i];
-      SimpleIdentifier constantName = constant.name;
-      FieldElementImpl constantField =
-          new ConstFieldElementImpl.forNode(constantName);
-      constantField.static = true;
-      constantField.const3 = true;
-      constantField.type = enumType;
-      setElementDocumentationComment(constantField, constant);
+      FieldElementImpl constantField = constant.name.staticElement;
       //
       // Create a value for the constant.
       //
@@ -3392,8 +3420,7 @@
       constantValues.add(value);
       constantField.evaluationResult = new EvaluationResultImpl(value);
       fields.add(constantField);
-      getters.add(_createGetter(constantField));
-      constantName.staticElement = constantField;
+      getters.add(constantField.getter);
     }
     //
     // Build the value of the 'values' field.
@@ -4886,7 +4913,7 @@
     if (!match(t1.element.type, null)) {
       return null;
     }
-    DartType newT1 = t1.element.type.substitute4(actuals);
+    DartType newT1 = t1.element.type.instantiate(actuals);
     // If we found a solution, return it.
     if (_typeSystem.isSubtypeOf(newT1, t2)) {
       return actuals;
@@ -6046,6 +6073,7 @@
   /**
    * The listener that is to be informed when an error is encountered.
    */
+  @override
   final AnalysisErrorListener errorListener;
 
   /**
@@ -7243,6 +7271,7 @@
    * The class element representing the class containing the current node,
    * or `null` if the current node is not contained in a class.
    */
+  @override
   ClassElement enclosingClass = null;
 
   /**
@@ -7718,7 +7747,7 @@
     DartType contextType = InferenceContext.getType(node);
     if (contextType != null) {
       InterfaceType futureT = typeProvider.futureType
-          .substitute4([contextType.flattenFutures(typeSystem)]);
+          .instantiate([contextType.flattenFutures(typeSystem)]);
       InferenceContext.setType(node.expression, futureT);
     }
     return super.visitAwaitExpression(node);
@@ -8156,7 +8185,7 @@
           ? typeProvider.iterableType
           : typeProvider.streamType;
       InferenceContext.setType(
-          iterable, targetType.substitute4([loopVariable.type.type]));
+          iterable, targetType.instantiate([loopVariable.type.type]));
     }
     safelyVisit(iterable);
     safelyVisit(loopVariable);
@@ -8424,12 +8453,12 @@
       targs = node.typeArguments.arguments.map((t) => t.type).toList();
     } else if (contextType is InterfaceType) {
       InterfaceType listD =
-          typeProvider.listType.substitute4([typeProvider.dynamicType]);
+          typeProvider.listType.instantiate([typeProvider.dynamicType]);
       targs = inferenceContext.matchTypes(listD, contextType);
     }
     if (targs != null && targs.length == 1 && !targs[0].isDynamic) {
       DartType eType = targs[0];
-      InterfaceType listT = typeProvider.listType.substitute4([eType]);
+      InterfaceType listT = typeProvider.listType.instantiate([eType]);
       for (Expression child in node.elements) {
         InferenceContext.setType(child, eType);
       }
@@ -8449,13 +8478,13 @@
       targs = node.typeArguments.arguments.map((t) => t.type).toList();
     } else if (contextType is InterfaceType) {
       InterfaceType mapD = typeProvider.mapType
-          .substitute4([typeProvider.dynamicType, typeProvider.dynamicType]);
+          .instantiate([typeProvider.dynamicType, typeProvider.dynamicType]);
       targs = inferenceContext.matchTypes(mapD, contextType);
     }
     if (targs != null && targs.length == 2 && targs.any((t) => !t.isDynamic)) {
       DartType kType = targs[0];
       DartType vType = targs[1];
-      InterfaceType mapT = typeProvider.mapType.substitute4([kType, vType]);
+      InterfaceType mapT = typeProvider.mapType.instantiate([kType, vType]);
       for (MapLiteralEntry entry in node.entries) {
         InferenceContext.setType(entry.key, kType);
         InferenceContext.setType(entry.value, vType);
@@ -8718,7 +8747,7 @@
         InterfaceType wrapperType = _enclosingFunction.isSynchronous
             ? typeProvider.iterableType
             : typeProvider.streamType;
-        type = wrapperType.substitute4(<DartType>[type]);
+        type = wrapperType.instantiate(<DartType>[type]);
       }
       InferenceContext.setType(e, type);
     }
@@ -8732,9 +8761,7 @@
         InterfaceType wrapperType = _enclosingFunction.isSynchronous
             ? typeProvider.iterableType
             : typeProvider.streamType;
-        List<DartType> candidates =
-            _findImplementedTypeArgument(type, wrapperType);
-        type = InterfaceTypeImpl.findMostSpecificType(candidates, typeSystem);
+        type = typeSystem.mostSpecificTypeArgument(type, wrapperType);
       }
       if (type != null) {
         inferenceContext.addReturnOrYieldType(type);
@@ -8806,39 +8833,6 @@
   }
 
   /**
-   * Starting from t1, search its class hierarchy for types of the form
-   * `t2<R>`, and return a list of the resulting R's.
-   *
-   * For example, given t1 = `List<int>` and t2 = `Iterable<T>`, this will
-   * return [int].
-   */
-  // TODO(jmesserly): this is very similar to code used for flattening futures.
-  // The only difference is, because of a lack of TypeProvider, the other method
-  // has to match the Future type by its name and library. Here was are passed
-  // in the correct type.
-  List<DartType> _findImplementedTypeArgument(DartType t1, InterfaceType t2) {
-    List<DartType> result = <DartType>[];
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
-    void recurse(InterfaceTypeImpl type) {
-      if (type.element == t2.element && type.typeArguments.isNotEmpty) {
-        result.add(type.typeArguments[0]);
-      }
-      if (visitedClasses.add(type.element)) {
-        if (type.superclass != null) {
-          recurse(type.superclass);
-        }
-        type.mixins.forEach(recurse);
-        type.interfaces.forEach(recurse);
-        visitedClasses.remove(type.element);
-      }
-    }
-    if (t1 is InterfaceType) {
-      recurse(t1);
-    }
-    return result;
-  }
-
-  /**
    * The given expression is the expression used to compute the iterator for a
    * for-each statement. Attempt to compute the type of objects that will be
    * assigned to the loop variable and return that type. Return `null` if the
@@ -11248,10 +11242,10 @@
     _symbolType = _getType(coreNamespace, "Symbol");
     _typeType = _getType(coreNamespace, "Type");
     _undefinedType = UndefinedTypeImpl.instance;
-    _futureDynamicType = _futureType.substitute4(<DartType>[_dynamicType]);
-    _futureNullType = _futureType.substitute4(<DartType>[_nullType]);
-    _iterableDynamicType = _iterableType.substitute4(<DartType>[_dynamicType]);
-    _streamDynamicType = _streamType.substitute4(<DartType>[_dynamicType]);
+    _futureDynamicType = _futureType.instantiate(<DartType>[_dynamicType]);
+    _futureNullType = _futureType.instantiate(<DartType>[_nullType]);
+    _iterableDynamicType = _iterableType.instantiate(<DartType>[_dynamicType]);
+    _streamDynamicType = _streamType.instantiate(<DartType>[_dynamicType]);
   }
 }
 
@@ -11283,6 +11277,11 @@
   bool _strongMode;
 
   /**
+   * Type type system in use for this resolver pass.
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * Initialize a newly created visitor to resolve the nodes in an AST node.
    *
    * [definingLibrary] is the element for the library containing the node being
@@ -11305,6 +11304,7 @@
     _dynamicType = typeProvider.dynamicType;
     _undefinedType = typeProvider.undefinedType;
     _strongMode = definingLibrary.context.analysisOptions.strongMode;
+    _typeSystem = TypeSystem.create(definingLibrary.context);
   }
 
   @override
@@ -11853,7 +11853,7 @@
     if (argumentList != null) {
       NodeList<TypeName> arguments = argumentList.arguments;
       int argumentCount = arguments.length;
-      List<DartType> parameters = _getTypeParameters(type);
+      List<DartType> parameters = _typeSystem.typeFormalsAsTypes(type);
       int parameterCount = parameters.length;
       List<DartType> typeArguments = new List<DartType>(parameterCount);
       if (argumentCount == parameterCount) {
@@ -11872,22 +11872,9 @@
           typeArguments[i] = _dynamicType;
         }
       }
-      type = _instantiateType(type, typeArguments);
+      type = _typeSystem.instantiateType(type, typeArguments);
     } else {
-      //
-      // Check for the case where there are no type arguments given for a
-      // parameterized type.
-      //
-      List<DartType> parameters = _getTypeParameters(type);
-      int parameterCount = parameters.length;
-      if (parameterCount > 0) {
-        DynamicTypeImpl dynamicType = DynamicTypeImpl.instance;
-        List<DartType> arguments = new List<DartType>(parameterCount);
-        for (int i = 0; i < parameterCount; i++) {
-          arguments[i] = dynamicType;
-        }
-        type = _instantiateType(type, arguments);
-      }
+      type = _typeSystem.instantiateToBounds(type);
     }
     typeName.staticType = type;
     node.type = type;
@@ -12066,21 +12053,6 @@
   }
 
   /**
-   * Return the type arguments associated with the given type.
-   *
-   * @param type the type whole type arguments are to be returned
-   * @return the type arguments associated with the given type
-   */
-  List<DartType> _getTypeParameters(DartType type) {
-    if (type is InterfaceType) {
-      return type.typeArguments;
-    } else if (type is FunctionType) {
-      return TypeParameterTypeImpl.getTypes(type.typeFormals);
-    }
-    return DartType.EMPTY_LIST;
-  }
-
-  /**
    * Returns the simple identifier of the given (may be qualified) type name.
    *
    * @param typeName the (may be qualified) qualified type name
@@ -12128,21 +12100,6 @@
     }
   }
 
-  DartType _instantiateType(DartType type, List<DartType> typeArguments) {
-    // TODO(jmesserly): this should use TypeSystem.instantiateToBounds,
-    // from calling methods when they know they're just trying to fill in
-    // "dynamic" for the case of missing type arguments.
-
-    if (type is InterfaceTypeImpl) {
-      return type.substitute4(typeArguments);
-    } else if (type is FunctionTypeImpl) {
-      return type.instantiate(typeArguments);
-    } else {
-      // TODO(brianwilkerson) Report this internal error.
-      return type;
-    }
-  }
-
   /**
    * Checks if the given type name is used as the type in an as expression.
    *
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index b54bc04..12c9aac 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -635,13 +635,16 @@
         _resolver.inferenceContext.recordInference(node, contextType);
       } else if (node.elements.isNotEmpty) {
         // Infer the list type from the arguments.
+        // TODO(jmesserly): record inference here?
         staticType =
             node.elements.map((e) => e.staticType).reduce(_leastUpperBound);
-        // TODO(jmesserly): record inference here?
+        if (staticType.isBottom) {
+          staticType = _dynamicType;
+        }
       }
     }
     _recordStaticType(
-        node, _typeProvider.listType.substitute4(<DartType>[staticType]));
+        node, _typeProvider.listType.instantiate(<DartType>[staticType]));
     return null;
   }
 
@@ -686,18 +689,24 @@
         _resolver.inferenceContext.recordInference(node, contextType);
       } else if (node.entries.isNotEmpty) {
         // Infer the list type from the arguments.
+        // TODO(jmesserly): record inference here?
         staticKeyType =
             node.entries.map((e) => e.key.staticType).reduce(_leastUpperBound);
         staticValueType = node.entries
             .map((e) => e.value.staticType)
             .reduce(_leastUpperBound);
-        // TODO(jmesserly): record inference here?
+        if (staticKeyType.isBottom) {
+          staticKeyType = _dynamicType;
+        }
+        if (staticValueType.isBottom) {
+          staticValueType = _dynamicType;
+        }
       }
     }
     _recordStaticType(
         node,
         _typeProvider.mapType
-            .substitute4(<DartType>[staticKeyType, staticValueType]));
+            .instantiate(<DartType>[staticKeyType, staticValueType]));
     return null;
   }
 
@@ -787,7 +796,7 @@
               if (returnType != null) {
                 // prepare the type of the returned Future
                 InterfaceType newFutureType = _typeProvider.futureType
-                    .substitute4([returnType.flattenFutures(_typeSystem)]);
+                    .instantiate([returnType.flattenFutures(_typeSystem)]);
                 // set the 'then' invocation type
                 _resolver.recordPropagatedTypeIfBetter(node, newFutureType);
                 needPropagatedType = false;
@@ -1485,10 +1494,10 @@
       InterfaceType genericType = body.isAsynchronous
           ? _typeProvider.streamType
           : _typeProvider.iterableType;
-      return genericType.substitute4(<DartType>[type]);
+      return genericType.instantiate(<DartType>[type]);
     } else if (body.isAsynchronous) {
       return _typeProvider.futureType
-          .substitute4(<DartType>[type.flattenFutures(_typeSystem)]);
+          .instantiate(<DartType>[type.flattenFutures(_typeSystem)]);
     } else {
       return type;
     }
@@ -1604,7 +1613,7 @@
         if (returnType.typeParameters.isNotEmpty) {
           // Caller can't deal with unbound type parameters, so substitute
           // `dynamic`.
-          return returnType.type.substitute4(
+          return returnType.type.instantiate(
               returnType.typeParameters.map((_) => _dynamicType).toList());
         }
         return returnType.type;
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 2beeab4..9fd53dd 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -167,7 +167,7 @@
     FieldElementImpl valuesField = new FieldElementImpl("values", -1);
     valuesField.static = true;
     valuesField.const3 = true;
-    valuesField.type = typeProvider.listType.substitute4(<DartType>[enumType]);
+    valuesField.type = typeProvider.listType.instantiate(<DartType>[enumType]);
     fields.add(valuesField);
     //
     // Build the enum constants.
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index 06f4bee..bf2e130 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -248,7 +248,7 @@
   @override
   InterfaceType get futureDynamicType {
     if (_futureDynamicType == null) {
-      _futureDynamicType = futureType.substitute4(<DartType>[dynamicType]);
+      _futureDynamicType = futureType.instantiate(<DartType>[dynamicType]);
     }
     return _futureDynamicType;
   }
@@ -256,7 +256,7 @@
   @override
   InterfaceType get futureNullType {
     if (_futureNullType == null) {
-      _futureNullType = futureType.substitute4(<DartType>[nullType]);
+      _futureNullType = futureType.instantiate(<DartType>[nullType]);
     }
     return _futureNullType;
   }
@@ -291,7 +291,7 @@
   @override
   InterfaceType get iterableDynamicType {
     if (_iterableDynamicType == null) {
-      _iterableDynamicType = iterableType.substitute4(<DartType>[dynamicType]);
+      _iterableDynamicType = iterableType.instantiate(<DartType>[dynamicType]);
     }
     return _iterableDynamicType;
   }
@@ -305,7 +305,7 @@
       DartType eType = iterableElement.typeParameters[0].type;
       _setAccessors(iterableElement, <PropertyAccessorElement>[
         ElementFactory.getterElement(
-            "iterator", false, iteratorType.substitute4(<DartType>[eType])),
+            "iterator", false, iteratorType.instantiate(<DartType>[eType])),
         ElementFactory.getterElement("last", false, eType)
       ]);
       iterableElement.constructors = <ConstructorElement>[
@@ -345,7 +345,7 @@
       _listType = listElement.type;
       DartType eType = listElement.typeParameters[0].type;
       InterfaceType iterableType =
-          this.iterableType.substitute4(<DartType>[eType]);
+          this.iterableType.instantiate(<DartType>[eType]);
       listElement.interfaces = <InterfaceType>[iterableType];
       _setAccessors(listElement, <PropertyAccessorElement>[
         ElementFactory.getterElement("length", false, intType)
@@ -464,7 +464,7 @@
   @override
   InterfaceType get streamDynamicType {
     if (_streamDynamicType == null) {
-      _streamDynamicType = streamType.substitute4(<DartType>[dynamicType]);
+      _streamDynamicType = streamType.instantiate(<DartType>[dynamicType]);
     }
     return _streamDynamicType;
   }
@@ -486,7 +486,7 @@
         ElementFactory.getterElement("isEmpty", false, boolType),
         ElementFactory.getterElement("length", false, intType),
         ElementFactory.getterElement(
-            "codeUnits", false, listType.substitute4(<DartType>[intType]))
+            "codeUnits", false, listType.instantiate(<DartType>[intType]))
       ]);
       stringElement.methods = <MethodElement>[
         ElementFactory.methodElement("+", _stringType, [_stringType]),
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index ee4d0a1..ff70e89 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -21,11 +21,9 @@
  * Implementation of [TypeSystem] using the strong mode rules.
  * https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
  */
-class StrongTypeSystemImpl implements TypeSystem {
+class StrongTypeSystemImpl extends TypeSystem {
   final _specTypeSystem = new TypeSystemImpl();
 
-  StrongTypeSystemImpl();
-
   bool anyParameterType(FunctionType ft, bool predicate(DartType t)) {
     return ft.parameters.any((p) => predicate(p.type));
   }
@@ -52,6 +50,51 @@
     return _specTypeSystem.getLeastUpperBound(typeProvider, type1, type2);
   }
 
+  /**
+   * Given a generic function type `F<T0, T1, ... Tn>` and a context type C,
+   * infer an instantiation of F, such that `F<S0, S1, ..., Sn>` <: C.
+   *
+   * This is similar to [inferGenericFunctionCall], but the return type is also
+   * considered as part of the solution.
+   *
+   * If this function is called with a [contextType] that is also
+   * uninstantiated, or a [fnType] that is already instantiated, it will have
+   * no effect and return [fnType].
+   */
+  FunctionType inferFunctionTypeInstantiation(TypeProvider typeProvider,
+      FunctionType contextType, FunctionType fnType) {
+    if (contextType.typeFormals.isNotEmpty || fnType.typeFormals.isEmpty) {
+      return fnType;
+    }
+
+    // Create a TypeSystem that will allow certain type parameters to be
+    // inferred. It will optimistically assume these type parameters can be
+    // subtypes (or supertypes) as necessary, and track the constraints that
+    // are implied by this.
+    var inferringTypeSystem =
+        new _StrongInferenceTypeSystem(typeProvider, fnType.typeFormals);
+
+    // Since we're trying to infer the instantiation, we want to ignore type
+    // formals as we check the parameters and return type.
+    var inferFnType =
+        fnType.instantiate(TypeParameterTypeImpl.getTypes(fnType.typeFormals));
+    if (!inferringTypeSystem.isSubtypeOf(inferFnType, contextType)) {
+      return fnType;
+    }
+
+    // Try to infer and instantiate the resulting type.
+    var resultType =
+        inferringTypeSystem._infer(fnType, allowPartialSolution: false);
+
+    // If the instantiation failed (because some type variable constraints
+    // could not be solved, in other words, we could not find a valid subtype),
+    // then return the original type, so the error is in terms of it.
+    //
+    // It would be safe to return a partial solution here, but the user
+    // experience may be better if we simply do not infer in this case.
+    return resultType ?? fnType;
+  }
+
   /// Given a function type with generic type parameters, infer the type
   /// parameters from the actual argument types, and return the instantiated
   /// function type. If we can't, returns the original function type.
@@ -107,71 +150,31 @@
   }
 
   /**
-   * Given a generic function type `F<T0, T1, ... Tn>` and a context type C,
-   * infer an instantiation of F, such that `F<S0, S1, ..., Sn>` <: C.
-   *
-   * This is similar to [inferGenericFunctionCall], but the return type is also
-   * considered as part of the solution.
-   *
-   * If this function is called with a [contextType] that is also
-   * uninstantiated, or a [fnType] that is already instantiated, it will have
-   * no effect and return [fnType].
-   */
-  FunctionType inferFunctionTypeInstantiation(TypeProvider typeProvider,
-      FunctionType contextType, FunctionType fnType) {
-    if (contextType.typeFormals.isNotEmpty || fnType.typeFormals.isEmpty) {
-      return fnType;
-    }
-
-    // Create a TypeSystem that will allow certain type parameters to be
-    // inferred. It will optimistically assume these type parameters can be
-    // subtypes (or supertypes) as necessary, and track the constraints that
-    // are implied by this.
-    var inferringTypeSystem =
-        new _StrongInferenceTypeSystem(typeProvider, fnType.typeFormals);
-
-    // Since we're trying to infer the instantiation, we want to ignore type
-    // formals as we check the parameters and return type.
-    var inferFnType =
-        fnType.instantiate(TypeParameterTypeImpl.getTypes(fnType.typeFormals));
-    if (!inferringTypeSystem.isSubtypeOf(inferFnType, contextType)) {
-      return fnType;
-    }
-
-    // Try to infer and instantiate the resulting type.
-    var resultType =
-        inferringTypeSystem._infer(fnType, allowPartialSolution: false);
-
-    // If the instantiation failed (because some type variable constraints
-    // could not be solved, in other words, we could not find a valid subtype),
-    // then return the original type, so the error is in terms of it.
-    //
-    // It would be safe to return a partial solution here, but the user
-    // experience may be better if we simply do not infer in this case.
-    return resultType ?? fnType;
-  }
-
-  /**
-   * Given a [FunctionType] [function], of the form
-   * <T0 extends B0, ... Tn extends Bn>.F (where Bi is implicitly
-   * dynamic if absent, and F is a non-generic function type)
-   * compute {I0/T0, ..., In/Tn}F
+   * Given a [DartType] [type], if [type] is an uninstantiated
+   * parameterized type then instantiate the parameters to their
+   * bounds. Specifically, if [type] is of the form
+   * `<T0 extends B0, ... Tn extends Bn>.F` or
+   * `class C<T0 extends B0, ... Tn extends Bn> {...}`
+   * (where Bi is implicitly dynamic if absent),
+   * compute `{I0/T0, ..., In/Tn}F or C<I0, ..., In>` respectively
    * where I_(i+1) = {I0/T0, ..., Ii/Ti, dynamic/T_(i+1)}B_(i+1).
    * That is, we instantiate the generic with its bounds, replacing
    * each Ti in Bi with dynamic to get Ii, and then replacing Ti with
    * Ii in all of the remaining bounds.
    */
-  DartType instantiateToBounds(FunctionType function) {
-    int count = function.typeFormals.length;
+  DartType instantiateToBounds(DartType type) {
+    List<TypeParameterElement> typeFormals = typeFormalsAsElements(type);
+    int count = typeFormals.length;
     if (count == 0) {
-      return function;
+      return type;
     }
+
     // We build up a substitution replacing bound parameters with
     // their instantiated bounds, {substituted/variables}
     List<DartType> substituted = new List<DartType>();
     List<DartType> variables = new List<DartType>();
     for (int i = 0; i < count; i++) {
-      TypeParameterElement param = function.typeFormals[i];
+      TypeParameterElement param = typeFormals[i];
       DartType bound = param.bound ?? DynamicTypeImpl.instance;
       DartType variable = param.type;
       // For each Ti extends Bi, first compute Ii by replacing
@@ -183,7 +186,8 @@
       // of dynamic in subsequent rounds.
       substituted[i] = bound.substitute2(substituted, variables);
     }
-    return function.instantiate(substituted);
+
+    return instantiateType(type, substituted);
   }
 
   @override
@@ -460,13 +464,27 @@
       TypeProvider typeProvider, DartType type1, DartType type2);
 
   /**
-   * Given a [function] type, instantiate it with its bounds.
+   * Given a [DartType] [type], instantiate it with its bounds.
    *
    * The behavior of this method depends on the type system, for example, in
    * classic Dart `dynamic` will be used for all type arguments, whereas
    * strong mode prefers the actual bound type if it was specified.
    */
-  FunctionType instantiateToBounds(FunctionType function);
+  DartType instantiateToBounds(DartType type);
+
+  /**
+   * Given a [DartType] [type] and a list of types
+   * [typeArguments], instantiate the type formals with the
+   * provided actuals.  If [type] is not a parameterized type,
+   * no instantiation is done.
+   */
+  DartType instantiateType(DartType type, List<DartType> typeArguments) {
+    if (type is ParameterizedType) {
+      return type.instantiate(typeArguments);
+    } else {
+      return type;
+    }
+  }
 
   /**
    * Return `true` if the [leftType] is assignable to the [rightType] (that is,
@@ -489,6 +507,74 @@
   bool isSubtypeOf(DartType leftType, DartType rightType);
 
   /**
+   * Searches the superinterfaces of [type] for implementations of [genericType]
+   * and returns the most specific type argument used for that generic type.
+   *
+   * For example, given [type] `List<int>` and [genericType] `Iterable<T>`,
+   * returns [int].
+   *
+   * Returns `null` if [type] does not implement [genericType].
+   */
+  // TODO(jmesserly): this is very similar to code used for flattening futures.
+  // The only difference is, because of a lack of TypeProvider, the other method
+  // has to match the Future type by its name and library. Here was are passed
+  // in the correct type.
+  DartType mostSpecificTypeArgument(DartType type, DartType genericType) {
+    if (type is! InterfaceType) return null;
+
+    // Walk the superinterface hierarchy looking for [genericType].
+    List<DartType> candidates = <DartType>[];
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    void recurse(InterfaceTypeImpl interface) {
+      if (interface.element == genericType.element &&
+          interface.typeArguments.isNotEmpty) {
+        candidates.add(interface.typeArguments[0]);
+      }
+      if (visitedClasses.add(interface.element)) {
+        if (interface.superclass != null) {
+          recurse(interface.superclass);
+        }
+        interface.mixins.forEach(recurse);
+        interface.interfaces.forEach(recurse);
+        visitedClasses.remove(interface.element);
+      }
+    }
+
+    recurse(type);
+
+    // Since the interface may be implemented multiple times with different
+    // type arguments, choose the best one.
+    return InterfaceTypeImpl.findMostSpecificType(candidates, this);
+  }
+
+  /**
+   * Given a [DartType] type, return the [TypeParameterElement]s corresponding
+   * to its formal type parameters (if any).
+   *
+   * @param type the type whose type arguments are to be returned
+   * @return the type arguments associated with the given type
+   */
+  List<TypeParameterElement> typeFormalsAsElements(DartType type) {
+    if (type is FunctionType) {
+      return type.typeFormals;
+    } else if (type is InterfaceType) {
+      return type.typeParameters;
+    } else {
+      return TypeParameterElement.EMPTY_LIST;
+    }
+  }
+
+  /**
+   * Given a [DartType] type, return the [DartType]s corresponding
+   * to its formal type parameters (if any).
+   *
+   * @param type the type whose type arguments are to be returned
+   * @return the type arguments associated with the given type
+   */
+  List<DartType> typeFormalsAsTypes(DartType type) =>
+      TypeParameterTypeImpl.getTypes(typeFormalsAsElements(type));
+
+  /**
    * Create either a strong mode or regular type system based on context.
    */
   static TypeSystem create(AnalysisContext context) {
@@ -501,7 +587,7 @@
 /**
  * Implementation of [TypeSystem] using the rules in the Dart specification.
  */
-class TypeSystemImpl implements TypeSystem {
+class TypeSystemImpl extends TypeSystem {
   TypeSystemImpl();
 
   @override
@@ -574,15 +660,18 @@
   }
 
   /**
-   * Instantiate the function type using `dynamic` for all generic parameters.
+   * Instantiate a parameterized type using `dynamic` for all generic
+   * parameters.  Returns the type unchanged if there are no parameters.
    */
-  FunctionType instantiateToBounds(FunctionType function) {
-    int count = function.typeFormals.length;
-    if (count == 0) {
-      return function;
+  DartType instantiateToBounds(DartType type) {
+    List<DartType> typeFormals = typeFormalsAsTypes(type);
+    int count = typeFormals.length;
+    if (count > 0) {
+      List<DartType> typeArguments =
+          new List<DartType>.filled(count, DynamicTypeImpl.instance);
+      return instantiateType(type, typeArguments);
     }
-    return function.instantiate(
-        new List<DartType>.filled(count, DynamicTypeImpl.instance));
+    return type;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart
index ba2c2ef..0464127 100644
--- a/pkg/analyzer/lib/src/summary/flat_buffers.dart
+++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart
@@ -736,16 +736,16 @@
  * List of booleans backed by 8-bit unsigned integers.
  */
 class _FbBoolList extends Object with ListMixin<bool> implements List<bool> {
-  final List<int> uint8List;
+  final BufferPointer bp;
   int _length;
 
-  _FbBoolList(BufferPointer bp)
-      : uint8List = new _FbGenericList<int>(const Uint8Reader(), bp);
+  _FbBoolList(this.bp);
 
   @override
   int get length {
     if (_length == null) {
-      _length = (uint8List.length - 1) * 8 - uint8List.last;
+      int byteLength = bp._getUint32();
+      _length = (byteLength - 1) * 8 - _getByte(byteLength - 1);
     }
     return _length;
   }
@@ -758,32 +758,25 @@
   bool operator [](int i) {
     int index = i ~/ 8;
     int mask = 1 << i % 8;
-    return uint8List[index] & mask != 0;
+    return _getByte(index) & mask != 0;
   }
 
   @override
   void operator []=(int i, bool e) =>
       throw new StateError('Attempt to modify immutable list');
+
+  int _getByte(int index) => bp._getUint8(4 + index);
 }
 
 /**
  * The list backed by 64-bit values - Uint64 length and Float64.
  */
 class _FbFloat64List extends _FbList<double> {
-  List<double> _items;
-
   _FbFloat64List(BufferPointer bp) : super(bp);
 
   @override
   double operator [](int i) {
-    _items ??= new List<double>(length);
-    double item = _items[i];
-    if (item == null) {
-      BufferPointer ref = bp._advance(8 + 8 * i);
-      item = ref._getFloat64();
-      _items[i] = item;
-    }
-    return item;
+    return bp._getFloat64(8 + 8 * i);
   }
 }
 
@@ -838,19 +831,11 @@
  * List backed by 32-bit unsigned integers.
  */
 class _FbUint32List extends _FbList<int> {
-  List<int> _items;
-
   _FbUint32List(BufferPointer bp) : super(bp);
 
   @override
   int operator [](int i) {
-    _items ??= new List<int>(length);
-    int item = _items[i];
-    if (item == null) {
-      item = bp._getUint32(4 + 4 * i);
-      _items[i] = item;
-    }
-    return item;
+    return bp._getUint32(4 + 4 * i);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index e5c4630..7228a00 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -33,7 +33,7 @@
   @override
   idl.IndexRelationKind read(fb.BufferPointer bp) {
     int index = const fb.Uint8Reader().read(bp);
-    return index < idl.IndexRelationKind.values.length ? idl.IndexRelationKind.values[index] : idl.IndexRelationKind.IS_EXTENDED_BY;
+    return index < idl.IndexRelationKind.values.length ? idl.IndexRelationKind.values[index] : idl.IndexRelationKind.IS_ANCESTOR_OF;
   }
 }
 
@@ -115,6 +115,101 @@
   }
 }
 
+class CodeRangeBuilder extends Object with _CodeRangeMixin implements idl.CodeRange {
+  bool _finished = false;
+
+  int _length;
+  int _offset;
+
+  @override
+  int get length => _length ??= 0;
+
+  /**
+   * Length of the element code.
+   */
+  void set length(int _value) {
+    assert(!_finished);
+    assert(_value == null || _value >= 0);
+    _length = _value;
+  }
+
+  @override
+  int get offset => _offset ??= 0;
+
+  /**
+   * Offset of the element code relative to the beginning of the file.
+   */
+  void set offset(int _value) {
+    assert(!_finished);
+    assert(_value == null || _value >= 0);
+    _offset = _value;
+  }
+
+  CodeRangeBuilder({int length, int offset})
+    : _length = length,
+      _offset = offset;
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    assert(!_finished);
+    _finished = true;
+    fbBuilder.startTable();
+    if (_length != null && _length != 0) {
+      fbBuilder.addUint32(1, _length);
+    }
+    if (_offset != null && _offset != 0) {
+      fbBuilder.addUint32(0, _offset);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _CodeRangeReader extends fb.TableReader<_CodeRangeImpl> {
+  const _CodeRangeReader();
+
+  @override
+  _CodeRangeImpl createObject(fb.BufferPointer bp) => new _CodeRangeImpl(bp);
+}
+
+class _CodeRangeImpl extends Object with _CodeRangeMixin implements idl.CodeRange {
+  final fb.BufferPointer _bp;
+
+  _CodeRangeImpl(this._bp);
+
+  int _length;
+  int _offset;
+
+  @override
+  int get length {
+    _length ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    return _length;
+  }
+
+  @override
+  int get offset {
+    _offset ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    return _offset;
+  }
+}
+
+abstract class _CodeRangeMixin implements idl.CodeRange {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (length != 0) _result["length"] = length;
+    if (offset != 0) _result["offset"] = offset;
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+    "length": length,
+    "offset": offset,
+  };
+
+  @override
+  String toString() => convert.JSON.encode(toJson());
+}
+
 class EntityRefBuilder extends Object with _EntityRefMixin implements idl.EntityRef {
   bool _finished = false;
 
@@ -1137,10 +1232,24 @@
 class LinkedUnitBuilder extends Object with _LinkedUnitMixin implements idl.LinkedUnit {
   bool _finished = false;
 
+  List<int> _constCycles;
   List<LinkedReferenceBuilder> _references;
   List<EntityRefBuilder> _types;
 
   @override
+  List<int> get constCycles => _constCycles ??= <int>[];
+
+  /**
+   * List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
+   * corresponding to const constructors that are part of cycles.
+   */
+  void set constCycles(List<int> _value) {
+    assert(!_finished);
+    assert(_value == null || _value.every((e) => e >= 0));
+    _constCycles = _value;
+  }
+
+  @override
   List<LinkedReferenceBuilder> get references => _references ??= <LinkedReferenceBuilder>[];
 
   /**
@@ -1168,15 +1277,20 @@
     _types = _value;
   }
 
-  LinkedUnitBuilder({List<LinkedReferenceBuilder> references, List<EntityRefBuilder> types})
-    : _references = references,
+  LinkedUnitBuilder({List<int> constCycles, List<LinkedReferenceBuilder> references, List<EntityRefBuilder> types})
+    : _constCycles = constCycles,
+      _references = references,
       _types = types;
 
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
+    fb.Offset offset_constCycles;
     fb.Offset offset_references;
     fb.Offset offset_types;
+    if (!(_constCycles == null || _constCycles.isEmpty)) {
+      offset_constCycles = fbBuilder.writeListUint32(_constCycles);
+    }
     if (!(_references == null || _references.isEmpty)) {
       offset_references = fbBuilder.writeList(_references.map((b) => b.finish(fbBuilder)).toList());
     }
@@ -1184,6 +1298,9 @@
       offset_types = fbBuilder.writeList(_types.map((b) => b.finish(fbBuilder)).toList());
     }
     fbBuilder.startTable();
+    if (offset_constCycles != null) {
+      fbBuilder.addOffset(2, offset_constCycles);
+    }
     if (offset_references != null) {
       fbBuilder.addOffset(0, offset_references);
     }
@@ -1206,10 +1323,17 @@
 
   _LinkedUnitImpl(this._bp);
 
+  List<int> _constCycles;
   List<idl.LinkedReference> _references;
   List<idl.EntityRef> _types;
 
   @override
+  List<int> get constCycles {
+    _constCycles ??= const fb.Uint32ListReader().vTableGet(_bp, 2, const <int>[]);
+    return _constCycles;
+  }
+
+  @override
   List<idl.LinkedReference> get references {
     _references ??= const fb.ListReader<idl.LinkedReference>(const _LinkedReferenceReader()).vTableGet(_bp, 0, const <idl.LinkedReference>[]);
     return _references;
@@ -1226,6 +1350,7 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
+    if (constCycles.isNotEmpty) _result["constCycles"] = constCycles;
     if (references.isNotEmpty) _result["references"] = references.map((_value) => _value.toJson()).toList();
     if (types.isNotEmpty) _result["types"] = types.map((_value) => _value.toJson()).toList();
     return _result;
@@ -1233,6 +1358,7 @@
 
   @override
   Map<String, Object> toMap() => {
+    "constCycles": constCycles,
     "references": references,
     "types": types,
   };
@@ -1551,7 +1677,9 @@
   List<String> get strings => _strings ??= <String>[];
 
   /**
-   * List of unique element strings used in this [PackageIndex].
+   * List of unique element strings used in this [PackageIndex].  The list is
+   * sorted in ascending order, so that the client can quickly check the
+   * presence of a string in this [PackageIndex].
    */
   void set strings(List<String> _value) {
     assert(!_finished);
@@ -2176,6 +2304,7 @@
   bool _finished = false;
 
   List<UnlinkedConstBuilder> _annotations;
+  CodeRangeBuilder _codeRange;
   UnlinkedDocumentationCommentBuilder _documentationComment;
   List<UnlinkedExecutableBuilder> _executables;
   List<UnlinkedVariableBuilder> _fields;
@@ -2201,6 +2330,17 @@
   }
 
   @override
+  CodeRangeBuilder get codeRange => _codeRange;
+
+  /**
+   * Code range of the class.
+   */
+  void set codeRange(CodeRangeBuilder _value) {
+    assert(!_finished);
+    _codeRange = _value;
+  }
+
+  @override
   UnlinkedDocumentationCommentBuilder get documentationComment => _documentationComment;
 
   /**
@@ -2337,8 +2477,9 @@
     _typeParameters = _value;
   }
 
-  UnlinkedClassBuilder({List<UnlinkedConstBuilder> annotations, UnlinkedDocumentationCommentBuilder documentationComment, List<UnlinkedExecutableBuilder> executables, List<UnlinkedVariableBuilder> fields, bool hasNoSupertype, List<EntityRefBuilder> interfaces, bool isAbstract, bool isMixinApplication, List<EntityRefBuilder> mixins, String name, int nameOffset, EntityRefBuilder supertype, List<UnlinkedTypeParamBuilder> typeParameters})
+  UnlinkedClassBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, UnlinkedDocumentationCommentBuilder documentationComment, List<UnlinkedExecutableBuilder> executables, List<UnlinkedVariableBuilder> fields, bool hasNoSupertype, List<EntityRefBuilder> interfaces, bool isAbstract, bool isMixinApplication, List<EntityRefBuilder> mixins, String name, int nameOffset, EntityRefBuilder supertype, List<UnlinkedTypeParamBuilder> typeParameters})
     : _annotations = annotations,
+      _codeRange = codeRange,
       _documentationComment = documentationComment,
       _executables = executables,
       _fields = fields,
@@ -2356,6 +2497,7 @@
     assert(!_finished);
     _finished = true;
     fb.Offset offset_annotations;
+    fb.Offset offset_codeRange;
     fb.Offset offset_documentationComment;
     fb.Offset offset_executables;
     fb.Offset offset_fields;
@@ -2367,6 +2509,9 @@
     if (!(_annotations == null || _annotations.isEmpty)) {
       offset_annotations = fbBuilder.writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_codeRange != null) {
+      offset_codeRange = _codeRange.finish(fbBuilder);
+    }
     if (_documentationComment != null) {
       offset_documentationComment = _documentationComment.finish(fbBuilder);
     }
@@ -2395,6 +2540,9 @@
     if (offset_annotations != null) {
       fbBuilder.addOffset(5, offset_annotations);
     }
+    if (offset_codeRange != null) {
+      fbBuilder.addOffset(13, offset_codeRange);
+    }
     if (offset_documentationComment != null) {
       fbBuilder.addOffset(6, offset_documentationComment);
     }
@@ -2448,6 +2596,7 @@
   _UnlinkedClassImpl(this._bp);
 
   List<idl.UnlinkedConst> _annotations;
+  idl.CodeRange _codeRange;
   idl.UnlinkedDocumentationComment _documentationComment;
   List<idl.UnlinkedExecutable> _executables;
   List<idl.UnlinkedVariable> _fields;
@@ -2468,6 +2617,12 @@
   }
 
   @override
+  idl.CodeRange get codeRange {
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 13, null);
+    return _codeRange;
+  }
+
+  @override
   idl.UnlinkedDocumentationComment get documentationComment {
     _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 6, null);
     return _documentationComment;
@@ -2545,6 +2700,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
+    if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (documentationComment != null) _result["documentationComment"] = documentationComment.toJson();
     if (executables.isNotEmpty) _result["executables"] = executables.map((_value) => _value.toJson()).toList();
     if (fields.isNotEmpty) _result["fields"] = fields.map((_value) => _value.toJson()).toList();
@@ -2563,6 +2719,7 @@
   @override
   Map<String, Object> toMap() => {
     "annotations": annotations,
+    "codeRange": codeRange,
     "documentationComment": documentationComment,
     "executables": executables,
     "fields": fields,
@@ -3250,6 +3407,7 @@
   bool _finished = false;
 
   List<UnlinkedConstBuilder> _annotations;
+  CodeRangeBuilder _codeRange;
   UnlinkedDocumentationCommentBuilder _documentationComment;
   String _name;
   int _nameOffset;
@@ -3267,6 +3425,17 @@
   }
 
   @override
+  CodeRangeBuilder get codeRange => _codeRange;
+
+  /**
+   * Code range of the enum.
+   */
+  void set codeRange(CodeRangeBuilder _value) {
+    assert(!_finished);
+    _codeRange = _value;
+  }
+
+  @override
   UnlinkedDocumentationCommentBuilder get documentationComment => _documentationComment;
 
   /**
@@ -3312,8 +3481,9 @@
     _values = _value;
   }
 
-  UnlinkedEnumBuilder({List<UnlinkedConstBuilder> annotations, UnlinkedDocumentationCommentBuilder documentationComment, String name, int nameOffset, List<UnlinkedEnumValueBuilder> values})
+  UnlinkedEnumBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, UnlinkedDocumentationCommentBuilder documentationComment, String name, int nameOffset, List<UnlinkedEnumValueBuilder> values})
     : _annotations = annotations,
+      _codeRange = codeRange,
       _documentationComment = documentationComment,
       _name = name,
       _nameOffset = nameOffset,
@@ -3323,12 +3493,16 @@
     assert(!_finished);
     _finished = true;
     fb.Offset offset_annotations;
+    fb.Offset offset_codeRange;
     fb.Offset offset_documentationComment;
     fb.Offset offset_name;
     fb.Offset offset_values;
     if (!(_annotations == null || _annotations.isEmpty)) {
       offset_annotations = fbBuilder.writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_codeRange != null) {
+      offset_codeRange = _codeRange.finish(fbBuilder);
+    }
     if (_documentationComment != null) {
       offset_documentationComment = _documentationComment.finish(fbBuilder);
     }
@@ -3342,6 +3516,9 @@
     if (offset_annotations != null) {
       fbBuilder.addOffset(4, offset_annotations);
     }
+    if (offset_codeRange != null) {
+      fbBuilder.addOffset(5, offset_codeRange);
+    }
     if (offset_documentationComment != null) {
       fbBuilder.addOffset(3, offset_documentationComment);
     }
@@ -3371,6 +3548,7 @@
   _UnlinkedEnumImpl(this._bp);
 
   List<idl.UnlinkedConst> _annotations;
+  idl.CodeRange _codeRange;
   idl.UnlinkedDocumentationComment _documentationComment;
   String _name;
   int _nameOffset;
@@ -3383,6 +3561,12 @@
   }
 
   @override
+  idl.CodeRange get codeRange {
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 5, null);
+    return _codeRange;
+  }
+
+  @override
   idl.UnlinkedDocumentationComment get documentationComment {
     _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 3, null);
     return _documentationComment;
@@ -3412,6 +3596,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
+    if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (documentationComment != null) _result["documentationComment"] = documentationComment.toJson();
     if (name != '') _result["name"] = name;
     if (nameOffset != 0) _result["nameOffset"] = nameOffset;
@@ -3422,6 +3607,7 @@
   @override
   Map<String, Object> toMap() => {
     "annotations": annotations,
+    "codeRange": codeRange,
     "documentationComment": documentationComment,
     "name": name,
     "nameOffset": nameOffset,
@@ -3564,7 +3750,9 @@
   bool _finished = false;
 
   List<UnlinkedConstBuilder> _annotations;
+  CodeRangeBuilder _codeRange;
   List<UnlinkedConstructorInitializerBuilder> _constantInitializers;
+  int _constCycleSlot;
   UnlinkedDocumentationCommentBuilder _documentationComment;
   int _inferredReturnTypeSlot;
   bool _isAbstract;
@@ -3601,6 +3789,17 @@
   }
 
   @override
+  CodeRangeBuilder get codeRange => _codeRange;
+
+  /**
+   * Code range of the executable.
+   */
+  void set codeRange(CodeRangeBuilder _value) {
+    assert(!_finished);
+    _codeRange = _value;
+  }
+
+  @override
   List<UnlinkedConstructorInitializerBuilder> get constantInitializers => _constantInitializers ??= <UnlinkedConstructorInitializerBuilder>[];
 
   /**
@@ -3613,6 +3812,23 @@
   }
 
   @override
+  int get constCycleSlot => _constCycleSlot ??= 0;
+
+  /**
+   * If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
+   * a nonzero slot id which is unique within this compilation unit.  If this id
+   * is found in [LinkedUnit.constCycles], then this constructor is part of a
+   * cycle.
+   *
+   * Otherwise, zero.
+   */
+  void set constCycleSlot(int _value) {
+    assert(!_finished);
+    assert(_value == null || _value >= 0);
+    _constCycleSlot = _value;
+  }
+
+  @override
   UnlinkedDocumentationCommentBuilder get documentationComment => _documentationComment;
 
   /**
@@ -3898,9 +4114,11 @@
     _visibleOffset = _value;
   }
 
-  UnlinkedExecutableBuilder({List<UnlinkedConstBuilder> annotations, List<UnlinkedConstructorInitializerBuilder> constantInitializers, UnlinkedDocumentationCommentBuilder documentationComment, int inferredReturnTypeSlot, bool isAbstract, bool isConst, bool isExternal, bool isFactory, bool isRedirectedConstructor, bool isStatic, idl.UnlinkedExecutableKind kind, List<UnlinkedExecutableBuilder> localFunctions, List<UnlinkedLabelBuilder> localLabels, List<UnlinkedVariableBuilder> localVariables, String name, int nameEnd, int nameOffset, List<UnlinkedParamBuilder> parameters, int periodOffset, EntityRefBuilder redirectedConstructor, String redirectedConstructorName, EntityRefBuilder returnType, List<UnlinkedTypeParamBuilder> typeParameters, int visibleLength, int visibleOffset})
+  UnlinkedExecutableBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, List<UnlinkedConstructorInitializerBuilder> constantInitializers, int constCycleSlot, UnlinkedDocumentationCommentBuilder documentationComment, int inferredReturnTypeSlot, bool isAbstract, bool isConst, bool isExternal, bool isFactory, bool isRedirectedConstructor, bool isStatic, idl.UnlinkedExecutableKind kind, List<UnlinkedExecutableBuilder> localFunctions, List<UnlinkedLabelBuilder> localLabels, List<UnlinkedVariableBuilder> localVariables, String name, int nameEnd, int nameOffset, List<UnlinkedParamBuilder> parameters, int periodOffset, EntityRefBuilder redirectedConstructor, String redirectedConstructorName, EntityRefBuilder returnType, List<UnlinkedTypeParamBuilder> typeParameters, int visibleLength, int visibleOffset})
     : _annotations = annotations,
+      _codeRange = codeRange,
       _constantInitializers = constantInitializers,
+      _constCycleSlot = constCycleSlot,
       _documentationComment = documentationComment,
       _inferredReturnTypeSlot = inferredReturnTypeSlot,
       _isAbstract = isAbstract,
@@ -3929,6 +4147,7 @@
     assert(!_finished);
     _finished = true;
     fb.Offset offset_annotations;
+    fb.Offset offset_codeRange;
     fb.Offset offset_constantInitializers;
     fb.Offset offset_documentationComment;
     fb.Offset offset_localFunctions;
@@ -3943,6 +4162,9 @@
     if (!(_annotations == null || _annotations.isEmpty)) {
       offset_annotations = fbBuilder.writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_codeRange != null) {
+      offset_codeRange = _codeRange.finish(fbBuilder);
+    }
     if (!(_constantInitializers == null || _constantInitializers.isEmpty)) {
       offset_constantInitializers = fbBuilder.writeList(_constantInitializers.map((b) => b.finish(fbBuilder)).toList());
     }
@@ -3980,9 +4202,15 @@
     if (offset_annotations != null) {
       fbBuilder.addOffset(6, offset_annotations);
     }
+    if (offset_codeRange != null) {
+      fbBuilder.addOffset(26, offset_codeRange);
+    }
     if (offset_constantInitializers != null) {
       fbBuilder.addOffset(14, offset_constantInitializers);
     }
+    if (_constCycleSlot != null && _constCycleSlot != 0) {
+      fbBuilder.addUint32(25, _constCycleSlot);
+    }
     if (offset_documentationComment != null) {
       fbBuilder.addOffset(7, offset_documentationComment);
     }
@@ -4069,7 +4297,9 @@
   _UnlinkedExecutableImpl(this._bp);
 
   List<idl.UnlinkedConst> _annotations;
+  idl.CodeRange _codeRange;
   List<idl.UnlinkedConstructorInitializer> _constantInitializers;
+  int _constCycleSlot;
   idl.UnlinkedDocumentationComment _documentationComment;
   int _inferredReturnTypeSlot;
   bool _isAbstract;
@@ -4101,12 +4331,24 @@
   }
 
   @override
+  idl.CodeRange get codeRange {
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 26, null);
+    return _codeRange;
+  }
+
+  @override
   List<idl.UnlinkedConstructorInitializer> get constantInitializers {
     _constantInitializers ??= const fb.ListReader<idl.UnlinkedConstructorInitializer>(const _UnlinkedConstructorInitializerReader()).vTableGet(_bp, 14, const <idl.UnlinkedConstructorInitializer>[]);
     return _constantInitializers;
   }
 
   @override
+  int get constCycleSlot {
+    _constCycleSlot ??= const fb.Uint32Reader().vTableGet(_bp, 25, 0);
+    return _constCycleSlot;
+  }
+
+  @override
   idl.UnlinkedDocumentationComment get documentationComment {
     _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 7, null);
     return _documentationComment;
@@ -4250,7 +4492,9 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
+    if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (constantInitializers.isNotEmpty) _result["constantInitializers"] = constantInitializers.map((_value) => _value.toJson()).toList();
+    if (constCycleSlot != 0) _result["constCycleSlot"] = constCycleSlot;
     if (documentationComment != null) _result["documentationComment"] = documentationComment.toJson();
     if (inferredReturnTypeSlot != 0) _result["inferredReturnTypeSlot"] = inferredReturnTypeSlot;
     if (isAbstract != false) _result["isAbstract"] = isAbstract;
@@ -4280,7 +4524,9 @@
   @override
   Map<String, Object> toMap() => {
     "annotations": annotations,
+    "codeRange": codeRange,
     "constantInitializers": constantInitializers,
+    "constCycleSlot": constCycleSlot,
     "documentationComment": documentationComment,
     "inferredReturnTypeSlot": inferredReturnTypeSlot,
     "isAbstract": isAbstract,
@@ -5033,6 +5279,7 @@
   bool _finished = false;
 
   List<UnlinkedConstBuilder> _annotations;
+  CodeRangeBuilder _codeRange;
   UnlinkedConstBuilder _defaultValue;
   String _defaultValueCode;
   int _inferredTypeSlot;
@@ -5059,6 +5306,17 @@
   }
 
   @override
+  CodeRangeBuilder get codeRange => _codeRange;
+
+  /**
+   * Code range of the parameter.
+   */
+  void set codeRange(CodeRangeBuilder _value) {
+    assert(!_finished);
+    _codeRange = _value;
+  }
+
+  @override
   UnlinkedConstBuilder get defaultValue => _defaultValue;
 
   /**
@@ -5220,8 +5478,9 @@
     _visibleOffset = _value;
   }
 
-  UnlinkedParamBuilder({List<UnlinkedConstBuilder> annotations, UnlinkedConstBuilder defaultValue, String defaultValueCode, int inferredTypeSlot, UnlinkedExecutableBuilder initializer, bool isFunctionTyped, bool isInitializingFormal, idl.UnlinkedParamKind kind, String name, int nameOffset, List<UnlinkedParamBuilder> parameters, EntityRefBuilder type, int visibleLength, int visibleOffset})
+  UnlinkedParamBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, UnlinkedConstBuilder defaultValue, String defaultValueCode, int inferredTypeSlot, UnlinkedExecutableBuilder initializer, bool isFunctionTyped, bool isInitializingFormal, idl.UnlinkedParamKind kind, String name, int nameOffset, List<UnlinkedParamBuilder> parameters, EntityRefBuilder type, int visibleLength, int visibleOffset})
     : _annotations = annotations,
+      _codeRange = codeRange,
       _defaultValue = defaultValue,
       _defaultValueCode = defaultValueCode,
       _inferredTypeSlot = inferredTypeSlot,
@@ -5240,6 +5499,7 @@
     assert(!_finished);
     _finished = true;
     fb.Offset offset_annotations;
+    fb.Offset offset_codeRange;
     fb.Offset offset_defaultValue;
     fb.Offset offset_defaultValueCode;
     fb.Offset offset_initializer;
@@ -5249,6 +5509,9 @@
     if (!(_annotations == null || _annotations.isEmpty)) {
       offset_annotations = fbBuilder.writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_codeRange != null) {
+      offset_codeRange = _codeRange.finish(fbBuilder);
+    }
     if (_defaultValue != null) {
       offset_defaultValue = _defaultValue.finish(fbBuilder);
     }
@@ -5271,6 +5534,9 @@
     if (offset_annotations != null) {
       fbBuilder.addOffset(9, offset_annotations);
     }
+    if (offset_codeRange != null) {
+      fbBuilder.addOffset(14, offset_codeRange);
+    }
     if (offset_defaultValue != null) {
       fbBuilder.addOffset(7, offset_defaultValue);
     }
@@ -5327,6 +5593,7 @@
   _UnlinkedParamImpl(this._bp);
 
   List<idl.UnlinkedConst> _annotations;
+  idl.CodeRange _codeRange;
   idl.UnlinkedConst _defaultValue;
   String _defaultValueCode;
   int _inferredTypeSlot;
@@ -5348,6 +5615,12 @@
   }
 
   @override
+  idl.CodeRange get codeRange {
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 14, null);
+    return _codeRange;
+  }
+
+  @override
   idl.UnlinkedConst get defaultValue {
     _defaultValue ??= const _UnlinkedConstReader().vTableGet(_bp, 7, null);
     return _defaultValue;
@@ -5431,6 +5704,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
+    if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (defaultValue != null) _result["defaultValue"] = defaultValue.toJson();
     if (defaultValueCode != '') _result["defaultValueCode"] = defaultValueCode;
     if (inferredTypeSlot != 0) _result["inferredTypeSlot"] = inferredTypeSlot;
@@ -5450,6 +5724,7 @@
   @override
   Map<String, Object> toMap() => {
     "annotations": annotations,
+    "codeRange": codeRange,
     "defaultValue": defaultValue,
     "defaultValueCode": defaultValueCode,
     "inferredTypeSlot": inferredTypeSlot,
@@ -6005,6 +6280,7 @@
   bool _finished = false;
 
   List<UnlinkedConstBuilder> _annotations;
+  CodeRangeBuilder _codeRange;
   UnlinkedDocumentationCommentBuilder _documentationComment;
   String _name;
   int _nameOffset;
@@ -6024,6 +6300,17 @@
   }
 
   @override
+  CodeRangeBuilder get codeRange => _codeRange;
+
+  /**
+   * Code range of the typedef.
+   */
+  void set codeRange(CodeRangeBuilder _value) {
+    assert(!_finished);
+    _codeRange = _value;
+  }
+
+  @override
   UnlinkedDocumentationCommentBuilder get documentationComment => _documentationComment;
 
   /**
@@ -6091,8 +6378,9 @@
     _typeParameters = _value;
   }
 
-  UnlinkedTypedefBuilder({List<UnlinkedConstBuilder> annotations, UnlinkedDocumentationCommentBuilder documentationComment, String name, int nameOffset, List<UnlinkedParamBuilder> parameters, EntityRefBuilder returnType, List<UnlinkedTypeParamBuilder> typeParameters})
+  UnlinkedTypedefBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, UnlinkedDocumentationCommentBuilder documentationComment, String name, int nameOffset, List<UnlinkedParamBuilder> parameters, EntityRefBuilder returnType, List<UnlinkedTypeParamBuilder> typeParameters})
     : _annotations = annotations,
+      _codeRange = codeRange,
       _documentationComment = documentationComment,
       _name = name,
       _nameOffset = nameOffset,
@@ -6104,6 +6392,7 @@
     assert(!_finished);
     _finished = true;
     fb.Offset offset_annotations;
+    fb.Offset offset_codeRange;
     fb.Offset offset_documentationComment;
     fb.Offset offset_name;
     fb.Offset offset_parameters;
@@ -6112,6 +6401,9 @@
     if (!(_annotations == null || _annotations.isEmpty)) {
       offset_annotations = fbBuilder.writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_codeRange != null) {
+      offset_codeRange = _codeRange.finish(fbBuilder);
+    }
     if (_documentationComment != null) {
       offset_documentationComment = _documentationComment.finish(fbBuilder);
     }
@@ -6131,6 +6423,9 @@
     if (offset_annotations != null) {
       fbBuilder.addOffset(4, offset_annotations);
     }
+    if (offset_codeRange != null) {
+      fbBuilder.addOffset(7, offset_codeRange);
+    }
     if (offset_documentationComment != null) {
       fbBuilder.addOffset(6, offset_documentationComment);
     }
@@ -6166,6 +6461,7 @@
   _UnlinkedTypedefImpl(this._bp);
 
   List<idl.UnlinkedConst> _annotations;
+  idl.CodeRange _codeRange;
   idl.UnlinkedDocumentationComment _documentationComment;
   String _name;
   int _nameOffset;
@@ -6180,6 +6476,12 @@
   }
 
   @override
+  idl.CodeRange get codeRange {
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 7, null);
+    return _codeRange;
+  }
+
+  @override
   idl.UnlinkedDocumentationComment get documentationComment {
     _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 6, null);
     return _documentationComment;
@@ -6221,6 +6523,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
+    if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (documentationComment != null) _result["documentationComment"] = documentationComment.toJson();
     if (name != '') _result["name"] = name;
     if (nameOffset != 0) _result["nameOffset"] = nameOffset;
@@ -6233,6 +6536,7 @@
   @override
   Map<String, Object> toMap() => {
     "annotations": annotations,
+    "codeRange": codeRange,
     "documentationComment": documentationComment,
     "name": name,
     "nameOffset": nameOffset,
@@ -6250,6 +6554,7 @@
 
   List<UnlinkedConstBuilder> _annotations;
   EntityRefBuilder _bound;
+  CodeRangeBuilder _codeRange;
   String _name;
   int _nameOffset;
 
@@ -6277,6 +6582,17 @@
   }
 
   @override
+  CodeRangeBuilder get codeRange => _codeRange;
+
+  /**
+   * Code range of the type parameter.
+   */
+  void set codeRange(CodeRangeBuilder _value) {
+    assert(!_finished);
+    _codeRange = _value;
+  }
+
+  @override
   String get name => _name ??= '';
 
   /**
@@ -6299,9 +6615,10 @@
     _nameOffset = _value;
   }
 
-  UnlinkedTypeParamBuilder({List<UnlinkedConstBuilder> annotations, EntityRefBuilder bound, String name, int nameOffset})
+  UnlinkedTypeParamBuilder({List<UnlinkedConstBuilder> annotations, EntityRefBuilder bound, CodeRangeBuilder codeRange, String name, int nameOffset})
     : _annotations = annotations,
       _bound = bound,
+      _codeRange = codeRange,
       _name = name,
       _nameOffset = nameOffset;
 
@@ -6310,6 +6627,7 @@
     _finished = true;
     fb.Offset offset_annotations;
     fb.Offset offset_bound;
+    fb.Offset offset_codeRange;
     fb.Offset offset_name;
     if (!(_annotations == null || _annotations.isEmpty)) {
       offset_annotations = fbBuilder.writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
@@ -6317,6 +6635,9 @@
     if (_bound != null) {
       offset_bound = _bound.finish(fbBuilder);
     }
+    if (_codeRange != null) {
+      offset_codeRange = _codeRange.finish(fbBuilder);
+    }
     if (_name != null) {
       offset_name = fbBuilder.writeString(_name);
     }
@@ -6327,6 +6648,9 @@
     if (offset_bound != null) {
       fbBuilder.addOffset(2, offset_bound);
     }
+    if (offset_codeRange != null) {
+      fbBuilder.addOffset(4, offset_codeRange);
+    }
     if (offset_name != null) {
       fbBuilder.addOffset(0, offset_name);
     }
@@ -6351,6 +6675,7 @@
 
   List<idl.UnlinkedConst> _annotations;
   idl.EntityRef _bound;
+  idl.CodeRange _codeRange;
   String _name;
   int _nameOffset;
 
@@ -6367,6 +6692,12 @@
   }
 
   @override
+  idl.CodeRange get codeRange {
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 4, null);
+    return _codeRange;
+  }
+
+  @override
   String get name {
     _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
     return _name;
@@ -6385,6 +6716,7 @@
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
     if (bound != null) _result["bound"] = bound.toJson();
+    if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (name != '') _result["name"] = name;
     if (nameOffset != 0) _result["nameOffset"] = nameOffset;
     return _result;
@@ -6394,6 +6726,7 @@
   Map<String, Object> toMap() => {
     "annotations": annotations,
     "bound": bound,
+    "codeRange": codeRange,
     "name": name,
     "nameOffset": nameOffset,
   };
@@ -6406,6 +6739,7 @@
   bool _finished = false;
 
   List<UnlinkedClassBuilder> _classes;
+  CodeRangeBuilder _codeRange;
   List<UnlinkedEnumBuilder> _enums;
   List<UnlinkedExecutableBuilder> _executables;
   List<UnlinkedExportNonPublicBuilder> _exports;
@@ -6433,6 +6767,17 @@
   }
 
   @override
+  CodeRangeBuilder get codeRange => _codeRange;
+
+  /**
+   * Code range of the unit.
+   */
+  void set codeRange(CodeRangeBuilder _value) {
+    assert(!_finished);
+    _codeRange = _value;
+  }
+
+  @override
   List<UnlinkedEnumBuilder> get enums => _enums ??= <UnlinkedEnumBuilder>[];
 
   /**
@@ -6597,8 +6942,9 @@
     _variables = _value;
   }
 
-  UnlinkedUnitBuilder({List<UnlinkedClassBuilder> classes, List<UnlinkedEnumBuilder> enums, List<UnlinkedExecutableBuilder> executables, List<UnlinkedExportNonPublicBuilder> exports, List<UnlinkedImportBuilder> imports, List<UnlinkedConstBuilder> libraryAnnotations, UnlinkedDocumentationCommentBuilder libraryDocumentationComment, String libraryName, int libraryNameLength, int libraryNameOffset, List<UnlinkedPartBuilder> parts, UnlinkedPublicNamespaceBuilder publicNamespace, List<UnlinkedReferenceBuilder> references, List<UnlinkedTypedefBuilder> typedefs, List<UnlinkedVariableBuilder> variables})
+  UnlinkedUnitBuilder({List<UnlinkedClassBuilder> classes, CodeRangeBuilder codeRange, List<UnlinkedEnumBuilder> enums, List<UnlinkedExecutableBuilder> executables, List<UnlinkedExportNonPublicBuilder> exports, List<UnlinkedImportBuilder> imports, List<UnlinkedConstBuilder> libraryAnnotations, UnlinkedDocumentationCommentBuilder libraryDocumentationComment, String libraryName, int libraryNameLength, int libraryNameOffset, List<UnlinkedPartBuilder> parts, UnlinkedPublicNamespaceBuilder publicNamespace, List<UnlinkedReferenceBuilder> references, List<UnlinkedTypedefBuilder> typedefs, List<UnlinkedVariableBuilder> variables})
     : _classes = classes,
+      _codeRange = codeRange,
       _enums = enums,
       _executables = executables,
       _exports = exports,
@@ -6623,6 +6969,7 @@
     assert(!_finished);
     _finished = true;
     fb.Offset offset_classes;
+    fb.Offset offset_codeRange;
     fb.Offset offset_enums;
     fb.Offset offset_executables;
     fb.Offset offset_exports;
@@ -6638,6 +6985,9 @@
     if (!(_classes == null || _classes.isEmpty)) {
       offset_classes = fbBuilder.writeList(_classes.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_codeRange != null) {
+      offset_codeRange = _codeRange.finish(fbBuilder);
+    }
     if (!(_enums == null || _enums.isEmpty)) {
       offset_enums = fbBuilder.writeList(_enums.map((b) => b.finish(fbBuilder)).toList());
     }
@@ -6678,6 +7028,9 @@
     if (offset_classes != null) {
       fbBuilder.addOffset(2, offset_classes);
     }
+    if (offset_codeRange != null) {
+      fbBuilder.addOffset(15, offset_codeRange);
+    }
     if (offset_enums != null) {
       fbBuilder.addOffset(12, offset_enums);
     }
@@ -6742,6 +7095,7 @@
   _UnlinkedUnitImpl(this._bp);
 
   List<idl.UnlinkedClass> _classes;
+  idl.CodeRange _codeRange;
   List<idl.UnlinkedEnum> _enums;
   List<idl.UnlinkedExecutable> _executables;
   List<idl.UnlinkedExportNonPublic> _exports;
@@ -6764,6 +7118,12 @@
   }
 
   @override
+  idl.CodeRange get codeRange {
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 15, null);
+    return _codeRange;
+  }
+
+  @override
   List<idl.UnlinkedEnum> get enums {
     _enums ??= const fb.ListReader<idl.UnlinkedEnum>(const _UnlinkedEnumReader()).vTableGet(_bp, 12, const <idl.UnlinkedEnum>[]);
     return _enums;
@@ -6853,6 +7213,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (classes.isNotEmpty) _result["classes"] = classes.map((_value) => _value.toJson()).toList();
+    if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (enums.isNotEmpty) _result["enums"] = enums.map((_value) => _value.toJson()).toList();
     if (executables.isNotEmpty) _result["executables"] = executables.map((_value) => _value.toJson()).toList();
     if (exports.isNotEmpty) _result["exports"] = exports.map((_value) => _value.toJson()).toList();
@@ -6873,6 +7234,7 @@
   @override
   Map<String, Object> toMap() => {
     "classes": classes,
+    "codeRange": codeRange,
     "enums": enums,
     "executables": executables,
     "exports": exports,
@@ -6897,6 +7259,7 @@
   bool _finished = false;
 
   List<UnlinkedConstBuilder> _annotations;
+  CodeRangeBuilder _codeRange;
   UnlinkedConstBuilder _constExpr;
   UnlinkedDocumentationCommentBuilder _documentationComment;
   int _inferredTypeSlot;
@@ -6923,6 +7286,17 @@
   }
 
   @override
+  CodeRangeBuilder get codeRange => _codeRange;
+
+  /**
+   * Code range of the variable.
+   */
+  void set codeRange(CodeRangeBuilder _value) {
+    assert(!_finished);
+    _codeRange = _value;
+  }
+
+  @override
   UnlinkedConstBuilder get constExpr => _constExpr;
 
   /**
@@ -7086,8 +7460,9 @@
     _visibleOffset = _value;
   }
 
-  UnlinkedVariableBuilder({List<UnlinkedConstBuilder> annotations, UnlinkedConstBuilder constExpr, UnlinkedDocumentationCommentBuilder documentationComment, int inferredTypeSlot, UnlinkedExecutableBuilder initializer, bool isConst, bool isFinal, bool isStatic, String name, int nameOffset, int propagatedTypeSlot, EntityRefBuilder type, int visibleLength, int visibleOffset})
+  UnlinkedVariableBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, UnlinkedConstBuilder constExpr, UnlinkedDocumentationCommentBuilder documentationComment, int inferredTypeSlot, UnlinkedExecutableBuilder initializer, bool isConst, bool isFinal, bool isStatic, String name, int nameOffset, int propagatedTypeSlot, EntityRefBuilder type, int visibleLength, int visibleOffset})
     : _annotations = annotations,
+      _codeRange = codeRange,
       _constExpr = constExpr,
       _documentationComment = documentationComment,
       _inferredTypeSlot = inferredTypeSlot,
@@ -7106,6 +7481,7 @@
     assert(!_finished);
     _finished = true;
     fb.Offset offset_annotations;
+    fb.Offset offset_codeRange;
     fb.Offset offset_constExpr;
     fb.Offset offset_documentationComment;
     fb.Offset offset_initializer;
@@ -7114,6 +7490,9 @@
     if (!(_annotations == null || _annotations.isEmpty)) {
       offset_annotations = fbBuilder.writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_codeRange != null) {
+      offset_codeRange = _codeRange.finish(fbBuilder);
+    }
     if (_constExpr != null) {
       offset_constExpr = _constExpr.finish(fbBuilder);
     }
@@ -7133,6 +7512,9 @@
     if (offset_annotations != null) {
       fbBuilder.addOffset(8, offset_annotations);
     }
+    if (offset_codeRange != null) {
+      fbBuilder.addOffset(14, offset_codeRange);
+    }
     if (offset_constExpr != null) {
       fbBuilder.addOffset(5, offset_constExpr);
     }
@@ -7189,6 +7571,7 @@
   _UnlinkedVariableImpl(this._bp);
 
   List<idl.UnlinkedConst> _annotations;
+  idl.CodeRange _codeRange;
   idl.UnlinkedConst _constExpr;
   idl.UnlinkedDocumentationComment _documentationComment;
   int _inferredTypeSlot;
@@ -7210,6 +7593,12 @@
   }
 
   @override
+  idl.CodeRange get codeRange {
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 14, null);
+    return _codeRange;
+  }
+
+  @override
   idl.UnlinkedConst get constExpr {
     _constExpr ??= const _UnlinkedConstReader().vTableGet(_bp, 5, null);
     return _constExpr;
@@ -7293,6 +7682,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
+    if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (constExpr != null) _result["constExpr"] = constExpr.toJson();
     if (documentationComment != null) _result["documentationComment"] = documentationComment.toJson();
     if (inferredTypeSlot != 0) _result["inferredTypeSlot"] = inferredTypeSlot;
@@ -7312,6 +7702,7 @@
   @override
   Map<String, Object> toMap() => {
     "annotations": annotations,
+    "codeRange": codeRange,
     "constExpr": constExpr,
     "documentationComment": documentationComment,
     "inferredTypeSlot": inferredTypeSlot,
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 63828ff..7114161 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -27,6 +27,13 @@
 enum IndexRelationKind : byte {
   /**
    * Left: class.
+   *   Is ancestor of (is extended or implemented, directly or indirectly).
+   * Right: other class declaration.
+   */
+  IS_ANCESTOR_OF,
+
+  /**
+   * Left: class.
    *   Is extended by.
    * Right: other class declaration.
    */
@@ -512,6 +519,21 @@
 }
 
 /**
+ * Information about an element code range.
+ */
+table CodeRange {
+  /**
+   * Length of the element code.
+   */
+  length:uint (id: 1);
+
+  /**
+   * Offset of the element code relative to the beginning of the file.
+   */
+  offset:uint (id: 0);
+}
+
+/**
  * Summary information about a reference to a an entity such as a type, top
  * level executable, or executable within a class.
  */
@@ -777,6 +799,12 @@
  */
 table LinkedUnit {
   /**
+   * List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
+   * corresponding to const constructors that are part of cycles.
+   */
+  constCycles:[uint] (id: 2);
+
+  /**
    * Information about the resolution of references within the compilation
    * unit.  Each element of [UnlinkedUnit.references] has a corresponding
    * element in this list (at the same index).  If this list has additional
@@ -863,7 +891,9 @@
   elementUnits:[uint] (id: 0);
 
   /**
-   * List of unique element strings used in this [PackageIndex].
+   * List of unique element strings used in this [PackageIndex].  The list is
+   * sorted in ascending order, so that the client can quickly check the
+   * presence of a string in this [PackageIndex].
    */
   strings:[string] (id: 6);
 
@@ -974,6 +1004,11 @@
   annotations:[UnlinkedConst] (id: 5);
 
   /**
+   * Code range of the class.
+   */
+  codeRange:CodeRange (id: 13);
+
+  /**
    * Documentation comment for the class, or `null` if there is no
    * documentation comment.
    */
@@ -1180,6 +1215,11 @@
   annotations:[UnlinkedConst] (id: 4);
 
   /**
+   * Code range of the enum.
+   */
+  codeRange:CodeRange (id: 5);
+
+  /**
    * Documentation comment for the enum, or `null` if there is no documentation
    * comment.
    */
@@ -1234,12 +1274,27 @@
   annotations:[UnlinkedConst] (id: 6);
 
   /**
+   * Code range of the executable.
+   */
+  codeRange:CodeRange (id: 26);
+
+  /**
    * If a constant [UnlinkedExecutableKind.constructor], the constructor
    * initializers.  Otherwise empty.
    */
   constantInitializers:[UnlinkedConstructorInitializer] (id: 14);
 
   /**
+   * If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
+   * a nonzero slot id which is unique within this compilation unit.  If this id
+   * is found in [LinkedUnit.constCycles], then this constructor is part of a
+   * cycle.
+   *
+   * Otherwise, zero.
+   */
+  constCycleSlot:uint (id: 25);
+
+  /**
    * Documentation comment for the executable, or `null` if there is no
    * documentation comment.
    */
@@ -1524,6 +1579,11 @@
   annotations:[UnlinkedConst] (id: 9);
 
   /**
+   * Code range of the parameter.
+   */
+  codeRange:CodeRange (id: 14);
+
+  /**
    * If the parameter has a default value, the constant expression in the
    * default value.  Note that the presence of this expression does not mean
    * that it is a valid, check [UnlinkedConst.isInvalid].
@@ -1720,6 +1780,11 @@
   annotations:[UnlinkedConst] (id: 4);
 
   /**
+   * Code range of the typedef.
+   */
+  codeRange:CodeRange (id: 7);
+
+  /**
    * Documentation comment for the typedef, or `null` if there is no
    * documentation comment.
    */
@@ -1767,6 +1832,11 @@
   bound:EntityRef (id: 2);
 
   /**
+   * Code range of the type parameter.
+   */
+  codeRange:CodeRange (id: 4);
+
+  /**
    * Name of the type parameter.
    */
   name:string (id: 0);
@@ -1787,6 +1857,11 @@
   classes:[UnlinkedClass] (id: 2);
 
   /**
+   * Code range of the unit.
+   */
+  codeRange:CodeRange (id: 15);
+
+  /**
    * Enums declared in the compilation unit.
    */
   enums:[UnlinkedEnum] (id: 12);
@@ -1877,6 +1952,11 @@
   annotations:[UnlinkedConst] (id: 8);
 
   /**
+   * Code range of the variable.
+   */
+  codeRange:CodeRange (id: 14);
+
+  /**
    * If [isConst] is true, and the variable has an initializer, the constant
    * expression in the initializer.  Note that the presence of this expression
    * does not mean that it is a valid, check [UnlinkedConst.isInvalid].
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 21473a2..0df5ab3 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -53,6 +53,23 @@
 const informative = null;
 
 /**
+ * Information about an element code range.
+ */
+abstract class CodeRange extends base.SummaryClass {
+  /**
+   * Length of the element code.
+   */
+  @Id(1)
+  int get length;
+
+  /**
+   * Offset of the element code relative to the beginning of the file.
+   */
+  @Id(0)
+  int get offset;
+}
+
+/**
  * Summary information about a reference to a an entity such as a type, top
  * level executable, or executable within a class.
  */
@@ -169,6 +186,13 @@
 enum IndexRelationKind {
   /**
    * Left: class.
+   *   Is ancestor of (is extended or implemented, directly or indirectly).
+   * Right: other class declaration.
+   */
+  IS_ANCESTOR_OF,
+
+  /**
+   * Left: class.
    *   Is extended by.
    * Right: other class declaration.
    */
@@ -429,6 +453,13 @@
  */
 abstract class LinkedUnit extends base.SummaryClass {
   /**
+   * List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
+   * corresponding to const constructors that are part of cycles.
+   */
+  @Id(2)
+  List<int> get constCycles;
+
+  /**
    * Information about the resolution of references within the compilation
    * unit.  Each element of [UnlinkedUnit.references] has a corresponding
    * element in this list (at the same index).  If this list has additional
@@ -535,7 +566,9 @@
   List<int> get elementUnits;
 
   /**
-   * List of unique element strings used in this [PackageIndex].
+   * List of unique element strings used in this [PackageIndex].  The list is
+   * sorted in ascending order, so that the client can quickly check the
+   * presence of a string in this [PackageIndex].
    */
   @Id(6)
   List<String> get strings;
@@ -731,6 +764,12 @@
   List<UnlinkedConst> get annotations;
 
   /**
+   * Code range of the class.
+   */
+  @Id(13)
+  CodeRange get codeRange;
+
+  /**
    * Documentation comment for the class, or `null` if there is no
    * documentation comment.
    */
@@ -1281,6 +1320,12 @@
   List<UnlinkedConst> get annotations;
 
   /**
+   * Code range of the enum.
+   */
+  @Id(5)
+  CodeRange get codeRange;
+
+  /**
    * Documentation comment for the enum, or `null` if there is no documentation
    * comment.
    */
@@ -1347,6 +1392,12 @@
   List<UnlinkedConst> get annotations;
 
   /**
+   * Code range of the executable.
+   */
+  @Id(26)
+  CodeRange get codeRange;
+
+  /**
    * If a constant [UnlinkedExecutableKind.constructor], the constructor
    * initializers.  Otherwise empty.
    */
@@ -1354,6 +1405,17 @@
   List<UnlinkedConstructorInitializer> get constantInitializers;
 
   /**
+   * If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
+   * a nonzero slot id which is unique within this compilation unit.  If this id
+   * is found in [LinkedUnit.constCycles], then this constructor is part of a
+   * cycle.
+   *
+   * Otherwise, zero.
+   */
+  @Id(25)
+  int get constCycleSlot;
+
+  /**
    * Documentation comment for the executable, or `null` if there is no
    * documentation comment.
    */
@@ -1719,6 +1781,12 @@
   List<UnlinkedConst> get annotations;
 
   /**
+   * Code range of the parameter.
+   */
+  @Id(14)
+  CodeRange get codeRange;
+
+  /**
    * If the parameter has a default value, the constant expression in the
    * default value.  Note that the presence of this expression does not mean
    * that it is a valid, check [UnlinkedConst.isInvalid].
@@ -1969,6 +2037,12 @@
   List<UnlinkedConst> get annotations;
 
   /**
+   * Code range of the typedef.
+   */
+  @Id(7)
+  CodeRange get codeRange;
+
+  /**
    * Documentation comment for the typedef, or `null` if there is no
    * documentation comment.
    */
@@ -2026,6 +2100,12 @@
   EntityRef get bound;
 
   /**
+   * Code range of the type parameter.
+   */
+  @Id(4)
+  CodeRange get codeRange;
+
+  /**
    * Name of the type parameter.
    */
   @Id(0)
@@ -2054,6 +2134,12 @@
   List<UnlinkedClass> get classes;
 
   /**
+   * Code range of the unit.
+   */
+  @Id(15)
+  CodeRange get codeRange;
+
+  /**
    * Enums declared in the compilation unit.
    */
   @Id(12)
@@ -2162,6 +2248,12 @@
   List<UnlinkedConst> get annotations;
 
   /**
+   * Code range of the variable.
+   */
+  @Id(14)
+  CodeRange get codeRange;
+
+  /**
    * If [isConst] is true, and the variable has an initializer, the constant
    * expression in the initializer.  Note that the presence of this expression
    * does not mean that it is a valid, check [UnlinkedConst.isInvalid].
diff --git a/pkg/analyzer/lib/src/summary/index_unit.dart b/pkg/analyzer/lib/src/summary/index_unit.dart
index db659c7..ca57e80 100644
--- a/pkg/analyzer/lib/src/summary/index_unit.dart
+++ b/pkg/analyzer/lib/src/summary/index_unit.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/format.dart';
@@ -32,26 +33,20 @@
 
   /**
    * Each item of this list corresponds to the library URI of a unique
-   * [CompilationUnitElement].  It is an index into [_strings].
+   * [CompilationUnitElement].
    */
-  final List<int> _unitLibraryUris = <int>[];
+  final List<_StringInfo> _unitLibraryUris = <_StringInfo>[];
 
   /**
    * Each item of this list corresponds to the unit URI of a unique
-   * [CompilationUnitElement].  It is an index into [_strings].
+   * [CompilationUnitElement].
    */
-  final List<int> _unitUnitUris = <int>[];
+  final List<_StringInfo> _unitUnitUris = <_StringInfo>[];
 
   /**
-   * Map associating strings with their identifiers, which are indices
-   * into [_strings].
+   * Map associating strings with their [_StringInfo]s.
    */
-  final Map<String, int> _stringMap = <String, int>{};
-
-  /**
-   * List of unique strings used in this index.
-   */
-  final List<String> _strings = <String>[];
+  final Map<String, _StringInfo> _stringMap = <String, _StringInfo>{};
 
   /**
    * List of information about each unit indexed in this index.
@@ -63,6 +58,15 @@
    * [index].
    */
   PackageIndexBuilder assemble() {
+    // sort strings end set IDs
+    List<_StringInfo> stringInfoList = _stringMap.values.toList();
+    stringInfoList.sort((a, b) {
+      return a.value.compareTo(b.value);
+    });
+    for (int i = 0; i < stringInfoList.length; i++) {
+      stringInfoList[i].id = i;
+    }
+    // sort elements and set IDs
     List<_ElementInfo> elementInfoList = _elementMap.values.toList();
     elementInfoList.sort((a, b) {
       return a.offset - b.offset;
@@ -71,12 +75,12 @@
       elementInfoList[i].id = i;
     }
     return new PackageIndexBuilder(
-        unitLibraryUris: _unitLibraryUris,
-        unitUnitUris: _unitUnitUris,
+        unitLibraryUris: _unitLibraryUris.map((s) => s.id).toList(),
+        unitUnitUris: _unitUnitUris.map((s) => s.id).toList(),
         elementUnits: elementInfoList.map((e) => e.unitId).toList(),
         elementOffsets: elementInfoList.map((e) => e.offset).toList(),
         elementKinds: elementInfoList.map((e) => e.kind).toList(),
-        strings: _strings,
+        strings: stringInfoList.map((s) => s.value).toList(),
         units: _units.map((unit) => unit.assemble()).toList());
   }
 
@@ -111,14 +115,12 @@
   }
 
   /**
-   * Add information about [str] to [_strings] if necessary, and return the
-   * location in this array representing [str].
+   * Return the unique [_StringInfo] corresponding the [str].  The field
+   * [_StringInfo.id] is filled by [assemble] during final sorting.
    */
-  int _getStringId(String str) {
+  _StringInfo _getStringInfo(String str) {
     return _stringMap.putIfAbsent(str, () {
-      int id = _strings.length;
-      _strings.add(str);
-      return id;
+      return new _StringInfo(str);
     });
   }
 
@@ -131,18 +133,19 @@
     return _unitMap.putIfAbsent(unitElement, () {
       assert(_unitLibraryUris.length == _unitUnitUris.length);
       int id = _unitUnitUris.length;
-      _unitLibraryUris.add(_getUriId(unitElement.library.source.uri));
-      _unitUnitUris.add(_getUriId(unitElement.source.uri));
+      _unitLibraryUris.add(_getUriInfo(unitElement.library.source.uri));
+      _unitUnitUris.add(_getUriInfo(unitElement.source.uri));
       return id;
     });
   }
 
   /**
-   * Return the identifier corresponding to [uri].
+   * Return the unique [_StringInfo] corresponding [uri].  The field
+   * [_StringInfo.id] is filled by [assemble] during final sorting.
    */
-  int _getUriId(Uri uri) {
+  _StringInfo _getUriInfo(Uri uri) {
     String str = uri.toString();
-    return _getStringId(str);
+    return _getStringInfo(str);
   }
 
   /**
@@ -186,9 +189,10 @@
  */
 class _DefinedNameInfo {
   /**
-   * The identifier of the name returned [PackageIndexAssembler._getStringId].
+   * The information about the name returned from
+   * [PackageIndexAssembler._getStringInfo].
    */
-  final int nameId;
+  final _StringInfo nameInfo;
 
   /**
    * The coarse-grained kind of the defined name.
@@ -200,7 +204,7 @@
    */
   final int offset;
 
-  _DefinedNameInfo(this.nameId, this.kind, this.offset);
+  _DefinedNameInfo(this.nameInfo, this.kind, this.offset);
 }
 
 /**
@@ -232,6 +236,24 @@
 }
 
 /**
+ * Information about a string referenced in the index.
+ */
+class _StringInfo {
+  /**
+   * The value of the string.
+   */
+  final String value;
+
+  /**
+   * The unique id of the string.  It is set after indexing of the whole
+   * package is done and we are assembling the full package index.
+   */
+  int id;
+
+  _StringInfo(this.value);
+}
+
+/**
  * Information about a single relation.  Any [_ElementRelationInfo] is always
  * part of a [_UnitIndexAssembler], so [offset] and [length] should be
  * understood within the context of the compilation unit pointed to by the
@@ -272,6 +294,10 @@
     }
   }
 
+  void recordIsAncestorOf(Element descendant) {
+    _recordIsAncestorOf(descendant, descendant, false, <ClassElement>[]);
+  }
+
   /**
    * Record that the name [node] has a relation of the given [kind].
    */
@@ -344,11 +370,18 @@
     Identifier name = typeName?.name;
     if (name != null) {
       Element element = name.staticElement;
-      SimpleIdentifier relNode =
-          name is PrefixedIdentifier ? name.identifier : name;
-      recordRelation(element, kind, relNode, true);
+      bool isQualified;
+      SimpleIdentifier relNode;
+      if (name is PrefixedIdentifier) {
+        isQualified = true;
+        relNode = name.identifier;
+      } else {
+        isQualified = false;
+        relNode = name;
+      }
+      recordRelation(element, kind, relNode, isQualified);
       recordRelation(
-          element, IndexRelationKind.IS_REFERENCED_BY, relNode, true);
+          element, IndexRelationKind.IS_REFERENCED_BY, relNode, isQualified);
       typeName.typeArguments?.accept(this);
     }
   }
@@ -377,10 +410,17 @@
       recordRelationOffset(objectElement, IndexRelationKind.IS_EXTENDED_BY,
           node.name.offset, 0, true);
     }
+    recordIsAncestorOf(node.element);
     super.visitClassDeclaration(node);
   }
 
   @override
+  visitClassTypeAlias(ClassTypeAlias node) {
+    recordIsAncestorOf(node.element);
+    super.visitClassTypeAlias(node);
+  }
+
+  @override
   visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     SimpleIdentifier fieldName = node.fieldName;
     if (fieldName != null) {
@@ -406,7 +446,7 @@
       recordRelationOffset(
           element, IndexRelationKind.IS_REFERENCED_BY, offset, 0, true);
     }
-    super.visitConstructorName(node);
+    node.type.accept(this);
   }
 
   @override
@@ -517,6 +557,10 @@
           element.field, IndexRelationKind.IS_REFERENCED_BY, node, true);
       return;
     }
+    // ignore a local reference to a parameter
+    if (element is ParameterElement && node.parent is! Label) {
+      return;
+    }
     // record specific relations
     recordRelation(
         element, IndexRelationKind.IS_REFERENCED_BY, node, isQualified);
@@ -586,6 +630,37 @@
     AstNode parent = node.parent;
     return parent is Combinator || parent is Label;
   }
+
+  void _recordIsAncestorOf(Element descendant, ClassElement ancestor,
+      bool includeThis, List<ClassElement> visitedElements) {
+    if (ancestor == null) {
+      return;
+    }
+    if (visitedElements.contains(ancestor)) {
+      return;
+    }
+    visitedElements.add(ancestor);
+    if (includeThis) {
+      int offset = descendant.nameOffset;
+      int length = descendant.nameLength;
+      assembler.addElementRelation(
+          ancestor, IndexRelationKind.IS_ANCESTOR_OF, offset, length, false);
+    }
+    {
+      InterfaceType superType = ancestor.supertype;
+      if (superType != null) {
+        _recordIsAncestorOf(
+            descendant, superType.element, true, visitedElements);
+      }
+    }
+    for (InterfaceType mixinType in ancestor.mixins) {
+      _recordIsAncestorOf(descendant, mixinType.element, true, visitedElements);
+    }
+    for (InterfaceType implementedType in ancestor.interfaces) {
+      _recordIsAncestorOf(
+          descendant, implementedType.element, true, visitedElements);
+    }
+  }
 }
 
 /**
@@ -595,13 +670,14 @@
  */
 class _NameRelationInfo {
   /**
-   * The identifier of the name returned [PackageIndexAssembler._getStringId].
+   * The information about the name returned from
+   * [PackageIndexAssembler._getStringInfo].
    */
-  final int nameId;
+  final _StringInfo nameInfo;
   final IndexRelationKind kind;
   final int offset;
 
-  _NameRelationInfo(this.nameId, this.kind, this.offset);
+  _NameRelationInfo(this.nameInfo, this.kind, this.offset);
 }
 
 /**
@@ -635,7 +711,7 @@
   }
 
   void addNameRelation(String name, IndexRelationKind kind, int offset) {
-    int nameId = pkg._getStringId(name);
+    _StringInfo nameId = pkg._getStringInfo(name);
     nameRelations.add(new _NameRelationInfo(nameId, kind, offset));
   }
 
@@ -645,17 +721,17 @@
    */
   UnitIndexBuilder assemble() {
     definedNames.sort((a, b) {
-      return a.nameId - b.nameId;
+      return a.nameInfo.id - b.nameInfo.id;
     });
     elementRelations.sort((a, b) {
       return a.elementInfo.id - b.elementInfo.id;
     });
     nameRelations.sort((a, b) {
-      return a.nameId - b.nameId;
+      return a.nameInfo.id - b.nameInfo.id;
     });
     return new UnitIndexBuilder(
         unit: unitId,
-        definedNames: definedNames.map((n) => n.nameId).toList(),
+        definedNames: definedNames.map((n) => n.nameInfo.id).toList(),
         definedNameKinds: definedNames.map((n) => n.kind).toList(),
         definedNameOffsets: definedNames.map((n) => n.offset).toList(),
         usedElements: elementRelations.map((r) => r.elementInfo.id).toList(),
@@ -664,13 +740,13 @@
         usedElementLengths: elementRelations.map((r) => r.length).toList(),
         usedElementIsQualifiedFlags:
             elementRelations.map((r) => r.isQualified).toList(),
-        usedNames: nameRelations.map((r) => r.nameId).toList(),
+        usedNames: nameRelations.map((r) => r.nameInfo.id).toList(),
         usedNameKinds: nameRelations.map((r) => r.kind).toList(),
         usedNameOffsets: nameRelations.map((r) => r.offset).toList());
   }
 
   void defineName(String name, IndexNameKind kind, int offset) {
-    int nameId = pkg._getStringId(name);
-    definedNames.add(new _DefinedNameInfo(nameId, kind, offset));
+    _StringInfo nameInfo = pkg._getStringInfo(name);
+    definedNames.add(new _DefinedNameInfo(nameInfo, kind, offset));
   }
 }
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 214861a..8c9869f 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -845,6 +845,12 @@
   Map<int, EntityRef> linkedTypeMap;
 
   /**
+   * Set of slot ids corresponding to const constructors that are part of
+   * cycles.
+   */
+  Set<int> constCycles;
+
+  /**
    * The [CompilationUnitElementImpl] for the compilation unit currently being
    * resynthesized.
    */
@@ -1014,6 +1020,7 @@
     classElement.type = correspondingType;
     buildDocumentation(classElement, serializedClass.documentationComment);
     buildAnnotations(classElement, serializedClass.annotations);
+    buildCodeRange(classElement, serializedClass.codeRange);
     resolveConstructorInitializers(classElement);
     unitHolder.addType(classElement);
     currentTypeParameters.removeLast();
@@ -1022,6 +1029,12 @@
     constructors = null;
   }
 
+  void buildCodeRange(ElementImpl element, CodeRange codeRange) {
+    if (codeRange != null) {
+      element.setCodeRange(codeRange.offset, codeRange.length);
+    }
+  }
+
   /**
    * Resynthesize a [NamespaceCombinator].
    */
@@ -1076,6 +1089,8 @@
     assert(serializedExecutable.kind == UnlinkedExecutableKind.constructor);
     currentConstructor = new ConstructorElementImpl(
         serializedExecutable.name, serializedExecutable.nameOffset);
+    currentConstructor.isCycleFree = serializedExecutable.isConst &&
+        !constCycles.contains(serializedExecutable.constCycleSlot);
     if (serializedExecutable.name.isEmpty) {
       currentConstructor.nameEnd =
           serializedExecutable.nameOffset + classType.name.length;
@@ -1143,6 +1158,7 @@
     classElement.supertype = summaryResynthesizer.typeProvider.objectType;
     buildDocumentation(classElement, serializedEnum.documentationComment);
     buildAnnotations(classElement, serializedEnum.annotations);
+    buildCodeRange(classElement, serializedEnum.codeRange);
     ElementHolder memberHolder = new ElementHolder();
     // Build the 'index' field.
     FieldElementImpl indexField = new FieldElementImpl('index', -1);
@@ -1157,7 +1173,7 @@
     valuesField.const3 = true;
     valuesField.static = true;
     valuesField.type = summaryResynthesizer.typeProvider.listType
-        .substitute4(<DartType>[enumType]);
+        .instantiate(<DartType>[enumType]);
     memberHolder.addField(valuesField);
     buildImplicitAccessors(valuesField, memberHolder);
     // Build fields for all enum constants.
@@ -1298,6 +1314,7 @@
     buildDocumentation(
         executableElement, serializedExecutable.documentationComment);
     buildAnnotations(executableElement, serializedExecutable.annotations);
+    buildCodeRange(executableElement, serializedExecutable.codeRange);
     executableElement.functions =
         serializedExecutable.localFunctions.map(buildLocalFunction).toList();
     executableElement.labels =
@@ -1699,6 +1716,7 @@
     }
     parameterElement.synthetic = synthetic;
     buildAnnotations(parameterElement, serializedParameter.annotations);
+    buildCodeRange(parameterElement, serializedParameter.codeRange);
     if (serializedParameter.isFunctionTyped) {
       FunctionElementImpl parameterTypeElement =
           new FunctionElementImpl('', -1);
@@ -1832,6 +1850,7 @@
     buildDocumentation(
         functionTypeAliasElement, serializedTypedef.documentationComment);
     buildAnnotations(functionTypeAliasElement, serializedTypedef.annotations);
+    buildCodeRange(functionTypeAliasElement, serializedTypedef.codeRange);
     unitHolder.addTypeAlias(functionTypeAliasElement);
     currentTypeParameters.removeLast();
     assert(currentTypeParameters.isEmpty);
@@ -1852,6 +1871,7 @@
             serializedTypeParameter.name, serializedTypeParameter.nameOffset);
     typeParameterElement.type = new TypeParameterTypeImpl(typeParameterElement);
     buildAnnotations(typeParameterElement, serializedTypeParameter.annotations);
+    buildCodeRange(typeParameterElement, serializedTypeParameter.codeRange);
     return typeParameterElement;
   }
 
@@ -1925,6 +1945,7 @@
     buildVariableInitializer(element, serializedVariable.initializer);
     buildDocumentation(element, serializedVariable.documentationComment);
     buildAnnotations(element, serializedVariable.annotations);
+    buildCodeRange(element, serializedVariable.codeRange);
   }
 
   /**
@@ -1939,6 +1960,7 @@
     FunctionElementImpl initializerElement =
         buildLocalFunction(serializedInitializer);
     initializerElement.synthetic = true;
+    initializerElement.setCodeRange(null, null);
     variable.initializer = initializerElement;
   }
 
@@ -1961,6 +1983,7 @@
     linkedUnit = null;
     unlinkedUnit = null;
     linkedTypeMap = null;
+    constCycles = null;
     referenceInfos = null;
     currentCompilationUnit = null;
   }
@@ -2195,6 +2218,7 @@
     for (PropertyAccessorElementImpl accessor in unit.accessors) {
       elementMap[accessor.identifier] = accessor;
     }
+    buildCodeRange(unit, unlinkedUnit.codeRange);
     resynthesizedUnits[absoluteUri] = unit;
     resynthesizedElements[absoluteUri] = elementMap;
     assert(currentTypeParameters.isEmpty);
@@ -2211,6 +2235,7 @@
     for (EntityRef t in linkedUnit.types) {
       linkedTypeMap[t.slot] = t;
     }
+    constCycles = linkedUnit.constCycles.toSet();
     populateReferenceInfos();
     unitHolder = new ElementHolder();
   }
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index cd9ff61..a527fba 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -93,9 +93,8 @@
     Expression target = access.target;
     if (target is Identifier) {
       EntityRefBuilder targetRef = serializeIdentifier(target);
-      return new EntityRefBuilder(
-          reference: visitor.serializeReference(
-              targetRef.reference, access.propertyName.name));
+      return new EntityRefBuilder(reference: visitor.serializeReference(
+          targetRef.reference, access.propertyName.name));
     } else {
       // TODO(scheglov) should we handle other targets in malformed constants?
       throw new StateError('Unexpected target type: ${target.runtimeType}');
@@ -296,9 +295,10 @@
   Block enclosingBlock = null;
 
   /**
-   * Create a slot id for storing a propagated or inferred type.
+   * Create a slot id for storing a propagated or inferred type or const cycle
+   * info.
    */
-  int assignTypeSlot() => ++numSlots;
+  int assignSlot() => ++numSlots;
 
   /**
    * Build a [_Scope] object containing the names defined within the body of a
@@ -348,6 +348,7 @@
    * and store the result in [classes].
    */
   void serializeClass(
+      AstNode node,
       Token abstractKeyword,
       String name,
       int nameOffset,
@@ -394,6 +395,7 @@
     b.isAbstract = abstractKeyword != null;
     b.documentationComment = serializeDocumentation(documentationComment);
     b.annotations = serializeAnnotations(annotations);
+    b.codeRange = serializeCodeRange(node);
     classes.add(b);
     scopes.removeLast();
     assert(scopes.length == oldScopesLength);
@@ -402,6 +404,13 @@
   }
 
   /**
+   * Create a [CodeRangeBuilder] for the given [node].
+   */
+  CodeRangeBuilder serializeCodeRange(AstNode node) {
+    return new CodeRangeBuilder(offset: node.offset, length: node.length);
+  }
+
+  /**
    * Serialize a [Combinator] into an [UnlinkedCombinator].
    */
   UnlinkedCombinatorBuilder serializeCombinator(Combinator combinator) {
@@ -437,6 +446,7 @@
     b.libraryNameLength = libraryNameLength;
     b.libraryDocumentationComment = libraryDocumentationComment;
     b.libraryAnnotations = libraryAnnotations;
+    b.codeRange = serializeCodeRange(compilationUnit);
     b.classes = classes;
     b.enums = enums;
     b.executables = executables;
@@ -484,6 +494,7 @@
    * [UnlinkedExecutable].
    */
   UnlinkedExecutableBuilder serializeExecutable(
+      AstNode node,
       String name,
       int nameOffset,
       bool isGetter,
@@ -529,15 +540,16 @@
         for (int i = 0; i < formalParameters.parameters.length; i++) {
           if (!b.parameters[i].isFunctionTyped &&
               b.parameters[i].type == null) {
-            b.parameters[i].inferredTypeSlot = assignTypeSlot();
+            b.parameters[i].inferredTypeSlot = assignSlot();
           }
         }
       }
     }
     b.documentationComment = serializeDocumentation(documentationComment);
     b.annotations = serializeAnnotations(annotations);
+    b.codeRange = serializeCodeRange(node);
     if (returnType == null && !isSemanticallyStatic) {
-      b.inferredReturnTypeSlot = assignTypeSlot();
+      b.inferredReturnTypeSlot = assignSlot();
     }
     b.visibleOffset = enclosingBlock?.offset;
     b.visibleLength = enclosingBlock?.length;
@@ -601,7 +613,7 @@
     UnlinkedExecutableBuilder initializer =
         new UnlinkedExecutableBuilder(nameOffset: expression.offset);
     serializeFunctionBody(initializer, expression);
-    initializer.inferredReturnTypeSlot = assignTypeSlot();
+    initializer.inferredReturnTypeSlot = assignSlot();
     return initializer;
   }
 
@@ -614,6 +626,7 @@
     b.name = node.identifier.name;
     b.nameOffset = node.identifier.offset;
     b.annotations = serializeAnnotations(node.metadata);
+    b.codeRange = serializeCodeRange(node);
     switch (node.kind) {
       case ParameterKind.REQUIRED:
         b.kind = UnlinkedParamKind.required;
@@ -771,6 +784,7 @@
       b.type = serializeTypeName(variables.type);
       b.documentationComment = serializeDocumentation(documentationComment);
       b.annotations = serializeAnnotations(annotations);
+      b.codeRange = serializeCodeRange(variables.parent);
       if (variable.isConst ||
           variable.isFinal && isField && !isDeclaredStatic) {
         Expression initializer = variable.initializer;
@@ -780,12 +794,12 @@
       }
       if (variable.initializer != null &&
           (variables.isFinal || variables.isConst)) {
-        b.propagatedTypeSlot = assignTypeSlot();
+        b.propagatedTypeSlot = assignSlot();
       }
       bool isSemanticallyStatic = !isField || isDeclaredStatic;
       if (variables.type == null &&
           (variable.initializer != null || !isSemanticallyStatic)) {
-        b.inferredTypeSlot = assignTypeSlot();
+        b.inferredTypeSlot = assignSlot();
       }
       b.visibleOffset = enclosingBlock?.offset;
       b.visibleLength = enclosingBlock?.length;
@@ -807,6 +821,7 @@
     TypeName superclass =
         node.extendsClause == null ? null : node.extendsClause.superclass;
     serializeClass(
+        node,
         node.abstractKeyword,
         node.name.name,
         node.name.offset,
@@ -823,6 +838,7 @@
   @override
   void visitClassTypeAlias(ClassTypeAlias node) {
     serializeClass(
+        node,
         node.abstractKeyword,
         node.name.name,
         node.name.offset,
@@ -867,7 +883,10 @@
         }
       }
     }
-    b.isConst = node.constKeyword != null;
+    if (node.constKeyword != null) {
+      b.isConst = true;
+      b.constCycleSlot = assignSlot();
+    }
     b.isExternal = node.externalKeyword != null;
     b.documentationComment = serializeDocumentation(node.documentationComment);
     b.annotations = serializeAnnotations(node.metadata);
@@ -911,6 +930,7 @@
         .toList();
     b.documentationComment = serializeDocumentation(node.documentationComment);
     b.annotations = serializeAnnotations(node.metadata);
+    b.codeRange = serializeCodeRange(node);
     enums.add(b);
   }
 
@@ -946,6 +966,7 @@
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     executables.add(serializeExecutable(
+        node,
         node.name.name,
         node.name.offset,
         node.isGetter,
@@ -965,6 +986,7 @@
   void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
       executables.add(serializeExecutable(
+          node,
           null,
           node.offset,
           false,
@@ -1000,6 +1022,7 @@
         .toList();
     b.documentationComment = serializeDocumentation(node.documentationComment);
     b.annotations = serializeAnnotations(node.metadata);
+    b.codeRange = serializeCodeRange(node);
     typedefs.add(b);
     scopes.removeLast();
     assert(scopes.length == oldScopesLength);
@@ -1059,6 +1082,7 @@
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     executables.add(serializeExecutable(
+        node,
         node.name.name,
         node.name.offset,
         node.isGetter,
@@ -1107,6 +1131,7 @@
       b.bound = serializeTypeName(node.bound);
     }
     b.annotations = serializeAnnotations(node.metadata);
+    b.codeRange = serializeCodeRange(node);
     return b;
   }
 
diff --git a/pkg/analyzer/lib/src/summary/summarize_elements.dart b/pkg/analyzer/lib/src/summary/summarize_elements.dart
index 3d9896b..212bb9d 100644
--- a/pkg/analyzer/lib/src/summary/summarize_elements.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_elements.dart
@@ -246,6 +246,11 @@
   final List<_SerializeTypeRef> deferredLinkedTypes = <_SerializeTypeRef>[];
 
   /**
+   * List which should be stored in [LinkedUnit.constCycles].
+   */
+  final List<int> constCycles = <int>[];
+
+  /**
    * Index into the "references table" representing an unresolved reference, if
    * such an index exists.  `null` if no such entry has been made in the
    * references table yet.
@@ -364,6 +369,7 @@
       unlinkedUnit.publicNamespace =
           new UnlinkedPublicNamespaceBuilder(names: names);
     }
+    unlinkedUnit.codeRange = serializeCodeRange(compilationUnit);
     unlinkedUnit.classes = compilationUnit.types.map(serializeClass).toList();
     unlinkedUnit.enums = compilationUnit.enums.map(serializeEnum).toList();
     unlinkedUnit.typedefs =
@@ -394,13 +400,15 @@
 
   /**
    * Create the [LinkedUnit.types] table based on deferred types that were
-   * found during [addCompilationUnitElements].
+   * found during [addCompilationUnitElements].  Also populate
+   * [LinkedUnit.constCycles].
    */
-  void createLinkedTypes() {
+  void createLinkedInfo() {
     buildingLinkedReferences = true;
     linkedUnit.types = deferredLinkedTypes
         .map((_SerializeTypeRef closure) => closure())
         .toList();
+    linkedUnit.constCycles = constCycles;
     buildingLinkedReferences = false;
   }
 
@@ -530,6 +538,7 @@
     b.isMixinApplication = classElement.isMixinApplication;
     b.documentationComment = serializeDocumentation(classElement);
     b.annotations = serializeAnnotations(classElement);
+    b.codeRange = serializeCodeRange(classElement);
     return b;
   }
 
@@ -579,6 +588,13 @@
     return null;
   }
 
+  CodeRangeBuilder serializeCodeRange(Element element) {
+    if (element is ElementImpl && element.codeOffset != null) {
+      return new CodeRangeBuilder(offset: element.codeOffset, length: element.codeLength);
+    }
+    return null;
+  }
+
   /**
    * Serialize the given [combinator] into an [UnlinkedCombinator].
    */
@@ -641,6 +657,7 @@
     b.values = values;
     b.documentationComment = serializeDocumentation(enumElement);
     b.annotations = serializeAnnotations(enumElement);
+    b.codeRange = serializeCodeRange(enumElement);
     return b;
   }
 
@@ -706,17 +723,19 @@
           b.redirectedConstructorName = redirectedConstructor.name;
         }
       }
-      if (executableElement.isConst &&
-          executableElement.constantInitializers != null) {
-        Set<String> constructorParameterNames =
-            executableElement.parameters.map((p) => p.name).toSet();
-        b.constantInitializers = executableElement.constantInitializers
-            .map((ConstructorInitializer initializer) =>
-                serializeConstructorInitializer(
-                    initializer,
-                    (expr) =>
-                        serializeConstExpr(expr, constructorParameterNames)))
-            .toList();
+      if (executableElement.isConst) {
+        b.constCycleSlot = storeConstCycle(!executableElement.isCycleFree);
+        if (executableElement.constantInitializers != null) {
+          Set<String> constructorParameterNames =
+              executableElement.parameters.map((p) => p.name).toSet();
+          b.constantInitializers = executableElement.constantInitializers
+              .map((ConstructorInitializer initializer) =>
+                  serializeConstructorInitializer(
+                      initializer,
+                      (expr) =>
+                          serializeConstExpr(expr, constructorParameterNames)))
+              .toList();
+        }
       }
     } else {
       b.kind = UnlinkedExecutableKind.functionOrMethod;
@@ -727,6 +746,7 @@
     b.isExternal = executableElement.isExternal;
     b.documentationComment = serializeDocumentation(executableElement);
     b.annotations = serializeAnnotations(executableElement);
+    b.codeRange = serializeCodeRange(executableElement);
     if (executableElement is FunctionElement) {
       SourceRange visibleRange = executableElement.visibleRange;
       if (visibleRange != null) {
@@ -823,6 +843,7 @@
         break;
     }
     b.annotations = serializeAnnotations(parameter);
+    b.codeRange = serializeCodeRange(parameter);
     b.isInitializingFormal = parameter.isInitializingFormal;
     DartType type = parameter.type;
     if (parameter.hasImplicitType) {
@@ -912,6 +933,7 @@
     b.parameters = typedefElement.parameters.map(serializeParam).toList();
     b.documentationComment = serializeDocumentation(typedefElement);
     b.annotations = serializeAnnotations(typedefElement);
+    b.codeRange = serializeCodeRange(typedefElement);
     return b;
   }
 
@@ -927,6 +949,7 @@
       b.bound = serializeTypeRef(typeParameter.bound, typeParameter);
     }
     b.annotations = serializeAnnotations(typeParameter);
+    b.codeRange = serializeCodeRange(typeParameter);
     return b;
   }
 
@@ -1076,6 +1099,7 @@
         (variable.initializer != null || !variable.isStatic)) {
       b.inferredTypeSlot = storeInferredType(variable.type, variable);
     }
+    b.codeRange = serializeCodeRange(variable);
     if (variable is LocalVariableElement) {
       SourceRange visibleRange = variable.visibleRange;
       if (visibleRange != null) {
@@ -1091,6 +1115,18 @@
   }
 
   /**
+   * Create a new slot id and return it.  If [hasCycle] is `true`, arrange for
+   * the slot id to be included in [LinkedUnit.constCycles].
+   */
+  int storeConstCycle(bool hasCycle) {
+    int slot = ++numSlots;
+    if (hasCycle) {
+      constCycles.add(slot);
+    }
+    return slot;
+  }
+
+  /**
    * Create a slot id for the given [type] (which is an inferred type).  If
    * [type] is not `dynamic`, it is stored in [linkedTypes] so that once the
    * compilation unit has been fully visited, it will be serialized into
@@ -1522,7 +1558,7 @@
     pb.numPrelinkedDependencies = dependencies.length;
     for (_CompilationUnitSerializer compilationUnitSerializer
         in compilationUnitSerializers) {
-      compilationUnitSerializer.createLinkedTypes();
+      compilationUnitSerializer.createLinkedInfo();
     }
     pb.importDependencies = linkedImports;
     List<String> exportedNames =
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index ad422ca..cd6c52e 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -371,9 +371,9 @@
     _isAsyncInitialized = true;
     _futureType = _getType(library, "Future");
     _streamType = _getType(library, "Stream");
-    _futureDynamicType = _futureType.substitute4(<DartType>[dynamicType]);
-    _futureNullType = _futureType.substitute4(<DartType>[_nullType]);
-    _streamDynamicType = _streamType.substitute4(<DartType>[dynamicType]);
+    _futureDynamicType = _futureType.instantiate(<DartType>[dynamicType]);
+    _futureNullType = _futureType.instantiate(<DartType>[_nullType]);
+    _streamDynamicType = _streamType.instantiate(<DartType>[dynamicType]);
   }
 
   /**
@@ -398,7 +398,7 @@
     _stringType = _getType(library, "String");
     _symbolType = _getType(library, "Symbol");
     _typeType = _getType(library, "Type");
-    _iterableDynamicType = _iterableType.substitute4(<DartType>[dynamicType]);
+    _iterableDynamicType = _iterableType.instantiate(<DartType>[dynamicType]);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index b94806d..11a704d 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -1004,24 +1004,46 @@
     Map<Source, SourceKind> exportSourceKindMap =
         getRequiredInput(EXPORTS_SOURCE_KIND_INPUT_NAME);
     //
-    // Build elements.
+    // Try to get the existing LibraryElement.
     //
-    DirectiveElementBuilder builder = new DirectiveElementBuilder(
-        context,
-        libraryElement,
-        importLibraryMap,
-        importSourceKindMap,
-        exportLibraryMap,
-        exportSourceKindMap);
-    libraryUnit.accept(builder);
-    // See commentary in the computation of the LIBRARY_CYCLE result
-    // for details on library cycle invalidation.
-    libraryElement.invalidateLibraryCycles();
+    LibraryElement element;
+    {
+      InternalAnalysisContext internalContext =
+          context as InternalAnalysisContext;
+      AnalysisCache analysisCache = internalContext.analysisCache;
+      CacheEntry cacheEntry = internalContext.getCacheEntry(target);
+      element = analysisCache.getValue(target, LIBRARY_ELEMENT2);
+      if (element == null &&
+          internalContext.aboutToComputeResult(cacheEntry, LIBRARY_ELEMENT2)) {
+        element = analysisCache.getValue(target, LIBRARY_ELEMENT2);
+      }
+    }
+    //
+    // Build or reuse the directive elements.
+    //
+    List<AnalysisError> errors;
+    if (element == null) {
+      DirectiveElementBuilder builder = new DirectiveElementBuilder(
+          context,
+          libraryElement,
+          importLibraryMap,
+          importSourceKindMap,
+          exportLibraryMap,
+          exportSourceKindMap);
+      libraryUnit.accept(builder);
+      // See the commentary in the computation of the LIBRARY_CYCLE result
+      // for details on library cycle invalidation.
+      libraryElement.invalidateLibraryCycles();
+      errors = builder.errors;
+    } else {
+      DirectiveResolver resolver = new DirectiveResolver();
+      libraryUnit.accept(resolver);
+    }
     //
     // Record outputs.
     //
     outputs[LIBRARY_ELEMENT2] = libraryElement;
-    outputs[BUILD_DIRECTIVES_ERRORS] = builder.errors;
+    outputs[BUILD_DIRECTIVES_ERRORS] = errors;
   }
 
   /**
@@ -1383,9 +1405,7 @@
       libraryElement.definingCompilationUnit = definingCompilationUnitElement;
       libraryElement.entryPoint = entryPoint;
       libraryElement.parts = sourcedCompilationUnits;
-      for (Directive directive in directivesToResolve) {
-        directive.element = libraryElement;
-      }
+      libraryElement.hasExtUri = _hasExtUri(definingCompilationUnit);
       BuildLibraryElementUtils.patchTopLevelAccessors(libraryElement);
       // set the library documentation to the docs associated with the first
       // directive in the compilation unit.
@@ -1395,6 +1415,15 @@
       }
     }
     //
+    // Resolve the relevant directives to the library element.
+    //
+    // TODO(brianwilkerson) This updates the state of the AST structures but
+    // does not associate a new result with it.
+    //
+    for (Directive directive in directivesToResolve) {
+      directive.element = libraryElement;
+    }
+    //
     // Record outputs.
     //
     outputs[BUILD_LIBRARY_ERRORS] = errors;
@@ -1434,6 +1463,21 @@
   }
 
   /**
+   * Return `true` if the given compilation [unit] contains at least one
+   * import directive with a `dart-ext:` URI.
+   */
+  bool _hasExtUri(CompilationUnit unit) {
+    for (Directive directive in unit.directives) {
+      if (directive is ImportDirective) {
+        if (DartUriResolver.isDartExtUri(directive.uriContent)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
    * Return a map from the names of the inputs of this kind of task to the task
    * input descriptors describing those inputs for a task with the given
    * [libSource].
diff --git a/pkg/analyzer/lib/src/task/driver.dart b/pkg/analyzer/lib/src/task/driver.dart
index a041729..b729a2b 100644
--- a/pkg/analyzer/lib/src/task/driver.dart
+++ b/pkg/analyzer/lib/src/task/driver.dart
@@ -44,11 +44,11 @@
   final InternalAnalysisContext context;
 
   /**
-   * The map of [ComputedResult] controllers.
+   * The map of [ResultChangedEvent] controllers.
    */
-  final Map<ResultDescriptor, StreamController<ComputedResult>>
+  final Map<ResultDescriptor, StreamController<ResultChangedEvent>>
       resultComputedControllers =
-      <ResultDescriptor, StreamController<ComputedResult>>{};
+      <ResultDescriptor, StreamController<ResultChangedEvent>>{};
 
   /**
    * The work order that was previously computed but that has not yet been
@@ -208,11 +208,10 @@
    * Return the stream that is notified when a new value for the given
    * [descriptor] is computed.
    */
-  Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor) {
-    return resultComputedControllers
-        .putIfAbsent(descriptor,
-            () => new StreamController<ComputedResult>.broadcast(sync: true))
-        .stream;
+  Stream<ResultChangedEvent> onResultComputed(ResultDescriptor descriptor) {
+    return resultComputedControllers.putIfAbsent(descriptor, () {
+      return new StreamController<ResultChangedEvent>.broadcast(sync: true);
+    }).stream;
   }
 
   /**
@@ -284,11 +283,11 @@
           entry.setValue(result, outputs[result], dependedOn);
         }
         outputs.forEach((ResultDescriptor descriptor, value) {
-          StreamController<ComputedResult> controller =
+          StreamController<ResultChangedEvent> controller =
               resultComputedControllers[descriptor];
           if (controller != null) {
-            ComputedResult event =
-                new ComputedResult(context, descriptor, target, value);
+            ResultChangedEvent event = new ResultChangedEvent(
+                context, target, descriptor, value, true);
             controller.add(event);
           }
         });
@@ -397,6 +396,8 @@
     while (_currentIndices.isNotEmpty) {
       Node nextUnevaluatedInput = getNextInput(_path[_currentIndices.last],
           _provisionalDependencies[_currentIndices.last]);
+      // If the assertion below fails, it indicates that [getNextInput] did not
+      // skip an input that we asked it to skip.
       assert(!_provisionalDependencies[_currentIndices.last]
           .contains(nextUnevaluatedInput));
       if (nextUnevaluatedInput != null) {
@@ -683,12 +684,7 @@
       inputTargetedResults.add(new TargetedResult(inputTarget, inputResult));
       CacheEntry inputEntry = context.getCacheEntry(inputTarget);
       CacheState inputState = inputEntry.getState(inputResult);
-      if (skipInputs.any((WorkItem item) =>
-          item.target == inputTarget && item.spawningResult == inputResult)) {
-        // This input is being skipped due to a circular dependency.  Tell the
-        // builder that it's not available so we can move on to other inputs.
-        builder.currentValueNotAvailable();
-      } else if (inputState == CacheState.ERROR) {
+      if (inputState == CacheState.ERROR) {
         exception = inputEntry.exception;
         return null;
       } else if (inputState == CacheState.IN_PROCESS) {
@@ -716,8 +712,16 @@
               throw new AnalysisException(
                   'Cannot find task to build $inputResult for $inputTarget');
             }
-            return new WorkItem(context, inputTarget, descriptor, inputResult,
-                level + 1, workOrder);
+            if (skipInputs.any((WorkItem item) =>
+                item.target == inputTarget && item.descriptor == descriptor)) {
+              // This input is being skipped due to a circular dependency.  Tell
+              // the builder that it's not available so we can move on to other
+              // inputs.
+              builder.currentValueNotAvailable();
+            } else {
+              return new WorkItem(context, inputTarget, descriptor, inputResult,
+                  level + 1, workOrder);
+            }
           } on AnalysisException catch (exception, stackTrace) {
             this.exception = new CaughtException(exception, stackTrace);
             return null;
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 8f0c9de..9831fb6 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -337,7 +337,7 @@
         : node.loopVariable?.identifier;
     if (loopVariable != null) {
       var iteratorType = loopVariable.staticType;
-      var checkedType = iterableType.substitute4([iteratorType]);
+      var checkedType = iterableType.instantiate([iteratorType]);
       checkAssignment(expr, checkedType);
     }
     node.visitChildren(this);
@@ -648,7 +648,7 @@
         !body.isGenerator &&
         actualType is InterfaceType &&
         actualType.element == futureType.element) {
-      type = futureType.substitute4([type]);
+      type = futureType.instantiate([type]);
     }
     // TODO(vsm): Enforce void or dynamic (to void?) when expression is null.
     if (expression != null) checkAssignment(expression, type);
@@ -753,7 +753,7 @@
     if (yieldStar) {
       if (type.isDynamic) {
         // Ensure it's at least a Stream / Iterable.
-        return expectedType.substitute4([typeProvider.dynamicType]);
+        return expectedType.instantiate([typeProvider.dynamicType]);
       } else {
         // Analyzer will provide a separate error if expected type
         // is not compatible with type.
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index b106dee..0ab8a8b 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -11,11 +11,11 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart'
     show TypeProvider, InheritanceManager;
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 
 /**
  * Sets the type of the field. This is stored in the field itself, and the
@@ -284,11 +284,13 @@
     List<FunctionType> overriddenTypes = new List<FunctionType>();
     for (ExecutableElement overriddenMethod in overriddenMethods) {
       FunctionType overriddenType = overriddenMethod.type;
-      if (overriddenType.typeFormals.isNotEmpty &&
-          overriddenType.typeFormals.length != typeFormals.length) {
-        return;
+      if (overriddenType.typeFormals.isNotEmpty) {
+        if (overriddenType.typeFormals.length != typeFormals.length) {
+          return;
+        }
+        overriddenType = overriddenType.instantiate(typeFormals);
       }
-      overriddenTypes.add(overriddenType.instantiate(typeFormals));
+      overriddenTypes.add(overriddenType);
     }
 
     //
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index fb6756b..15dc4c0 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,8 +1,8 @@
 name: analyzer
-version: 0.27.3-alpha.0
+version: 0.27.3-alpha.2
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
-homepage: http://www.dartlang.org
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 environment:
   sdk: '>=1.12.0 <2.0.0'
 dependencies:
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 09485aa..6327745 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -4,6 +4,7 @@
 
 library analyzer.test.generated.compile_time_error_code_test;
 
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/source_io.dart';
@@ -12,7 +13,6 @@
 import '../reflective_tests.dart';
 import '../utils.dart';
 import 'resolver_test.dart';
-import 'package:analyzer/src/generated/engine.dart';
 
 main() {
   initializeTestEnvironment();
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 4f0b214..35eda15 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -10,6 +10,9 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/task/dart.dart';
 import 'package:unittest/unittest.dart';
 
 import '../reflective_tests.dart';
@@ -145,6 +148,17 @@
     checkMetadata('import');
   }
 
+  void test_metadata_importDirective_partiallyResolved() {
+    addNamedSource('/foo.dart', 'class C {}');
+    this.code = 'const a = null; @a import "foo.dart";';
+    Source source = addNamedSource('/test.dart', code);
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    analysisContext.computeResult(source, LIBRARY_ELEMENT1);
+    unit = analysisContext.computeResult(target, RESOLVED_UNIT1);
+    unit2 = _cloneResolveUnit(unit);
+    checkMetadata('import');
+  }
+
   void test_metadata_libraryDirective() {
     setupCode('@a library L;');
     checkMetadata('L');
@@ -244,6 +258,18 @@
     super.setUp();
   }
 
+  void test_enumConstant_partiallyResolved() {
+    String code = r'''
+enum Fruit {apple, pear}
+''';
+    Source source = addNamedSource('/test.dart', code);
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    analysisContext.computeResult(source, LIBRARY_ELEMENT1);
+    CompilationUnit unit =
+        analysisContext.computeResult(target, RESOLVED_UNIT1);
+    CompilationUnit unit2 = _cloneResolveUnit(unit);
+  }
+
   void test_functionDeclaration_getter() {
     String code = r'''
 int get zzz => 42;
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index f15ece1..52e3030 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -600,6 +600,12 @@
   }
 
   @override
+  Stream<ResultChangedEvent> onResultChanged(ResultDescriptor descriptor) {
+    fail("Unexpected invocation of onResultChanged");
+    return null;
+  }
+
+  @override
   Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor) {
     fail("Unexpected invocation of onResultComputed");
     return null;
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 41d96a5..b51be7f 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -12,8 +12,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/dart/ast/ast.dart'
-    show SimpleIdentifierImpl, PrefixedIdentifierImpl;
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -237,7 +235,7 @@
           'onValue', futureThenR, [futureElement.typeParameters[0]], null);
       thenOnValue.synthetic = true;
 
-      DartType futureRType = futureElement.type.substitute4([futureThenR.type]);
+      DartType futureRType = futureElement.type.instantiate([futureThenR.type]);
       MethodElementImpl thenMethod = ElementFactory
           .methodElementWithParameters(futureElement, "then", futureRType, [
         ElementFactory.requiredParameter2("onValue", thenOnValue.type),
@@ -271,7 +269,7 @@
         ElementFactory.constructorElement2(streamElement, null)
       ];
       DartType returnType = streamSubscriptionElement.type
-          .substitute4(streamElement.type.typeArguments);
+          .instantiate(streamElement.type.typeArguments);
       FunctionElementImpl listenOnData = ElementFactory.functionElement3(
           'onData',
           VoidTypeImpl.instance.element,
@@ -2489,11 +2487,32 @@
       'package:meta/meta.dart': r'''
 library meta;
 
+const _Factory factory = const _Factory();
+const _Literal literal = const _Literal();
+const _MustCallSuper mustCallSuper = const _MustCallSuper();
+const _Override override = const _Override();
 const _Protected protected = const _Protected();
+const _Required required = const _Required();
 
+class _Factory {
+  const _Factory();
+}
+class _Literal {
+  const _Literal();
+}
+class _MustCallSuper {
+  const _MustCallSuper();
+}
+class _Override {
+  const _Override();
+}
 class _Protected {
   const _Protected();
 }
+class _Required {
+  final String reason;
+  const _Required([this.reason]));
+}
 '''
     });
   }
@@ -2990,10 +3009,10 @@
     verify([source]);
   }
 
-  void test_deprecatedAnnotationUse_deprecated() {
+  void test_deprecatedAnnotationUse_Deprecated() {
     Source source = addSource(r'''
 class A {
-  @deprecated
+  @Deprecated('0.9')
   m() {}
   n() {m();}
 }''');
@@ -3002,10 +3021,10 @@
     verify([source]);
   }
 
-  void test_deprecatedAnnotationUse_Deprecated() {
+  void test_deprecatedAnnotationUse_deprecated() {
     Source source = addSource(r'''
 class A {
-  @Deprecated('0.9')
+  @deprecated
   m() {}
   n() {m();}
 }''');
@@ -3616,6 +3635,67 @@
     verify([source]);
   }
 
+  void test_mustCallSuper() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  void a() {}
+}
+class B extends A {
+  @override
+  void a()
+  {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.MUST_CALL_SUPER]);
+    verify([source]);
+  }
+
+  void test_mustCallSuper_indirect() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  void a() {}
+}
+class C extends A {
+  @override
+  void a() {
+    super.a();
+  }
+}
+class D extends C {
+  @override
+  void a() {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.MUST_CALL_SUPER]);
+    verify([source]);
+  }
+
+  void test_mustCallSuper_OK() {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  void a() {}
+}
+class C extends A {
+  @override
+  void a() {
+    super.a(); //OK
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, []);
+    verify([source]);
+  }
+
+  @override
   void test_nullAwareInCondition_assert() {
     Source source = addSource(r'''
 m(x) {
@@ -8291,6 +8371,30 @@
   }
 
   /**
+   * Asserts that [code] verifies, but has errors with the given error codes.
+   *
+   * Like [assertErrors], but takes a string of source code.
+   */
+  // TODO(rnystrom): Use this in more tests that have the same structure.
+  void assertErrorsInCode(String code, List<ErrorCode> errors) {
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertErrors(source, errors);
+    verify([source]);
+  }
+
+  /**
+   * Asserts that [code] has errors with the given error codes.
+   *
+   * Like [assertErrors], but takes a string of source code.
+   */
+  void assertErrorsInUnverifiedCode(String code, List<ErrorCode> errors) {
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertErrors(source, errors);
+  }
+
+  /**
    * Assert that no errors have been reported against the given source.
    *
    * @param source the source against which no errors should have been reported
@@ -8302,6 +8406,17 @@
   }
 
   /**
+   * Asserts that [code] has no errors or warnings.
+   */
+  // TODO(rnystrom): Use this in more tests that have the same structure.
+  void assertNoErrorsInCode(String code) {
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  /**
    * Cache the source file content in the source factory but don't add the source to the analysis
    * context. The file path should be absolute.
    *
@@ -10594,21 +10709,21 @@
     ClassElementImpl derivedClass =
         ElementFactory.classElement2('Derived', ['T']);
     derivedClass.supertype = _typeProvider.futureType
-        .substitute4([derivedClass.typeParameters[0].type]);
+        .instantiate([derivedClass.typeParameters[0].type]);
     InterfaceType intType = _typeProvider.intType;
     DartType dynamicType = _typeProvider.dynamicType;
-    InterfaceType derivedIntType = derivedClass.type.substitute4([intType]);
+    InterfaceType derivedIntType = derivedClass.type.instantiate([intType]);
     // flatten(Derived) = dynamic
     InterfaceType derivedDynamicType =
-        derivedClass.type.substitute4([dynamicType]);
+        derivedClass.type.instantiate([dynamicType]);
     expect(_flatten(derivedDynamicType), dynamicType);
     // flatten(Derived<int>) = int
     expect(_flatten(derivedIntType), intType);
     // flatten(Derived<Derived>) = Derived
-    expect(_flatten(derivedClass.type.substitute4([derivedDynamicType])),
+    expect(_flatten(derivedClass.type.instantiate([derivedDynamicType])),
         derivedDynamicType);
     // flatten(Derived<Derived<int>>) = Derived<int>
-    expect(_flatten(derivedClass.type.substitute4([derivedIntType])),
+    expect(_flatten(derivedClass.type.instantiate([derivedIntType])),
         derivedIntType);
   }
 
@@ -10633,19 +10748,19 @@
     ClassElementImpl derivedClass =
         ElementFactory.classElement2('Derived', ['T']);
     derivedClass.supertype = _typeProvider.futureType
-        .substitute4([derivedClass.typeParameters[0].type]);
+        .instantiate([derivedClass.typeParameters[0].type]);
     InterfaceType derivedType = derivedClass.type;
     // class A extends Derived<int> implements Derived<num> { ... }
     ClassElementImpl classA =
-        ElementFactory.classElement('A', derivedType.substitute4([intType]));
+        ElementFactory.classElement('A', derivedType.instantiate([intType]));
     classA.interfaces = <InterfaceType>[
-      derivedType.substitute4([numType])
+      derivedType.instantiate([numType])
     ];
     // class B extends Future<num> implements Future<int> { ... }
     ClassElementImpl classB =
-        ElementFactory.classElement('B', derivedType.substitute4([numType]));
+        ElementFactory.classElement('B', derivedType.instantiate([numType]));
     classB.interfaces = <InterfaceType>[
-      derivedType.substitute4([intType])
+      derivedType.instantiate([intType])
     ];
     // flatten(A) = flatten(B) = int, since int is more specific than num.
     // The code in flatten() that inhibits infinite recursion shouldn't be
@@ -10660,15 +10775,15 @@
     InterfaceType numType = _typeProvider.numType;
     // class A extends Future<int> implements Future<num> { ... }
     ClassElementImpl classA =
-        ElementFactory.classElement('A', futureType.substitute4([intType]));
+        ElementFactory.classElement('A', futureType.instantiate([intType]));
     classA.interfaces = <InterfaceType>[
-      futureType.substitute4([numType])
+      futureType.instantiate([numType])
     ];
     // class B extends Future<num> implements Future<int> { ... }
     ClassElementImpl classB =
-        ElementFactory.classElement('B', futureType.substitute4([numType]));
+        ElementFactory.classElement('B', futureType.instantiate([numType]));
     classB.interfaces = <InterfaceType>[
-      futureType.substitute4([intType])
+      futureType.instantiate([intType])
     ];
     // flatten(A) = flatten(B) = int, since int is more specific than num.
     expect(_flatten(classA.type), intType);
@@ -10680,11 +10795,11 @@
     DartType dynamicType = _typeProvider.dynamicType;
     InterfaceType futureDynamicType = _typeProvider.futureDynamicType;
     InterfaceType futureIntType =
-        _typeProvider.futureType.substitute4([intType]);
+        _typeProvider.futureType.instantiate([intType]);
     InterfaceType futureFutureDynamicType =
-        _typeProvider.futureType.substitute4([futureDynamicType]);
+        _typeProvider.futureType.instantiate([futureDynamicType]);
     InterfaceType futureFutureIntType =
-        _typeProvider.futureType.substitute4([futureIntType]);
+        _typeProvider.futureType.instantiate([futureIntType]);
     // flatten(int) = int
     expect(_flatten(intType), intType);
     // flatten(dynamic) = dynamic
@@ -10705,15 +10820,15 @@
     InterfaceType stringType = _typeProvider.stringType;
     // class A extends Future<int> implements Future<String> { ... }
     ClassElementImpl classA =
-        ElementFactory.classElement('A', futureType.substitute4([intType]));
+        ElementFactory.classElement('A', futureType.instantiate([intType]));
     classA.interfaces = <InterfaceType>[
-      futureType.substitute4([stringType])
+      futureType.instantiate([stringType])
     ];
     // class B extends Future<String> implements Future<int> { ... }
     ClassElementImpl classB =
-        ElementFactory.classElement('B', futureType.substitute4([stringType]));
+        ElementFactory.classElement('B', futureType.instantiate([stringType]));
     classB.interfaces = <InterfaceType>[
-      futureType.substitute4([intType])
+      futureType.instantiate([intType])
     ];
     // flatten(A) = A and flatten(B) = B, since neither string nor int is more
     // specific than the other.
@@ -10786,9 +10901,9 @@
     // await e, where e has type Future<Future<int>>
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-        _typeProvider.futureType.substitute4(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     InterfaceType futureFutureIntType =
-        _typeProvider.futureType.substitute4(<DartType>[futureIntType]);
+        _typeProvider.futureType.instantiate(<DartType>[futureIntType]);
     Expression node =
         AstFactory.awaitExpression(_resolvedVariable(futureFutureIntType, 'e'));
     expect(_analyze(node), same(intType));
@@ -10799,7 +10914,7 @@
     // await e, where e has type Future<int>
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-        _typeProvider.futureType.substitute4(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     Expression node =
         AstFactory.awaitExpression(_resolvedVariable(futureIntType, 'e'));
     expect(_analyze(node), same(intType));
@@ -10995,7 +11110,7 @@
     // () async => e, where e has type int
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-        _typeProvider.futureType.substitute4(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     Expression expression = _resolvedVariable(intType, 'e');
     ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
     body.keyword = TokenFactory.tokenFromString('async');
@@ -11010,7 +11125,7 @@
     // () async => e, where e has type Future<int>
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-        _typeProvider.futureType.substitute4(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     Expression expression = _resolvedVariable(futureIntType, 'e');
     ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
     body.keyword = TokenFactory.tokenFromString('async');
@@ -11025,9 +11140,9 @@
     // () async => e, where e has type Future<Future<int>>
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-        _typeProvider.futureType.substitute4(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     InterfaceType futureFutureIntType =
-        _typeProvider.futureType.substitute4(<DartType>[futureIntType]);
+        _typeProvider.futureType.instantiate(<DartType>[futureIntType]);
     Expression expression = _resolvedVariable(futureFutureIntType, 'e');
     ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
     body.keyword = TokenFactory.tokenFromString('async');
@@ -11288,7 +11403,7 @@
     MethodElement methodElement = getMethod(listType, "[]");
     // "list" has type List<int>
     SimpleIdentifier identifier = AstFactory.identifier3("list");
-    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
     identifier.staticType = listOfIntType;
     // list[0] has MethodElement element (int) -> E
     IndexExpression indexExpression =
@@ -11309,7 +11424,7 @@
     MethodElement methodElement = getMethod(listType, "[]=");
     // "list" has type List<int>
     SimpleIdentifier identifier = AstFactory.identifier3("list");
-    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
     identifier.staticType = listOfIntType;
     // list[0] has MethodElement element (int) -> E
     IndexExpression indexExpression =
@@ -11355,7 +11470,7 @@
     constructor.type = constructorType;
     TypeName typeName =
         AstFactory.typeName(elementC, [AstFactory.typeName(elementI)]);
-    typeName.type = elementC.type.substitute4(<DartType>[elementI.type]);
+    typeName.type = elementC.type.instantiate(<DartType>[elementI.type]);
     InstanceCreationExpression node =
         AstFactory.instanceCreationExpression2(null, typeName);
     node.staticElement = constructor;
@@ -11411,7 +11526,7 @@
     DartType resultType = _analyze(node);
     _assertType2(
         _typeProvider.listType
-            .substitute4(<DartType>[_typeProvider.dynamicType]),
+            .instantiate(<DartType>[_typeProvider.dynamicType]),
         resultType);
     _listener.assertNoErrors();
   }
@@ -11422,7 +11537,7 @@
     DartType resultType = _analyze(node);
     _assertType2(
         _typeProvider.listType
-            .substitute4(<DartType>[_typeProvider.dynamicType]),
+            .instantiate(<DartType>[_typeProvider.dynamicType]),
         resultType);
     _listener.assertNoErrors();
   }
@@ -11432,7 +11547,7 @@
     Expression node = AstFactory.mapLiteral2();
     DartType resultType = _analyze(node);
     _assertType2(
-        _typeProvider.mapType.substitute4(
+        _typeProvider.mapType.instantiate(
             <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]),
         resultType);
     _listener.assertNoErrors();
@@ -11444,7 +11559,7 @@
         .mapLiteral2([AstFactory.mapLiteralEntry("k", _resolvedInteger(0))]);
     DartType resultType = _analyze(node);
     _assertType2(
-        _typeProvider.mapType.substitute4(
+        _typeProvider.mapType.instantiate(
             <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]),
         resultType);
     _listener.assertNoErrors();
@@ -13766,7 +13881,7 @@
 
     SimpleIdentifier x = _findIdentifier('x');
     expect(x.staticType,
-        typeProvider.listType.substitute4([typeProvider.intType]));
+        typeProvider.listType.instantiate([typeProvider.intType]));
   }
 
   void test_genericMethod_functionExpressionInvocation_explicit() {
@@ -14228,6 +14343,33 @@
     _expectInitializerType('foo', 'Future<String>', isNull);
   }
 
+  void test_implicitBounds() {
+    String code = r'''
+class A<T> {}
+
+class B<T extends num> {}
+
+class C<S extends int, T extends B<S>, U extends B> {}
+
+void test() {
+//
+  A ai;
+  B bi;
+  C ci;
+  var aa = new A();
+  var bb = new B();
+  var cc = new C();
+}
+''';
+    _resolveTestUnit(code);
+    _expectIdentifierType('ai', "A<dynamic>");
+    _expectIdentifierType('bi', "B<num>");
+    _expectIdentifierType('ci', "C<int, B<int>, B<num>>");
+    _expectIdentifierType('aa', "A<dynamic>");
+    _expectIdentifierType('bb', "B<num>");
+    _expectIdentifierType('cc', "C<int, B<int>, B<num>>");
+  }
+
   void test_setterWithDynamicTypeIsError() {
     Source source = addSource(r'''
 class A {
@@ -15229,7 +15371,7 @@
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     InterfaceType listOfStringType =
-        typeProvider.listType.substitute4([typeProvider.stringType]);
+        typeProvider.listType.instantiate([typeProvider.stringType]);
     // in the declaration
     {
       SimpleIdentifier identifier = EngineTestCase.findNode(
@@ -17087,20 +17229,6 @@
     _listener.assertErrorsWithCodes([StaticWarningCode.UNDEFINED_CLASS]);
   }
 
-  void test_visitTypeName_prefixed_noParameters_noArguments_undefined() {
-    SimpleIdentifier prefix = AstFactory.identifier3("unknownPrefix")
-      ..staticElement = new _StaleElement();
-    SimpleIdentifier suffix = AstFactory.identifier3("unknownSuffix")
-      ..staticElement = new _StaleElement();
-    TypeName typeName =
-        new TypeName(AstFactory.identifier(prefix, suffix), null);
-    _resolveNode(typeName, []);
-    expect(typeName.type, UndefinedTypeImpl.instance);
-    expect(prefix.staticElement, null);
-    expect(suffix.staticElement, null);
-    _listener.assertErrorsWithCodes([StaticWarningCode.UNDEFINED_CLASS]);
-  }
-
   void test_visitTypeName_parameters_arguments() {
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     ClassElement classB = ElementFactory.classElement2("B");
@@ -17129,6 +17257,20 @@
     _listener.assertNoErrors();
   }
 
+  void test_visitTypeName_prefixed_noParameters_noArguments_undefined() {
+    SimpleIdentifier prefix = AstFactory.identifier3("unknownPrefix")
+      ..staticElement = new _StaleElement();
+    SimpleIdentifier suffix = AstFactory.identifier3("unknownSuffix")
+      ..staticElement = new _StaleElement();
+    TypeName typeName =
+        new TypeName(AstFactory.identifier(prefix, suffix), null);
+    _resolveNode(typeName, []);
+    expect(typeName.type, UndefinedTypeImpl.instance);
+    expect(prefix.staticElement, null);
+    expect(suffix.staticElement, null);
+    _listener.assertErrorsWithCodes([StaticWarningCode.UNDEFINED_CLASS]);
+  }
+
   void test_visitTypeName_void() {
     ClassElement classA = ElementFactory.classElement2("A");
     TypeName typeName = AstFactory.typeName4("void");
@@ -17269,10 +17411,10 @@
   _StaleElement() : super("_StaleElement", -1);
 
   @override
-  accept(_) => throw "_StaleElement shouldn't be visited";
+  get kind => throw "_StaleElement's kind shouldn't be accessed";
 
   @override
-  get kind => throw "_StaleElement's kind shouldn't be accessed";
+  accept(_) => throw "_StaleElement shouldn't be visited";
 }
 
 /**
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 137deb5..0f4f64a 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -23,17 +23,18 @@
 @reflectiveTest
 class StaticTypeWarningCodeTest extends ResolverTestCase {
   void fail_inaccessibleSetter() {
-    Source source = addSource(r'''
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INACCESSIBLE_SETTER]);
-    verify([source]);
+    // TODO(rnystrom): This doesn't look right.
+    assertErrorsInCode(
+        r'''
+''',
+        [StaticTypeWarningCode.INACCESSIBLE_SETTER]);
   }
 
   void fail_method_lookup_mixin_of_extends() {
     // See dartbug.com/25605
     resetWithOptions(new AnalysisOptionsImpl()..enableSuperMixins = true);
-    Source source = addSource('''
+    assertErrorsInUnverifiedCode(
+        '''
 class A { a() => null; }
 class B {}
 abstract class M extends A {}
@@ -41,19 +42,19 @@
 main() {
   new T().a(); // Warning: The method 'a' is not defined for the class 'T'
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      // TODO(paulberry): when dartbug.com/25614 is fixed, add static warning
-      // code for "B does not extend A".
-      StaticTypeWarningCode.UNDEFINED_METHOD
-    ]);
+''',
+        [
+          // TODO(paulberry): when dartbug.com/25614 is fixed, add static warning
+          // code for "B does not extend A".
+          StaticTypeWarningCode.UNDEFINED_METHOD
+        ]);
   }
 
   void fail_method_lookup_mixin_of_implements() {
     // See dartbug.com/25605
     resetWithOptions(new AnalysisOptionsImpl()..enableSuperMixins = true);
-    Source source = addSource('''
+    assertErrorsInUnverifiedCode(
+        '''
 class A { a() => null; }
 class B {}
 abstract class M implements A {}
@@ -61,18 +62,18 @@
 main() {
   new T().a(); // Warning: The method 'a' is not defined for the class 'T'
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-      StaticTypeWarningCode.UNDEFINED_METHOD
-    ]);
+''',
+        [
+          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          StaticTypeWarningCode.UNDEFINED_METHOD
+        ]);
   }
 
   void fail_method_lookup_mixin_of_mixin() {
     // See dartbug.com/25605
     resetWithOptions(new AnalysisOptionsImpl()..enableSuperMixins = true);
-    Source source = addSource('''
+    assertErrorsInUnverifiedCode(
+        '''
 class A {}
 class B { b() => null; }
 class C {}
@@ -81,15 +82,15 @@
 main() {
   new T().b();
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void fail_method_lookup_mixin_of_mixin_application() {
     // See dartbug.com/25605
     resetWithOptions(new AnalysisOptionsImpl()..enableSuperMixins = true);
-    Source source = addSource('''
+    assertErrorsInUnverifiedCode(
+        '''
 class A { a() => null; }
 class B {}
 class C {}
@@ -98,21 +99,19 @@
 main() {
   new T().a();
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void fail_undefinedEnumConstant() {
     // We need a way to set the parseEnum flag in the parser to true.
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 enum E { ONE }
 E e() {
   return E.TWO;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT]);
   }
 
   void test_ambiguousImport_function() {
@@ -141,7 +140,8 @@
     // dubious practice for the computation of an assert message to have side
     // effects, since it is only evaluated if the assert fails).
     resetWithOptions(new AnalysisOptionsImpl()..enableAssertMessage = true);
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 class C {
   void foo() {}
 }
@@ -152,40 +152,38 @@
     assert(true, () { x = new C(); return 'msg'; }());
   }
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
     // Do not verify since `x.foo()` fails to resolve.
   }
 
   void test_await_flattened() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 import 'dart:async';
 Future<Future<int>> ffi() => null;
 f() async {
   Future<int> b = await ffi(); // Warning: int not assignable to Future<int>
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_await_simple() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 import 'dart:async';
 Future<int> fi() => null;
 f() async {
   String a = await fi(); // Warning: int not assignable to String
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_bug21912() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 class A {}
 class B extends A {}
 
@@ -204,120 +202,103 @@
     left = t2;
   }
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.INVALID_ASSIGNMENT,
-      StaticTypeWarningCode.INVALID_ASSIGNMENT
-    ]);
-    verify([source]);
+''',
+        [
+          StaticTypeWarningCode.INVALID_ASSIGNMENT,
+          StaticTypeWarningCode.INVALID_ASSIGNMENT
+        ]);
   }
 
   void test_expectedOneListTypeArgument() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 main() {
   <int, int> [];
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]);
   }
 
   void test_expectedTwoMapTypeArguments_one() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 main() {
   <int> {};
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
   }
 
   void test_expectedTwoMapTypeArguments_three() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 main() {
   <int, int, int> {};
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
   }
 
   void test_illegal_return_type_async_function() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 int f() async {}
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
-      HintCode.MISSING_RETURN
-    ]);
-    verify([source]);
+''',
+        [
+          StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
+          HintCode.MISSING_RETURN
+        ]);
   }
 
   void test_illegal_return_type_async_generator_function() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 int f() async* {}
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
   }
 
   void test_illegal_return_type_async_generator_method() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 class C {
   int f() async* {}
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
   }
 
   void test_illegal_return_type_async_method() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 class C {
   int f() async {}
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
-      HintCode.MISSING_RETURN
-    ]);
-    verify([source]);
+''',
+        [
+          StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
+          HintCode.MISSING_RETURN
+        ]);
   }
 
   void test_illegal_return_type_sync_generator_function() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 int f() sync* {}
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
   }
 
   void test_illegal_return_type_sync_generator_method() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 class C {
   int f() sync* {}
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
   }
 
   void test_inconsistentMethodInheritance_paramCount() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 abstract class A {
   int x();
 }
@@ -325,115 +306,101 @@
   int x(int y);
 }
 class C implements A, B {
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
   void test_inconsistentMethodInheritance_paramType() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 abstract class A {
   x(int i);
 }
 abstract class B {
   x(String s);
 }
-abstract class C implements A, B {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
-    verify([source]);
+abstract class C implements A, B {}
+''',
+        [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
   void test_inconsistentMethodInheritance_returnType() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 abstract class A {
   int x();
 }
 abstract class B {
   String x();
 }
-abstract class C implements A, B {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
-    verify([source]);
+abstract class C implements A, B {}
+''',
+        [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
   void test_instanceAccessToStaticMember_method_invocation() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static m() {}
 }
 main(A a) {
   a.m();
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
   }
 
   void test_instanceAccessToStaticMember_method_reference() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static m() {}
 }
 main(A a) {
   a.m;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
   }
 
   void test_instanceAccessToStaticMember_propertyAccess_field() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static var f;
 }
 main(A a) {
   a.f;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
   }
 
   void test_instanceAccessToStaticMember_propertyAccess_getter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static get f => 42;
 }
 main(A a) {
   a.f;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
   }
 
   void test_instanceAccessToStaticMember_propertyAccess_setter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static set f(x) {}
 }
 main(A a) {
   a.f = 42;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
   }
 
   void test_invalidAssignment_compoundAssignment() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class byte {
   int _value;
   byte(this._value);
@@ -443,152 +410,137 @@
 void main() {
   byte b = new byte(52);
   b += 3;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_defaultValue_named() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f({String x: 0}) {
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_defaultValue_optional() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f([String x = 0]) {
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_dynamic() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 main() {
   dynamic = 1;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_functionExpressionInvocation() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 main() {
   String x = (() => 5)();
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_ifNullAssignment() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 void f(int i) {
   double d;
   d ??= i;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_instanceVariable() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   int x;
 }
 f() {
   A a;
   a.x = '0';
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_localVariable() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   int x;
   x = '0';
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_regressionInIssue18468Fix() {
     // https://code.google.com/p/dart/issues/detail?id=18628
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class C<T> {
   T t = int;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_staticVariable() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static int x;
 }
 f() {
   A.x = '0';
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_topLevelVariableDeclaration() {
-    Source source = addSource("int x = 'string';");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+    assertErrorsInCode(
+        "int x = 'string';", [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_typeParameter() {
     // 14221
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class B<T> {
   T value;
   void test(num n) {
     value = n;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invalidAssignment_variableDeclaration() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   int x = 'string';
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
   void test_invocationOfNonFunction_class() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   void m() {
     A();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+}''',
+        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
 
   void test_invocationOfNonFunction_localGenericFunction() {
@@ -599,41 +551,39 @@
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableStrictCallChecks = true;
     resetWithOptions(options);
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 f(Function f) {
   return f();
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
 
   void test_invocationOfNonFunction_localObject() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableStrictCallChecks = true;
     resetWithOptions(options);
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 f(Object o) {
   return o();
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
 
   void test_invocationOfNonFunction_localVariable() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   int x;
   return x();
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
 
   void test_invocationOfNonFunction_ordinaryInvocation() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static int x;
 }
@@ -641,27 +591,27 @@
   m() {
     A.x();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+}''',
+        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     // A call to verify(source) fails as A.x() cannot be resolved.
   }
 
   void test_invocationOfNonFunction_staticInvocation() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static int get g => 0;
   f() {
     A.g();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+}''',
+        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     // A call to verify(source) fails as g() cannot be resolved.
   }
 
   void test_invocationOfNonFunction_superExpression() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   int get g => 0;
 }
@@ -669,282 +619,246 @@
   m() {
     var v = super.g();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
 
   void test_invocationOfNonFunctionExpression_literal() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   3(5);
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION]);
   }
 
   void test_nonBoolCondition_conditional() {
-    Source source = addSource("f() { return 3 ? 2 : 1; }");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
-    verify([source]);
+    assertErrorsInCode("f() { return 3 ? 2 : 1; }",
+        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
   }
 
   void test_nonBoolCondition_do() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   do {} while (3);
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
   }
 
   void test_nonBoolCondition_for() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   for (;3;) {}
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
   }
 
   void test_nonBoolCondition_if() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   if (3) return 2; else return 1;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
   }
 
   void test_nonBoolCondition_while() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   while (3) {}
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
   }
 
   void test_nonBoolExpression_functionType() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 int makeAssertion() => 1;
 f() {
   assert(makeAssertion);
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
   }
 
   void test_nonBoolExpression_interfaceType() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   assert(0);
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
   }
 
   void test_nonBoolNegationExpression() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 f() {
   !42;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION]);
   }
 
   void test_nonBoolOperand_and_left() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 bool f(int left, bool right) {
   return left && right;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_OPERAND]);
   }
 
   void test_nonBoolOperand_and_right() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 bool f(bool left, String right) {
   return left && right;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_OPERAND]);
   }
 
   void test_nonBoolOperand_or_left() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 bool f(List<int> left, bool right) {
   return left || right;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_OPERAND]);
   }
 
   void test_nonBoolOperand_or_right() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 bool f(bool left, double right) {
   return left || right;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_BOOL_OPERAND]);
   }
 
   void test_nonTypeAsTypeArgument_notAType() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 int A;
 class B<E> {}
-f(B<A> b) {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
-    verify([source]);
+f(B<A> b) {}''',
+        [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
   }
 
   void test_nonTypeAsTypeArgument_undefinedIdentifier() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class B<E> {}
-f(B<A> b) {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
-    verify([source]);
+f(B<A> b) {}''',
+        [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
   }
 
   void test_returnOfInvalidType_async_future_int_mismatches_future_null() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 import 'dart:async';
 Future<Null> f() async {
   return 5;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_async_future_int_mismatches_future_string() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 import 'dart:async';
 Future<String> f() async {
   return 5;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_async_future_int_mismatches_int() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 int f() async {
   return 5;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
-      StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE
-    ]);
-    verify([source]);
+''',
+        [
+          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+          StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE
+        ]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_function() {
-    Source source = addSource("int f() => '0';");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+    assertErrorsInCode(
+        "int f() => '0';", [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_getter() {
-    Source source = addSource("int get g => '0';");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+    assertErrorsInCode(
+        "int get g => '0';", [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_localFunction() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   String m() {
     int f() => '0';
     return '0';
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_method() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   int f() => '0';
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_void() {
-    Source source = addSource("void f() => 42;");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+    assertErrorsInCode(
+        "void f() => 42;", [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_function() {
-    Source source = addSource("int f() { return '0'; }");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+    assertErrorsInCode("int f() { return '0'; }",
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_getter() {
-    Source source = addSource("int get g { return '0'; }");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+    assertErrorsInCode("int get g { return '0'; }",
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_localFunction() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   String m() {
     int f() { return '0'; }
     return '0';
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_returnOfInvalidType_method() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   int f() { return '0'; }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   // https://github.com/dart-lang/sdk/issues/24713
   void test_returnOfInvalidType_not_issued_for_valid_generic_return() {
-    Source source = addSource(r'''
+    assertNoErrorsInCode(r'''
 abstract class F<T, U>  {
   U get value;
 }
@@ -958,321 +872,296 @@
 }
 
 void main() { }''');
-    computeLibrarySourceErrors(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   void test_returnOfInvalidType_void() {
-    Source source = addSource("void f() { return 42; }");
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
+    assertErrorsInCode("void f() { return 42; }",
+        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
   void test_typeArgumentNotMatchingBounds_classTypeAlias() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class C {}
 class G<E extends A> {}
-class D = G<B> with C;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+class D = G<B> with C;
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_extends() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-class C extends G<B>{}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+class C extends G<B>{}
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_extends_regressionInIssue18468Fix() {
     // https://code.google.com/p/dart/issues/detail?id=18628
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class X<T extends Type> {}
-class Y<U> extends X<U> {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+class Y<U> extends X<U> {}
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_fieldFormalParameter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
 class C {
   var f;
   C(G<B> this.f) {}
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_functionReturnType() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-G<B> f() { return null; }''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+G<B> f() { return null; }
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_functionTypeAlias() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-typedef G<B> f();''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+typedef G<B> f();
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_functionTypedFormalParameter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-f(G<B> h()) {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+f(G<B> h()) {}
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_implements() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-class C implements G<B>{}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+class C implements G<B>{}
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_is() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-var b = 1 is G<B>;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+var b = 1 is G<B>;
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_methodReturnType() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
 class C {
   G<B> m() { return null; }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_new() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-f() { return new G<B>(); }''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+f() { return new G<B>(); }
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_new_superTypeOfUpperBound() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B extends A {}
 class C extends B {}
 class G<E extends B> {}
-f() { return new G<A>(); }''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+f() { return new G<A>(); }
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_parameter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-f(G<B> g) {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+f(G<B> g) {}
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_redirectingConstructor() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class X<T extends A> {
   X(int x, int y) {}
   factory X.name(int x, int y) = X<B>;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-      StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE
-    ]);
-    verify([source]);
+}''',
+        [
+          StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
+          StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE
+        ]);
   }
 
   void test_typeArgumentNotMatchingBounds_typeArgumentList() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class C<E> {}
 class D<E extends A> {}
-C<D<B>> Var;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+C<D<B>> Var;
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_typeParameter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class C {}
 class G<E extends A> {}
-class D<F extends G<B>> {}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+class D<F extends G<B>> {}
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_variableDeclaration() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-G<B> g;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+G<B> g;
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeArgumentNotMatchingBounds_with() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {}
 class G<E extends A> {}
-class C extends Object with G<B>{}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
+class C extends Object with G<B>{}
+''',
+        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
   void test_typeParameterSupertypeOfItsBound() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A<T extends T> {
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND]);
-    verify([source]);
+}
+''',
+        [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND]);
   }
 
   void
       test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 callMe(f()) { f(); }
 main(Object p) {
   (p is String) && callMe(() { p.length; });
   p = 0;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_booleanAnd_useInRight_mutatedInLeft() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   ((p is String) && ((p = 42) == 42)) && p.length != 0;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_booleanAnd_useInRight_mutatedInRight() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   (p is String) && (((p = 42) == 42) && p.length != 0);
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void
       test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 callMe(f()) { f(); }
 main(Object p) {
   p is String ? callMe(() { p.length; }) : 0;
   p = 42;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void
       test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 callMe(f()) { f(); }
 main(Object p) {
   p = 42;
   p is String ? callMe(() { p.length; }) : 0;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_conditional_useInThen_hasAssignment() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   p is String ? (p.length + (p = 42)) : 0;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_accessedInClosure_hasAssignment() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 callMe(f()) { f(); }
 main(Object p) {
   if (p is String) {
@@ -1281,24 +1170,24 @@
     });
   }
   p = 0;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_and_right_hasAssignment() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   if (p is String && (p = null) == null) {
     p.length;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_extends_notMoreSpecific_dynamic() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class V {}
 class A<T> {}
 class B<S> extends A<S> {
@@ -1309,13 +1198,13 @@
   if (p is B) {
     p.b;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class V {}
 class A<T> {}
 class B<S> extends A<S> {
@@ -1326,85 +1215,85 @@
   if (p is B<int>) {
     p.b;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_after() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   if (p is String) {
     p.length;
     p = 0;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_before() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   if (p is String) {
     p = 0;
     p.length;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_inClosure_anonymous_after() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   if (p is String) {
     p.length;
   }
   () {p = 0;};
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_inClosure_anonymous_before() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   () {p = 0;};
   if (p is String) {
     p.length;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_inClosure_function_after() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   if (p is String) {
     p.length;
   }
   f() {p = 0;};
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_inClosure_function_before() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 main(Object p) {
   f() {p = 0;};
   if (p is String) {
     p.length;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_implements_notMoreSpecific_dynamic() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class V {}
 class A<T> {}
 class B<S> implements A<S> {
@@ -1415,13 +1304,13 @@
   if (p is B) {
     p.b;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_with_notMoreSpecific_dynamic() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class V {}
 class A<T> {}
 class B<S> extends Object with A<S> {
@@ -1432,30 +1321,29 @@
   if (p is B) {
     p.b;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedFunction() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 void f() {
   g();
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
   }
 
   void test_undefinedFunction_inCatch() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 void f() {
   try {
   } on Object {
     g();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
   }
 
   void test_undefinedFunction_inImportedLib() {
@@ -1472,11 +1360,11 @@
   }
 
   void test_undefinedGetter() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class T {}
-f(T e) { return e.m; }''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+f(T e) { return e.m; }''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_generic_function_call() {
@@ -1486,30 +1374,31 @@
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableStrictCallChecks = true;
     resetWithOptions(options);
-    Source source = addSource('''
+    assertErrorsInUnverifiedCode(
+        '''
 f(Function f) {
   return f.call;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_object_call() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableStrictCallChecks = true;
     resetWithOptions(options);
-    Source source = addSource('''
+    assertErrorsInUnverifiedCode(
+        '''
 f(Object o) {
   return o.call;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_proxy_annotation_fakeProxy() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 library L;
 class Fake {
   const Fake();
@@ -1518,115 +1407,109 @@
 @proxy class PrefixProxy {}
 main() {
   new PrefixProxy().foo;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_static() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
-var a = A.B;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+var a = A.B;''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_typeLiteral_cascadeTarget() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class T {
   static int get foo => 42;
 }
 main() {
   T..foo;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_typeLiteral_conditionalAccess() {
     // When applied to a type literal, the conditional access operator '?.'
     // cannot be used to access instance getters of Type.
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 class A {}
 f() => A?.hashCode;
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_void() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class T {
   void m() {}
 }
-f(T e) { return e.m().f; }''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+f(T e) { return e.m().f; }''',
+        [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A<K, V> {
   K element;
 }
 main(A<int> a) {
   a.element.anyGetterExistsInDynamic;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
   }
 
   void test_undefinedGetter_wrongNumberOfTypeArguments_tooMany() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A<E> {
   E element;
 }
 main(A<int,int> a) {
   a.element.anyGetterExistsInDynamic;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
   }
 
   void test_undefinedGetter_wrongOfTypeArgument() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A<E> {
   E element;
 }
 main(A<NoSuchType> a) {
   a.element.anyGetterExistsInDynamic;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
   }
 
   void test_undefinedMethod() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   void m() {
     n();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_assignmentExpression() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B {
   f(A a) {
     A a2 = new A();
     a += a2;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_generic_function_call() {
@@ -1636,17 +1519,18 @@
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableStrictCallChecks = true;
     resetWithOptions(options);
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 f(Function f) {
   f.call();
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_ignoreTypePropagation() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B extends A {
   m() {}
@@ -1656,28 +1540,26 @@
     A a = new B();
     a.m();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_leastUpperBoundWithNull() {
-    Source source = addSource('f(bool b, int i) => (b ? null : i).foo();');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+    assertErrorsInCode('f(bool b, int i) => (b ? null : i).foo();',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_object_call() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableStrictCallChecks = true;
     resetWithOptions(options);
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 f(Object o) {
   o.call();
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_private() {
@@ -1688,19 +1570,20 @@
 class A {
   _foo() {}
 }''');
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 import 'lib.dart';
 class B extends A {
   test() {
     _foo();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_proxy_annotation_fakeProxy() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 library L;
 class Fake {
   const Fake();
@@ -1709,230 +1592,229 @@
 @proxy class PrefixProxy {}
 main() {
   new PrefixProxy().foo();
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_typeLiteral_cascadeTarget() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 class T {
   static void foo() {}
 }
 main() {
   T..foo();
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_typeLiteral_conditionalAccess() {
     // When applied to a type literal, the conditional access operator '?.'
     // cannot be used to access instance methods of Type.
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 class A {}
 f() => A?.toString();
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethodWithConstructor() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class C {
   C.m();
 }
 f() {
   C c = C.m();
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR]);
   }
 
   void test_undefinedOperator_indexBoth() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
 f(A a) {
   a[0]++;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_indexGetter() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
 f(A a) {
   a[0];
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_indexSetter() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
 f(A a) {
   a[0] = 1;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_plus() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
 f(A a) {
   a + 1;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_postfixExpression() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 f(A a) {
   a++;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_prefixExpression() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 f(A a) {
   ++a;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedSetter() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class T {}
-f(T e1) { e1.m = 0; }''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+f(T e1) { e1.m = 0; }''',
+        [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_undefinedSetter_static() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
-f() { A.B = 0;}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+f() { A.B = 0;}''',
+        [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_undefinedSetter_typeLiteral_cascadeTarget() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class T {
   static void set foo(_) {}
 }
 main() {
   T..foo = 42;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_undefinedSetter_void() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class T {
   void m() {}
 }
-f(T e) { e.m().f = 0; }''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+f(T e) { e.m().f = 0; }''',
+        [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_undefinedSuperGetter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B extends A {
   get g {
     return super.g;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_GETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_SUPER_GETTER]);
   }
 
   void test_undefinedSuperMethod() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B extends A {
   m() { return super.m(); }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
   }
 
   void test_undefinedSuperOperator_binaryExpression() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
 class B extends A {
   operator +(value) {
     return super + value;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
   }
 
   void test_undefinedSuperOperator_indexBoth() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
 class B extends A {
   operator [](index) {
     return super[index]++;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
   }
 
   void test_undefinedSuperOperator_indexGetter() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
 class B extends A {
   operator [](index) {
     return super[index + 1];
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
   }
 
   void test_undefinedSuperOperator_indexSetter() {
-    Source source = addSource(r'''
+    assertErrorsInUnverifiedCode(
+        r'''
 class A {}
 class B extends A {
   operator []=(index, value) {
     return super[index] = 0;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
   }
 
   void test_undefinedSuperSetter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class B extends A {
   f() {
     super.m = 0;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_SETTER]);
+}''',
+        [StaticTypeWarningCode.UNDEFINED_SUPER_SETTER]);
   }
 
   void test_unqualifiedReferenceToNonLocalStaticMember_getter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static int get a => 0;
 }
@@ -1940,16 +1822,15 @@
   int b() {
     return a;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
-    ]);
-    verify([source]);
+}''',
+        [
+          StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+        ]);
   }
 
   void test_unqualifiedReferenceToNonLocalStaticMember_method() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static void a() {}
 }
@@ -1957,16 +1838,15 @@
   void b() {
     a();
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
-    ]);
-    verify([source]);
+}''',
+        [
+          StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+        ]);
   }
 
   void test_unqualifiedReferenceToNonLocalStaticMember_setter() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {
   static set a(x) {}
 }
@@ -1974,196 +1854,390 @@
   b(y) {
     a = y;
   }
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
-    ]);
-    verify([source]);
+}''',
+        [
+          StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+        ]);
   }
 
   void test_wrongNumberOfTypeArguments_classAlias() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class M {}
-class B<F extends num> = A<F> with M;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
-    verify([source]);
+class B<F extends num> = A<F> with M;''',
+        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
   }
 
   void test_wrongNumberOfTypeArguments_tooFew() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A<E, F> {}
-A<A> a = null;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
-    verify([source]);
+A<A> a = null;''',
+        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
   }
 
   void test_wrongNumberOfTypeArguments_tooMany() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A<E> {}
-A<A, A> a = null;''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
-    verify([source]);
+A<A, A> a = null;''',
+        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
   }
 
   void test_wrongNumberOfTypeArguments_typeTest_tooFew() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class C<K, V> {}
 f(p) {
   return p is C<A>;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
   }
 
   void test_wrongNumberOfTypeArguments_typeTest_tooMany() {
-    Source source = addSource(r'''
+    assertErrorsInCode(
+        r'''
 class A {}
 class C<E> {}
 f(p) {
   return p is C<A, A>;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
-    verify([source]);
+}''',
+        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+  }
+
+  void test_forIn_notIterable() {
+    assertErrorsInCode(
+        '''
+f() {
+  for (var i in true) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE]);
+  }
+
+  void test_forIn_declaredVariableWrongType() {
+    assertErrorsInCode(
+        '''
+f() {
+  for (int i in <String>[]) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_forIn_existingVariableWrongType() {
+    assertErrorsInCode(
+        '''
+f() {
+  int i;
+  for (i in <String>[]) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_forIn_declaredVariableRightType() {
+    assertNoErrorsInCode('''
+f() {
+  for (int i in <int>[]) {}
+}
+''');
+  }
+
+  void test_forIn_existingVariableRightType() {
+    assertNoErrorsInCode('''
+f() {
+  int i;
+  for (i in <int>[]) {}
+}
+''');
+  }
+
+  void test_forIn_dynamicVariable() {
+    assertNoErrorsInCode('''
+f() {
+  for (var i in <int>[]) {}
+}
+''');
+  }
+
+  void test_forIn_iterableOfDynamic() {
+    assertNoErrorsInCode('''
+f() {
+  for (int i in []) {}
+}
+''');
+  }
+
+  void test_forIn_dynamicIterable() {
+    assertNoErrorsInCode('''
+f() {
+  dynamic iterable;
+  for (int i in iterable) {}
+}
+''');
+  }
+
+  void test_forIn_upcast() {
+    assertNoErrorsInCode('''
+f() {
+  for (num i in <int>[]) {}
+}
+''');
+  }
+
+  void test_forIn_downcast() {
+    assertNoErrorsInCode('''
+f() {
+  for (int i in <num>[]) {}
+}
+''');
+  }
+
+  void test_forIn_typeBoundBad() {
+    assertErrorsInCode(
+        '''
+class Foo<T extends Iterable<int>> {
+  void method(T iterable) {
+    for (String i in iterable) {}
+  }
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_forIn_typeBoundGood() {
+    assertNoErrorsInCode('''
+class Foo<T extends Iterable<int>> {
+  void method(T iterable) {
+    for (var i in iterable) {}
+  }
+}
+''');
+  }
+
+  void test_awaitForIn_notStream() {
+    assertErrorsInCode(
+        '''
+f() async {
+  await for (var i in true) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE]);
+  }
+
+  void test_awaitForIn_declaredVariableWrongType() {
+    assertErrorsInCode(
+        '''
+import 'dart:async';
+f() async {
+  Stream<String> stream;
+  await for (int i in stream) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_awaitForIn_existingVariableWrongType() {
+    assertErrorsInCode(
+        '''
+import 'dart:async';
+f() async {
+  Stream<String> stream;
+  int i;
+  await for (i in stream) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_awaitForIn_declaredVariableRightType() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<int> stream;
+  await for (int i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_existingVariableRightType() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<int> stream;
+  int i;
+  await for (i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_dynamicVariable() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<int> stream;
+  await for (var i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_streamOfDynamic() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream stream;
+  await for (int i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_dynamicStream() {
+    assertNoErrorsInCode('''
+f() async {
+  dynamic stream;
+  await for (int i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_upcast() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<int> stream;
+  await for (num i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_downcast() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<num> stream;
+  await for (int i in stream) {}
+}
+''');
   }
 
   void test_yield_async_to_basic_type() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 int f() async* {
   yield 3;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
-      StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE
-    ]);
-    verify([source]);
+''',
+        [
+          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+          StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE
+        ]);
   }
 
   void test_yield_async_to_iterable() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 Iterable<int> f() async* {
   yield 3;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
-      StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE
-    ]);
-    verify([source]);
+''',
+        [
+          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+          StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE
+        ]);
   }
 
   void test_yield_async_to_mistyped_stream() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 import 'dart:async';
 Stream<int> f() async* {
   yield "foo";
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
   }
 
   void test_yield_each_async_non_stream() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 f() async* {
   yield* 0;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
   }
 
   void test_yield_each_async_to_mistyped_stream() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 import 'dart:async';
 Stream<int> f() async* {
   yield* g();
 }
 Stream<String> g() => null;
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
   }
 
   void test_yield_each_sync_non_iterable() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 f() sync* {
   yield* 0;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
   }
 
   void test_yield_each_sync_to_mistyped_iterable() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 Iterable<int> f() sync* {
   yield* g();
 }
 Iterable<String> g() => null;
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
   }
 
   void test_yield_sync_to_basic_type() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 int f() sync* {
   yield 3;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
-      StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE
-    ]);
-    verify([source]);
+''',
+        [
+          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+          StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE
+        ]);
   }
 
   void test_yield_sync_to_mistyped_iterable() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 Iterable<int> f() sync* {
   yield "foo";
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
-    verify([source]);
+''',
+        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
   }
 
   void test_yield_sync_to_stream() {
-    Source source = addSource('''
+    assertErrorsInCode(
+        '''
 import 'dart:async';
 Stream<int> f() sync* {
   yield 3;
 }
-''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
-      StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE
-    ]);
-    verify([source]);
+''',
+        [
+          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+          StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE
+        ]);
   }
 }
 
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index 20d1a821..fe69d2c 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -138,14 +138,14 @@
     InterfaceType LType = LClass.type;
     ClassElementImpl MClass = ElementFactory.classElement2('M', ["T"]);
     DartType typeParam = MClass.typeParameters[0].type;
-    InterfaceType superType = LType.substitute4(<DartType>[typeParam]);
+    InterfaceType superType = LType.instantiate(<DartType>[typeParam]);
     MClass.interfaces = <InterfaceType>[superType];
     InterfaceType MType = MClass.type;
 
-    InterfaceType top = LType.substitute4(<DartType>[dynamicType]);
-    InterfaceType left = MType.substitute4(<DartType>[dynamicType]);
-    InterfaceType right = LType.substitute4(<DartType>[intType]);
-    InterfaceType bottom = MType.substitute4(<DartType>[intType]);
+    InterfaceType top = LType.instantiate(<DartType>[dynamicType]);
+    InterfaceType left = MType.instantiate(<DartType>[dynamicType]);
+    InterfaceType right = LType.instantiate(<DartType>[intType]);
+    InterfaceType bottom = MType.instantiate(<DartType>[intType]);
 
     _checkCrossLattice(top, left, right, bottom);
   }
@@ -341,12 +341,12 @@
     // <TFrom, TTo extends Iterable<TFrom>>(TFrom) -> TTo
     var tFrom = TypeBuilder.variable('TFrom');
     var tTo =
-        TypeBuilder.variable('TTo', bound: iterableType.substitute4([tFrom]));
+        TypeBuilder.variable('TTo', bound: iterableType.instantiate([tFrom]));
     var cast = TypeBuilder
         .function(types: [tFrom, tTo], required: [tFrom], result: tTo);
     expect(_inferCall(cast, [stringType]), [
       stringType,
-      iterableType.substitute4([stringType])
+      iterableType.instantiate([stringType])
     ]);
   }
 
@@ -358,19 +358,19 @@
         clonable.type;
     // class Foo extends Clonable<Foo>
     ClassElementImpl foo = ElementFactory.classElement('Foo', null);
-    foo.supertype = clonable.type.substitute4([foo.type]);
+    foo.supertype = clonable.type.instantiate([foo.type]);
 
     // <S extends Clonable<S>>
     var s = TypeBuilder.variable('S');
     (s.element as TypeParameterElementImpl).bound =
-        clonable.type.substitute4([s]);
+        clonable.type.instantiate([s]);
     // (S, S) -> S
     var clone = TypeBuilder.function(types: [s], required: [s, s], result: s);
     expect(_inferCall(clone, [foo.type, foo.type]), [foo.type]);
 
     // Something invalid...
     expect(_inferCall(clone, [stringType, numType]), [
-      clonable.type.substitute4([dynamicType])
+      clonable.type.instantiate([dynamicType])
     ]);
   }
 
@@ -687,14 +687,14 @@
     ClassElementImpl AClass = ElementFactory.classElement2('A', ["Q"]);
     InterfaceType AType = AClass.type;
     ClassElementImpl BClass = ElementFactory.classElement2('B', ["R"]);
-    BClass.supertype = AType.substitute4([BClass.typeParameters[0].type]);
+    BClass.supertype = AType.instantiate([BClass.typeParameters[0].type]);
     InterfaceType BType = BClass.type;
 
     DartType s = TypeBuilder.variable("S");
-    (s.element as TypeParameterElementImpl).bound = AType.substitute4([s]);
+    (s.element as TypeParameterElementImpl).bound = AType.instantiate([s]);
     DartType t = TypeBuilder.variable("T", bound: s);
     DartType u = TypeBuilder.variable("U");
-    (u.element as TypeParameterElementImpl).bound = BType.substitute4([u]);
+    (u.element as TypeParameterElementImpl).bound = BType.instantiate([u]);
     DartType v = TypeBuilder.variable("V", bound: u);
 
     _checkIsStrictSubtypeOf(
@@ -710,14 +710,14 @@
     InterfaceType LType = LClass.type;
     ClassElementImpl MClass = ElementFactory.classElement2('M', ["T"]);
     DartType typeParam = MClass.typeParameters[0].type;
-    InterfaceType superType = LType.substitute4(<DartType>[typeParam]);
+    InterfaceType superType = LType.instantiate(<DartType>[typeParam]);
     MClass.interfaces = <InterfaceType>[superType];
     InterfaceType MType = MClass.type;
 
-    InterfaceType top = LType.substitute4(<DartType>[dynamicType]);
-    InterfaceType left = MType.substitute4(<DartType>[dynamicType]);
-    InterfaceType right = LType.substitute4(<DartType>[intType]);
-    InterfaceType bottom = MType.substitute4(<DartType>[intType]);
+    InterfaceType top = LType.instantiate(<DartType>[dynamicType]);
+    InterfaceType left = MType.instantiate(<DartType>[dynamicType]);
+    InterfaceType right = LType.instantiate(<DartType>[intType]);
+    InterfaceType bottom = MType.instantiate(<DartType>[intType]);
 
     _checkLattice(top, left, right, bottom);
   }
@@ -1224,9 +1224,9 @@
     // class List<int>
     // class List<double>
     //
-    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
     InterfaceType listOfDoubleType =
-        listType.substitute4(<DartType>[doubleType]);
+        listType.instantiate(<DartType>[doubleType]);
     _checkLeastUpperBound(listOfIntType, listOfDoubleType, objectType);
   }
 
@@ -1235,7 +1235,7 @@
     // List<int>
     // List<int>
     //
-    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
     expect(
         typeSystem.getLeastUpperBound(
             typeProvider, listOfIntType, listOfIntType),
diff --git a/pkg/analyzer/test/parse_compilation_unit_test.dart b/pkg/analyzer/test/parse_compilation_unit_test.dart
index c5313da..9f9679d 100644
--- a/pkg/analyzer/test/parse_compilation_unit_test.dart
+++ b/pkg/analyzer/test/parse_compilation_unit_test.dart
@@ -31,9 +31,7 @@
       parseCompilationUnit("void main() => print('Hello, world!')");
     }, throwsA(predicate((error) {
       return error is AnalyzerErrorGroup &&
-          error
-              .toString()
-              .contains("Error in <unknown source>: Expected to find ';'");
+          error.toString().contains("Error in <unknown source>: Expected to find ';'");
     })));
   });
 
diff --git a/pkg/analyzer/test/reflective_tests.dart b/pkg/analyzer/test/reflective_tests.dart
index 970743d..2391879 100644
--- a/pkg/analyzer/test/reflective_tests.dart
+++ b/pkg/analyzer/test/reflective_tests.dart
@@ -4,9 +4,9 @@
 
 library analyzer.test.reflective_tests;
 
+import 'dart:async';
 @MirrorsUsed(metaTargets: 'ReflectiveTest')
 import 'dart:mirrors';
-import 'dart:async';
 
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index d7e0a58..63130a5 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -1463,6 +1463,46 @@
     expect(context.isServerLibrary(source), isFalse);
   }
 
+  void test_onResultInvalidated_removeSource() {
+    Source source = addSource('/test.dart', 'main() {}');
+    _analyzeAll_assertFinished();
+    // listen for changes
+    bool listenerInvoked = false;
+    context.onResultChanged(RESOLVED_UNIT).listen((ResultChangedEvent event) {
+      Source eventSource = event.target.source;
+      expect(event.wasComputed, isFalse);
+      expect(event.wasInvalidated, isTrue);
+      expect(event.descriptor, RESOLVED_UNIT);
+      expect(eventSource, source);
+      listenerInvoked = true;
+    });
+    // apply changes
+    expect(listenerInvoked, false);
+    context.applyChanges(new ChangeSet()..removedSource(source));
+    // verify
+    expect(listenerInvoked, isTrue);
+  }
+
+  void test_onResultInvalidated_setContents() {
+    Source source = addSource('/test.dart', 'main() {}');
+    _analyzeAll_assertFinished();
+    // listen for changes
+    bool listenerInvoked = false;
+    context.onResultChanged(RESOLVED_UNIT).listen((ResultChangedEvent event) {
+      Source eventSource = event.target.source;
+      expect(event.wasComputed, isFalse);
+      expect(event.wasInvalidated, isTrue);
+      expect(event.descriptor, RESOLVED_UNIT);
+      expect(eventSource, source);
+      listenerInvoked = true;
+    });
+    // apply changes
+    expect(listenerInvoked, false);
+    context.setContents(source, 'class B {}');
+    // verify
+    expect(listenerInvoked, isTrue);
+  }
+
   void test_parseCompilationUnit_errors() {
     Source source = addSource("/lib.dart", "library {");
     CompilationUnit compilationUnit = context.parseCompilationUnit(source);
@@ -1930,20 +1970,26 @@
 //    JUnitTestCase.assertNotNullMsg("performAnalysisTask failed to compute an element model", _context.getLibraryElement(source));
   }
 
-  void test_performAnalysisTask_onResultComputed() {
+  void test_performAnalysisTask_onResultChanged() {
     Set<String> libraryElementUris = new Set<String>();
     Set<String> parsedUnitUris = new Set<String>();
     Set<String> resolvedUnitUris = new Set<String>();
     // listen
-    context.onResultComputed(LIBRARY_ELEMENT).listen((event) {
+    context.onResultChanged(LIBRARY_ELEMENT).listen((event) {
+      expect(event.wasComputed, isTrue);
+      expect(event.wasInvalidated, isFalse);
       Source librarySource = event.target;
       libraryElementUris.add(librarySource.uri.toString());
     });
-    context.onResultComputed(PARSED_UNIT).listen((event) {
+    context.onResultChanged(PARSED_UNIT).listen((event) {
+      expect(event.wasComputed, isTrue);
+      expect(event.wasInvalidated, isFalse);
       Source source = event.target;
       parsedUnitUris.add(source.uri.toString());
     });
-    context.onResultComputed(RESOLVED_UNIT).listen((event) {
+    context.onResultChanged(RESOLVED_UNIT).listen((event) {
+      expect(event.wasComputed, isTrue);
+      expect(event.wasInvalidated, isFalse);
       LibrarySpecificUnit target = event.target;
       Source librarySource = target.library;
       resolvedUnitUris.add(librarySource.uri.toString());
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index f907ae3..080c544 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -1969,7 +1969,7 @@
     FunctionTypeAliasElementImpl f =
         ElementFactory.functionTypeAliasElement('f');
     ClassElementImpl c = ElementFactory.classElement2('C', ['T']);
-    f.returnType = c.type.substitute4([f.type]);
+    f.returnType = c.type.instantiate([f.type]);
     expect(f.type.toString(), '() \u2192 C<...>');
   }
 
@@ -2757,8 +2757,8 @@
     ClassElement classB = ElementFactory.classElement2("B");
     DartType dynamicType = DynamicTypeImpl.instance;
     InterfaceType typeAOfDynamic =
-        classA.type.substitute4(<DartType>[dynamicType]);
-    InterfaceType typeAOfB = classA.type.substitute4(<DartType>[classB.type]);
+        classA.type.instantiate(<DartType>[dynamicType]);
+    InterfaceType typeAOfB = classA.type.instantiate(<DartType>[classB.type]);
     expect(typeAOfDynamic.isMoreSpecificThan(typeAOfB), isFalse);
     expect(typeAOfB.isMoreSpecificThan(typeAOfDynamic), isTrue);
   }
@@ -2895,8 +2895,8 @@
     ClassElement classB = ElementFactory.classElement2("B");
     DartType dynamicType = DynamicTypeImpl.instance;
     InterfaceType typeAOfDynamic =
-        classA.type.substitute4(<DartType>[dynamicType]);
-    InterfaceType typeAOfB = classA.type.substitute4(<DartType>[classB.type]);
+        classA.type.instantiate(<DartType>[dynamicType]);
+    InterfaceType typeAOfB = classA.type.instantiate(<DartType>[classB.type]);
     expect(typeAOfDynamic.isSubtypeOf(typeAOfB), isTrue);
     expect(typeAOfB.isSubtypeOf(typeAOfDynamic), isTrue);
   }
@@ -2982,7 +2982,7 @@
     ClassElement classJ = ElementFactory.classElement("J", classI.type);
     ClassElement classK = ElementFactory.classElement2("K");
     InterfaceType typeA = classA.type;
-    InterfaceType typeA_dynamic = typeA.substitute4(<DartType>[dynamicType]);
+    InterfaceType typeA_dynamic = typeA.instantiate(<DartType>[dynamicType]);
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl(classA);
     InterfaceTypeImpl typeAJ = new InterfaceTypeImpl(classA);
     InterfaceTypeImpl typeAK = new InterfaceTypeImpl(classA);
@@ -3963,7 +3963,7 @@
   void test_resolveToBound_bound() {
     ClassElementImpl classS = ElementFactory.classElement2("A");
     TypeParameterElementImpl element =
-    new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
     element.bound = classS.type;
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     expect(type.resolveToBound(null), same(classS.type));
@@ -3972,11 +3972,11 @@
   void test_resolveToBound_nestedBound() {
     ClassElementImpl classS = ElementFactory.classElement2("A");
     TypeParameterElementImpl elementE =
-    new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
     elementE.bound = classS.type;
     TypeParameterTypeImpl typeE = new TypeParameterTypeImpl(elementE);
     TypeParameterElementImpl elementF =
-    new TypeParameterElementImpl.forNode(AstFactory.identifier3("F"));
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("F"));
     elementF.bound = typeE;
     TypeParameterTypeImpl typeF = new TypeParameterTypeImpl(elementE);
     expect(typeF.resolveToBound(null), same(classS.type));
diff --git a/pkg/analyzer/test/src/summary/index_unit_test.dart b/pkg/analyzer/test/src/summary/index_unit_test.dart
index bfa331f..83da4c2 100644
--- a/pkg/analyzer/test/src/summary/index_unit_test.dart
+++ b/pkg/analyzer/test/src/summary/index_unit_test.dart
@@ -139,6 +139,43 @@
     _assertDefinedName('V', IndexNameKind.topLevel, 'V = 42;');
   }
 
+  void test_hasAncestor_ClassDeclaration() {
+    _indexTestUnit('''
+class A {}
+class B1 extends A {}
+class B2 implements A {}
+class C1 extends B1 {}
+class C2 extends B2 {}
+class C3 implements B1 {}
+class C4 implements B2 {}
+class M extends Object with A {}
+''');
+    ClassElement classElementA = findElement("A");
+    assertThat(classElementA)
+      ..isAncestorOf('B1 extends A')
+      ..isAncestorOf('B2 implements A')
+      ..isAncestorOf('C1 extends B1')
+      ..isAncestorOf('C2 extends B2')
+      ..isAncestorOf('C3 implements B1')
+      ..isAncestorOf('C4 implements B2')
+      ..isAncestorOf('M extends Object with A');
+  }
+
+  void test_hasAncestor_ClassTypeAlias() {
+    _indexTestUnit('''
+class A {}
+class B extends A {}
+class C1 = Object with A;
+class C2 = Object with B;
+''');
+    ClassElement classElementA = findElement('A');
+    ClassElement classElementB = findElement('B');
+    assertThat(classElementA)
+      ..isAncestorOf('C1 = Object with A')
+      ..isAncestorOf('C2 = Object with B');
+    assertThat(classElementB)..isAncestorOf('C2 = Object with B');
+  }
+
   void test_isExtendedBy_ClassDeclaration() {
     _indexTestUnit('''
 class A {} // 1
@@ -146,8 +183,8 @@
 ''');
     ClassElement elementA = findElement('A');
     assertThat(elementA)
-      ..isExtendedAt('A {} // 2', true)
-      ..isReferencedAt('A {} // 2', true);
+      ..isExtendedAt('A {} // 2', false)
+      ..isReferencedAt('A {} // 2', false);
   }
 
   void test_isExtendedBy_ClassDeclaration_isQualified() {
@@ -181,6 +218,23 @@
 ''');
     ClassElement elementA = findElement('A');
     assertThat(elementA)
+      ..isExtendedAt('A with', false)
+      ..isReferencedAt('A with', false);
+  }
+
+  void test_isExtendedBy_ClassTypeAlias_isQualified() {
+    addSource(
+        '/lib.dart',
+        '''
+class A {}
+''');
+    _indexTestUnit('''
+import 'lib.dart' as p;
+class B {}
+class C = p.A with B;
+''');
+    ClassElement elementA = importedUnit().getType('A');
+    assertThat(elementA)
       ..isExtendedAt('A with', true)
       ..isReferencedAt('A with', true);
   }
@@ -192,8 +246,8 @@
 ''');
     ClassElement elementA = findElement('A');
     assertThat(elementA)
-      ..isImplementedAt('A {} // 2', true)
-      ..isReferencedAt('A {} // 2', true);
+      ..isImplementedAt('A {} // 2', false)
+      ..isReferencedAt('A {} // 2', false);
   }
 
   void test_isImplementedBy_ClassDeclaration_isQualified() {
@@ -220,8 +274,8 @@
 ''');
     ClassElement elementB = findElement('B');
     assertThat(elementB)
-      ..isImplementedAt('B; // 3', true)
-      ..isReferencedAt('B; // 3', true);
+      ..isImplementedAt('B; // 3', false)
+      ..isReferencedAt('B; // 3', false);
   }
 
   void test_isInvokedBy_FieldElement() {
@@ -345,8 +399,8 @@
 ''');
     ClassElement elementA = findElement('A');
     assertThat(elementA)
-      ..isMixedInAt('A {} // 2', true)
-      ..isReferencedAt('A {} // 2', true);
+      ..isMixedInAt('A {} // 2', false)
+      ..isReferencedAt('A {} // 2', false);
   }
 
   void test_isMixedInBy_ClassDeclaration_isQualified() {
@@ -369,7 +423,7 @@
 class B = Object with A; // 2
 ''');
     ClassElement elementA = findElement('A');
-    assertThat(elementA).isMixedInAt('A; // 2', true);
+    assertThat(elementA).isMixedInAt('A; // 2', false);
   }
 
   void test_isReferencedBy_ClassElement() {
@@ -540,6 +594,22 @@
     // No additional validation, but it should not fail with stack overflow.
   }
 
+  void test_isReferencedBy_ConstructorElement_namedOnlyWithDot() {
+    _indexTestUnit('''
+class A {
+  A.named() {}
+}
+main() {
+  new A.named();
+}
+''');
+    // has ".named()", but does not have "named()"
+    int offsetWithoutDot = findOffset('named();');
+    int offsetWithDot = findOffset('.named();');
+    expect(unitIndex.usedElementOffsets, isNot(contains(offsetWithoutDot)));
+    expect(unitIndex.usedElementOffsets, contains(offsetWithDot));
+  }
+
   void test_isReferencedBy_ConstructorElement_redirection() {
     _indexTestUnit('''
 class A {
@@ -882,6 +952,11 @@
 
   _ElementIndexAssert(this.test, this.element);
 
+  void isAncestorOf(String search, {int length}) {
+    test._assertHasRelation(element, IndexRelationKind.IS_ANCESTOR_OF,
+        test._expectedLocation(search, false, length: length));
+  }
+
   void isExtendedAt(String search, bool isQualified, {int length}) {
     test._assertHasRelation(element, IndexRelationKind.IS_EXTENDED_BY,
         test._expectedLocation(search, isQualified, length: length));
diff --git a/pkg/analyzer/test/src/summary/resynthesize_test.dart b/pkg/analyzer/test/src/summary/resynthesize_test.dart
index e163d04..d8951a3 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_test.dart
@@ -39,12 +39,6 @@
   Set<Source> otherLibrarySources = new Set<Source>();
   bool constantInitializersAreInvalid = false;
 
-  /**
-   * Determine the analysis options that should be used for this test.
-   */
-  AnalysisOptionsImpl createOptions() =>
-      new AnalysisOptionsImpl()..enableGenericMethods = true;
-
   void addLibrary(String uri) {
     otherLibrarySources.add(analysisContext2.sourceFactory.forUri(uri));
   }
@@ -458,7 +452,12 @@
         ConstructorName rConstructor = r.constructorName;
         expect(oConstructor, isNotNull, reason: desc);
         expect(rConstructor, isNotNull, reason: desc);
-        compareConstructorElements(
+        // Note: just compare rConstructor.staticElement and
+        // oConstructor.staticElement as elements, because we just want to
+        // check that they're pointing to the correct elements; we don't want
+        // to check that their constructor initializers match, because that
+        // could lead to infinite regress.
+        compareElements(
             rConstructor.staticElement, oConstructor.staticElement, desc);
         TypeName oType = oConstructor.type;
         TypeName rType = rConstructor.type;
@@ -517,10 +516,10 @@
       return;
     }
     compareExecutableElements(resynthesized, original, desc);
+    ConstructorElementImpl resynthesizedImpl =
+        getActualElement(resynthesized, desc);
+    ConstructorElementImpl originalImpl = getActualElement(original, desc);
     if (original.isConst) {
-      ConstructorElementImpl resynthesizedImpl =
-          getActualElement(resynthesized, desc);
-      ConstructorElementImpl originalImpl = getActualElement(original, desc);
       compareConstAstLists(resynthesizedImpl.constantInitializers,
           originalImpl.constantInitializers, desc);
     }
@@ -533,6 +532,8 @@
     checkPossibleMember(resynthesized, original, desc);
     expect(resynthesized.nameEnd, original.nameEnd, reason: desc);
     expect(resynthesized.periodOffset, original.periodOffset, reason: desc);
+    expect(resynthesizedImpl.isCycleFree, originalImpl.isCycleFree,
+        reason: desc);
   }
 
   void compareConstValues(
@@ -618,6 +619,8 @@
     expect(resynthesized.location, original.location, reason: desc);
     expect(resynthesized.name, original.name);
     expect(resynthesized.nameOffset, original.nameOffset, reason: desc);
+    expect(rImpl.codeOffset, oImpl.codeOffset, reason: desc);
+    expect(rImpl.codeLength, oImpl.codeLength, reason: desc);
     expect(resynthesized.documentationComment, original.documentationComment,
         reason: desc);
     expect(resynthesized.docRange, original.docRange, reason: desc);
@@ -1031,6 +1034,12 @@
   }
 
   /**
+   * Determine the analysis options that should be used for this test.
+   */
+  AnalysisOptionsImpl createOptions() =>
+      new AnalysisOptionsImpl()..enableGenericMethods = true;
+
+  /**
    * Serialize the given [library] into a summary.  Then create a
    * [_TestSummaryResynthesizer] which can deserialize it, along with any
    * references it makes to `dart:core`.
@@ -2513,6 +2522,32 @@
 ''');
   }
 
+  test_constructor_withCycles_const() {
+    checkLibrary('''
+class C {
+  final x;
+  const C() : x = const D();
+}
+class D {
+  final x;
+  const D() : x = const C();
+}
+''');
+  }
+
+  test_constructor_withCycles_nonConst() {
+    checkLibrary('''
+class C {
+  final x;
+  C() : x = new D();
+}
+class D {
+  final x;
+  D() : x = new C();
+}
+''');
+  }
+
   test_core() {
     if (createOptions().strongMode) {
       // The fake `dart:core` library is always in spec mode, so don't bother
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 9427cd6..23b0a29 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -1076,6 +1076,11 @@
     expect(cls.hasNoSupertype, isFalse);
   }
 
+  test_class_codeRange() {
+    UnlinkedClass cls = serializeClassText(' class C {}');
+    _assertCodeRange(cls.codeRange, 1, 10);
+  }
+
   test_class_concrete() {
     UnlinkedClass cls = serializeClassText('class C {}');
     expect(cls.isAbstract, false);
@@ -3800,6 +3805,49 @@
     expect(executable.returnType, isNull);
   }
 
+  test_constructor_withCycles_const() {
+    serializeLibraryText('''
+class C {
+  final x;
+  const C() : x = const D();
+}
+class D {
+  final x;
+  const D() : x = const C();
+}
+class E {
+  final x;
+  const E() : x = null;
+}
+''');
+    int classCConstCycleSlot = findClass('C').executables[0].constCycleSlot;
+    expect(classCConstCycleSlot, isNot(0));
+    int classDConstCycleSlot = findClass('D').executables[0].constCycleSlot;
+    expect(classDConstCycleSlot, isNot(0));
+    int classEConstCycleSlot = findClass('E').executables[0].constCycleSlot;
+    expect(classEConstCycleSlot, isNot(0));
+    if (!skipFullyLinkedData) {
+      expect(definingUnit.constCycles, contains(classCConstCycleSlot));
+      expect(definingUnit.constCycles, contains(classDConstCycleSlot));
+      expect(definingUnit.constCycles, isNot(contains(classEConstCycleSlot)));
+    }
+  }
+
+  test_constructor_withCycles_nonConst() {
+    serializeLibraryText('''
+class C {
+  final x;
+  C() : x = new D();
+}
+class D {
+  final x;
+  D() : x = new C();
+}
+''');
+    expect(findClass('C').executables[0].constCycleSlot, 0);
+    expect(findClass('D').executables[0].constCycleSlot, 0);
+  }
+
   test_dependencies_export_to_export_unused() {
     addNamedSource('/a.dart', 'export "b.dart";');
     addNamedSource('/b.dart', '');
@@ -3967,6 +4015,7 @@
     expect(e.values, hasLength(1));
     expect(e.values[0].name, 'v1');
     expect(e.values[0].nameOffset, text.indexOf('v1'));
+    _assertCodeRange(e.codeRange, 0, 13);
     expect(unlinkedUnits[0].publicNamespace.names, hasLength(1));
     expect(unlinkedUnits[0].publicNamespace.names[0].kind,
         ReferenceKind.classOrEnum);
@@ -4367,6 +4416,7 @@
     expect(executable.isExternal, isFalse);
     expect(executable.visibleOffset, 0);
     expect(executable.visibleLength, 0);
+    _assertCodeRange(executable.codeRange, 10, 6);
   }
 
   test_executable_member_function_explicit_return() {
@@ -4390,6 +4440,7 @@
     expect(executable.kind, UnlinkedExecutableKind.getter);
     expect(executable.returnType, isNotNull);
     expect(executable.isExternal, isFalse);
+    _assertCodeRange(executable.codeRange, 10, 15);
     expect(findVariable('f', variables: cls.fields), isNull);
     expect(findExecutable('f=', executables: cls.executables), isNull);
   }
@@ -4408,6 +4459,7 @@
     expect(executable.kind, UnlinkedExecutableKind.setter);
     expect(executable.returnType, isNotNull);
     expect(executable.isExternal, isFalse);
+    _assertCodeRange(executable.codeRange, 10, 20);
     expect(findVariable('f', variables: cls.fields), isNull);
     expect(findExecutable('f', executables: cls.executables), isNull);
   }
@@ -4529,6 +4581,12 @@
     expect(executable.name, '<=');
   }
 
+  test_executable_param_codeRange() {
+    UnlinkedExecutable executable = serializeExecutableText('f(int x) {}');
+    UnlinkedParam parameter = executable.parameters[0];
+    _assertCodeRange(parameter.codeRange, 2, 5);
+  }
+
   test_executable_param_function_typed() {
     if (!checkAstDerivedData) {
       // TODO(paulberry): this test fails when building the summary from the
@@ -6751,6 +6809,13 @@
     checkDynamicTypeRef(serializeTypeText('dynamic'));
   }
 
+  test_type_param_codeRange() {
+    UnlinkedClass cls =
+        serializeClassText('class A {} class C<T extends A> {}');
+    UnlinkedTypeParam typeParameter = cls.typeParameters[0];
+    _assertCodeRange(typeParameter.codeRange, 19, 11);
+  }
+
   test_type_param_not_shadowed_by_constructor() {
     UnlinkedClass cls =
         serializeClassText('class C<D> { D x; C.D(); } class D {}');
@@ -7009,6 +7074,11 @@
     checkUnresolvedTypeRef(typeRef, null, 'Foo');
   }
 
+  test_typedef_codeRange() {
+    UnlinkedTypedef type = serializeTypedefText('typedef F();');
+    _assertCodeRange(type.codeRange, 0, 12);
+  }
+
   test_typedef_documented() {
     String text = '''
 // Extra comment so doc comment offset != 0
@@ -7093,6 +7163,12 @@
     expect(type.typeParameters[1].name, 'U');
   }
 
+  test_unit_codeRange() {
+    serializeLibraryText('  int a = 1;  ');
+    UnlinkedUnit unit = unlinkedUnits[0];
+    _assertCodeRange(unit.codeRange, 0, 14);
+  }
+
   test_unresolved_reference_in_multiple_parts() {
     addNamedSource('/a.dart', 'part of foo; int x; Unresolved y;');
     serializeLibraryText('library foo; part "a.dart"; Unresolved z;',
@@ -7134,6 +7210,13 @@
     expect(unlinkedUnits[0].publicNamespace.names[1].numTypeParameters, 0);
   }
 
+  test_variable_codeRange() {
+    serializeLibraryText(' int a = 1, b = 22;');
+    List<UnlinkedVariable> variables = unlinkedUnits[0].variables;
+    _assertCodeRange(variables[0].codeRange, 1, 18);
+    _assertCodeRange(variables[1].codeRange, 1, 18);
+  }
+
   test_variable_const() {
     UnlinkedVariable variable =
         serializeVariableText('const int i = 0;', variableName: 'i');
@@ -7383,6 +7466,12 @@
     }
   }
 
+  void _assertCodeRange(CodeRange codeRange, int offset, int length) {
+    expect(codeRange, isNotNull);
+    expect(codeRange.offset, offset);
+    expect(codeRange.length, length);
+  }
+
   void _assertExecutableVisible(String code, UnlinkedExecutable f,
       String visibleBegin, String visibleEnd) {
     int expectedVisibleOffset = code.indexOf(visibleBegin);
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 4bfe3521..9f75d5d 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -1714,7 +1714,6 @@
     ''');
     });
 
-
     test('inferred generic instantiation', () {
       checkFile('''
 import 'dart:math' as math;
@@ -1836,6 +1835,22 @@
     ''');
     });
 
+    // Regression test for crash when adding genericity
+    test('handle override of non-generic with generic', () {
+      checkFile('''
+class C {
+  m(x) => x;
+}
+class D extends C {
+  /*=T*/ m/*<T>*/(/*=T*/ x) => x;
+}
+main() {
+  int y = /*info:DYNAMIC_CAST*/(new D() as C).m(42);
+  print(y);
+}
+    ''');
+    });
+
     test('correctly recognize generic upper bound', () {
       // Regression test for https://github.com/dart-lang/sdk/issues/25740.
       checkFile(r'''
@@ -1893,7 +1908,6 @@
 }
       ''');
     });
-
   });
 
   // Regression test for https://github.com/dart-lang/dev_compiler/issues/47
@@ -1939,6 +1953,17 @@
     ''');
   });
 
+  test('list literals should not infer bottom', () {
+    var unit = checkFile(r'''
+test1() {
+  var x = [null];
+  x.add(42);
+}
+    ''');
+    var x = unit.element.functions[0].localVariables[0];
+    expect(x.type.toString(), 'List<dynamic>');
+  });
+
   test('map literals', () {
     checkFile(r'''
 test1() {
@@ -1963,6 +1988,17 @@
     ''');
   });
 
+  test('map literals should not infer bottom', () {
+    var unit = checkFile(r'''
+test1() {
+  var x = { null: null };
+  x[3] = 'z';
+}
+
+    ''');
+    var x = unit.element.functions[0].localVariables[0];
+    expect(x.type.toString(), 'Map<dynamic, dynamic>');
+  });
 
   group('block bodied lambdas', () {
     // Original feature request: https://github.com/dart-lang/sdk/issues/25487
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
index 9b960f3..766ca03 100644
--- a/pkg/analyzer/tool/task_dependency_graph/generate.dart
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart
@@ -151,9 +151,9 @@
     resultDescriptorType = modelElement
         .getType('ResultDescriptor')
         .type
-        .substitute4([dynamicType]);
+        .instantiate([dynamicType]);
     listOfResultDescriptorType =
-        context.typeProvider.listType.substitute4([resultDescriptorType]);
+        context.typeProvider.listType.instantiate([resultDescriptorType]);
     CompilationUnitElement enginePluginUnitElement =
         getUnit(enginePluginSource).element;
     enginePluginClass = enginePluginUnitElement.getType('EnginePlugin');
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 85c53ee..dc40c0d 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -271,6 +271,10 @@
     if (options.enableSuperMixins != _previousOptions.enableSuperMixins) {
       return false;
     }
+    if (options.enableConditionalDirectives !=
+        _previousOptions.enableConditionalDirectives) {
+      return false;
+    }
     return true;
   }
 
@@ -579,6 +583,8 @@
     contextOptions.hint = !options.disableHints;
     contextOptions.enableStrictCallChecks = options.enableStrictCallChecks;
     contextOptions.enableSuperMixins = options.enableSuperMixins;
+    contextOptions.enableConditionalDirectives =
+        options.enableConditionalDirectives;
     contextOptions.generateImplicitErrors = options.showPackageWarnings;
     contextOptions.generateSdkErrors = options.showSdkWarnings;
     contextOptions.lint = options.lints;
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 732fc63..ec62ce3 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -45,6 +45,9 @@
   /// Whether to display version information
   final bool displayVersion;
 
+  /// Whether to enable conditional directives (DEP 40).
+  final bool enableConditionalDirectives;
+
   /// Whether to enable null-aware operators (DEP 9).
   final bool enableNullAwareOperators;
 
@@ -86,6 +89,9 @@
   /// Mapping of package names to package summary file paths.
   final Map<String, String> packageSummaryInputs;
 
+  /// Whether to skip analysis when creating summaries.
+  final bool packageSummaryOnly;
+
   /// The path to find the package summary.
   final String packageSummaryOutput;
 
@@ -125,6 +131,7 @@
         analysisOptionsFile = args['options'],
         disableHints = args['no-hints'],
         displayVersion = args['version'],
+        enableConditionalDirectives = args['enable-conditional-directives'],
         enableNullAwareOperators = args['enable-null-aware-operators'],
         enableStrictCallChecks = args['enable-strict-call-checks'],
         enableSuperMixins = args['supermixin'],
@@ -138,6 +145,7 @@
         packageModePath = args['package-mode-path'],
         packageName = args['package-name'],
         packageSummaryInputs = _parsePackageSummaryInputs(args),
+        packageSummaryOnly = args['package-summary-only'],
         packageSummaryOutput = args['package-summary-output'],
         packageConfigPath = args['packages'],
         packageRootPath = args['package-root'],
@@ -313,6 +321,11 @@
           help: 'Specifies the path to the file where the summary information '
               'about the package should be written to.',
           hide: true)
+      ..addFlag('package-summary-only',
+          help: 'Disable analysis (only generate summaries).',
+          defaultsTo: false,
+          negatable: false,
+          hide: true)
       //
       // Hidden flags.
       //
@@ -326,6 +339,11 @@
           defaultsTo: false,
           negatable: false,
           hide: true)
+      ..addFlag('enable-conditional-directives',
+          help: 'Enable support for conditional directives (DEP 40).',
+          defaultsTo: false,
+          negatable: false,
+          hide: true)
       ..addFlag('enable-null-aware-operators',
           help: 'Enable support for null-aware operators (DEP 9).',
           defaultsTo: false,
diff --git a/pkg/analyzer_cli/lib/src/package_analyzer.dart b/pkg/analyzer_cli/lib/src/package_analyzer.dart
index 746c77a..418db25 100644
--- a/pkg/analyzer_cli/lib/src/package_analyzer.dart
+++ b/pkg/analyzer_cli/lib/src/package_analyzer.dart
@@ -45,7 +45,9 @@
    * Perform package analysis according to the given [options].
    */
   ErrorSeverity analyze() {
-    packagePath = options.packageModePath;
+    packagePath = resourceProvider.pathContext.normalize(resourceProvider
+        .pathContext
+        .join(io.Directory.current.absolute.path, options.packageModePath));
     packageLibPath = resourceProvider.pathContext.join(packagePath, 'lib');
     if (packageLibPath == null) {
       errorSink.writeln('--package-mode-path must be set to the root '
@@ -66,7 +68,6 @@
     ChangeSet changeSet = new ChangeSet();
     for (String path in options.sourceFiles) {
       if (AnalysisEngine.isDartFileName(path)) {
-        path = resourceProvider.pathContext.absolute(path);
         File file = resourceProvider.getFile(path);
         if (!file.exists) {
           errorSink.writeln('File not found: $path');
@@ -80,23 +81,26 @@
     }
     context.applyChanges(changeSet);
 
-    // Perform full analysis.
-    while (true) {
-      AnalysisResult analysisResult = context.performAnalysisTask();
-      if (!analysisResult.hasMoreWork) {
-        break;
+    if (!options.packageSummaryOnly) {
+      // Perform full analysis.
+      while (true) {
+        AnalysisResult analysisResult = context.performAnalysisTask();
+        if (!analysisResult.hasMoreWork) {
+          break;
+        }
       }
     }
 
     // Write summary for Dart libraries.
     if (options.packageSummaryOutput != null) {
       PackageBundleAssembler assembler = new PackageBundleAssembler();
-      for (Source source in context.librarySources) {
+      for (Source source in explicitSources) {
+        if (context.computeKindOf(source) != SourceKind.LIBRARY) {
+          continue;
+        }
         if (pathos.isWithin(packageLibPath, source.fullName)) {
-          LibraryElement libraryElement = context.getLibraryElement(source);
-          if (libraryElement != null) {
-            assembler.serializeLibraryElement(libraryElement);
-          }
+          LibraryElement libraryElement = context.computeLibraryElement(source);
+          assembler.serializeLibraryElement(libraryElement);
         }
       }
       // Write the whole package bundle.
@@ -105,9 +109,13 @@
       file.writeAsBytesSync(sdkBundle.toBuffer(), mode: io.FileMode.WRITE_ONLY);
     }
 
-    // Process errors.
-    _printErrors();
-    return _computeMaxSeverity();
+    if (options.packageSummaryOnly) {
+      return ErrorSeverity.NONE;
+    } else {
+      // Process errors.
+      _printErrors();
+      return _computeMaxSeverity();
+    }
   }
 
   ErrorSeverity _computeMaxSeverity() {
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 1c6aa76..39e863a 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -25,6 +25,7 @@
         expect(options.displayVersion, isFalse);
         expect(options.enableStrictCallChecks, isFalse);
         expect(options.enableSuperMixins, isFalse);
+        expect(options.enableConditionalDirectives, isFalse);
         expect(options.enableTypeChecks, isFalse);
         expect(options.hintsAreFatal, isFalse);
         expect(options.ignoreUnrecognizedFlags, isFalse);
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 73bbc60..31ce5a8 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -126,6 +126,7 @@
             useStartupEmitter: hasOption(options, Flags.fastStartup),
             enableConditionalDirectives:
                 hasOption(options, Flags.conditionalDirectives),
+            useNewSourceInfo: hasOption(options, Flags.useNewSourceInfo),
             hasIncrementalSupport:
                 forceIncrementalSupport ||
                 hasOption(options, Flags.incrementalSupport),
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index fdb8ca2..6223f3b 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -44,6 +44,7 @@
       '--experimental-trust-js-interop-type-annotations';
   static const String useContentSecurityPolicy = '--csp';
   static const String useCpsIr = '--use-cps-ir';
+  static const String useNewSourceInfo = '--use-new-source-info';
   static const String verbose = '--verbose';
   static const String version = '--version';
 
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 3df2ba4..79ff968 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -455,6 +455,7 @@
             this.dumpInfo: false,
             bool useStartupEmitter: false,
             bool enableConditionalDirectives: false,
+            bool useNewSourceInfo: false,
             this.useContentSecurityPolicy: false,
             bool hasIncrementalSupport: false,
             this.enableExperimentalMirrors: false,
@@ -502,7 +503,8 @@
       js_backend.JavaScriptBackend jsBackend =
           new js_backend.JavaScriptBackend(
               this, generateSourceMap: generateSourceMap,
-              useStartupEmitter: useStartupEmitter);
+              useStartupEmitter: useStartupEmitter,
+              useNewSourceInfo: useNewSourceInfo);
       backend = jsBackend;
     } else {
       backend = new dart_backend.DartBackend(this, strips,
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index fde5cde..3b0ed7d 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -389,6 +389,7 @@
   DartType getType(CoreTypes types) => types.stringType;
 
   bool operator ==(var other) {
+    if (identical(this, other)) return true;
     if (other is !StringConstantValue) return false;
     StringConstantValue otherString = other;
     return hashCode == otherString.hashCode &&
@@ -461,6 +462,7 @@
   bool get isList => true;
 
   bool operator ==(var other) {
+    if (identical(this, other)) return true;
     if (other is !ListConstantValue) return false;
     ListConstantValue otherList = other;
     if (hashCode != otherList.hashCode) return false;
@@ -525,6 +527,7 @@
   bool get isMap => true;
 
   bool operator ==(var other) {
+    if (identical(this, other)) return true;
     if (other is !MapConstantValue) return false;
     MapConstantValue otherMap = other;
     if (hashCode != otherMap.hashCode) return false;
@@ -661,6 +664,7 @@
   bool get isConstructedObject => true;
 
   bool operator ==(var otherVar) {
+    if (identical(this, otherVar)) return true;
     if (otherVar is !ConstructedConstantValue) return false;
     ConstructedConstantValue other = otherVar;
     if (hashCode != other.hashCode) return false;
diff --git a/pkg/compiler/lib/src/cps_ir/backward_null_check_remover.dart b/pkg/compiler/lib/src/cps_ir/backward_null_check_remover.dart
index de027ec..41bb65e 100644
--- a/pkg/compiler/lib/src/cps_ir/backward_null_check_remover.dart
+++ b/pkg/compiler/lib/src/cps_ir/backward_null_check_remover.dart
@@ -59,7 +59,7 @@
     if (prim is SetField) return prim.object;
     if (prim is SetIndex) return prim.object;
     if (prim is InvokeMethod && !selectorsOnNull.contains(prim.selector)) {
-      return prim.dartReceiver;
+      return prim.receiver;
     }
     if (prim is ForeignCode) {
       return prim.isNullGuardOnNullFirstArgument() ? prim.argument(0) : null;
diff --git a/pkg/compiler/lib/src/cps_ir/bounds_checker.dart b/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
index b357c99..1197012 100644
--- a/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
+++ b/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
@@ -632,9 +632,9 @@
       // was not rewritten to GetLength.  But if we can prove that the call only
       // succeeds for indexables, we can trust that it returns the length.
       TypeMask successType =
-          types.receiverTypeFor(node.selector, node.dartReceiver.type);
+          types.receiverTypeFor(node.selector, node.receiver.type);
       if (types.isDefinitelyIndexable(successType)) {
-        valueOf[node] = getLength(node.dartReceiver, currentEffectNumber);
+        valueOf[node] = getLength(node.receiver, currentEffectNumber);
       }
     }
   }
diff --git a/pkg/compiler/lib/src/cps_ir/cps_fragment.dart b/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
index f30375a..c84e9a9 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
@@ -132,11 +132,13 @@
       Selector selector,
       TypeMask mask,
       List<Primitive> arguments,
-      [CallingConvention callingConvention = CallingConvention.Normal]) {
+      {Primitive interceptor,
+       CallingConvention callingConvention}) {
     InvokeMethod invoke =
         new InvokeMethod(receiver, selector, mask, arguments,
                          sourceInformation: sourceInformation,
-                         callingConvention: callingConvention);
+                         callingConvention: callingConvention,
+                         interceptor: interceptor);
     return letPrim(invoke);
   }
 
@@ -276,11 +278,15 @@
   ///
   /// The [target] function is destroyed and should not be reused.
   Primitive inlineFunction(FunctionDefinition target,
-                           Primitive thisArgument,
+                           Primitive receiver,
                            List<Primitive> arguments,
-                           {Entity hint}) {
-    if (thisArgument != null) {
-      target.thisParameter.replaceUsesWith(thisArgument);
+                           {Entity hint,
+                            Primitive interceptor}) {
+    if (interceptor != null) {
+      target.interceptorParameter.replaceUsesWith(interceptor);
+    }
+    if (receiver != null) {
+      target.receiverParameter.replaceUsesWith(receiver);
     }
     for (int i = 0; i < arguments.length; ++i) {
       target.parameters[i].replaceUsesWith(arguments[i]);
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
index 95fa11a..3bc7032 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
@@ -855,14 +855,16 @@
   /// 1. Call [buildFunctionHeader].
   /// 2. Call `buildXXX` methods to build the body.
   /// 3. Call [makeFunctionDefinition] to finish.
-  ir.FunctionDefinition makeFunctionDefinition() {
+  ir.FunctionDefinition makeFunctionDefinition(
+      SourceInformation sourceInformation) {
     _ensureReturn();
     return new ir.FunctionDefinition(
         state.currentElement,
         state.thisParameter,
         state.functionParameters,
         state.returnContinuation,
-        root);
+        root,
+        sourceInformation: sourceInformation);
   }
 
   /// Create a invocation of the [method] on the super class where the call
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
index cfea55a..6b19607 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
@@ -487,7 +487,8 @@
           sourceInformation:
           sourceInformationBuilder.buildImplicitReturn(constructor));
 
-      return irBuilder.makeFunctionDefinition();
+      return irBuilder.makeFunctionDefinition(
+          sourceInformationBuilder.buildVariableDeclaration());
     });
   }
 
@@ -738,7 +739,8 @@
       irBuilder.buildConstructorBodyHeader(getConstructorBodyParameters(body),
           getClosureScopeForNode(node));
       visit(node.body);
-      return irBuilder.makeFunctionDefinition();
+      return irBuilder.makeFunctionDefinition(
+          sourceInformationBuilder.buildVariableDeclaration());
     });
   }
 
@@ -781,7 +783,8 @@
           value: initialValue,
           sourceInformation:
           sourceInformationBuilder.buildReturn(sendSet.assignmentOperator));
-      return irBuilder.makeFunctionDefinition();
+      return irBuilder.makeFunctionDefinition(
+          sourceInformationBuilder.buildVariableDeclaration());
     });
   }
 
@@ -952,7 +955,8 @@
     } else {
       visit(node.body);
     }
-    return irBuilder.makeFunctionDefinition();
+    return irBuilder.makeFunctionDefinition(
+        sourceInformationBuilder.buildVariableDeclaration());
   }
 
   /// Builds the IR for creating an instance of the closure class corresponding
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart
index 8fb65a2..efdc27f 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart
@@ -134,9 +134,13 @@
 
   @override
   visitFunctionDefinition(FunctionDefinition node) {
-    if (node.thisParameter != null) {
-      handleDeclaration(node.thisParameter);
-      enterScope([node.thisParameter]);
+    if (node.interceptorParameter != null) {
+      handleDeclaration(node.interceptorParameter);
+      enterScope([node.interceptorParameter]);
+    }
+    if (node.receiverParameter != null) {
+      handleDeclaration(node.receiverParameter);
+      enterScope([node.receiverParameter]);
     }
     node.parameters.forEach(handleDeclaration);
     enterScope(node.parameters);
@@ -181,6 +185,19 @@
     }
   }
 
+  @override
+  processInvokeMethod(InvokeMethod node) {
+    if (node.callingConvention == CallingConvention.Intercepted) {
+      if (node.interceptorRef == null) {
+        error('No interceptor on intercepted call', node);
+      }
+    } else {
+      if (node.interceptorRef != null) {
+        error('Interceptor on call with ${node.callingConvention}', node);
+      }
+    }
+  }
+
   void checkReferenceChain(Definition def) {
     Reference previous = null;
     for (Reference ref = def.firstRef; ref != null; ref = ref.next) {
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
index 61a5ddd..9649268 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
@@ -65,14 +65,15 @@
   ///
   /// Avoid using nodes as keys if there is a chance that two keys are the
   /// same node.
-  String debugString([Map annotations]) {
+  String debugString([Map annotations = const {}]) {
     return new SExpressionStringifier()
         .withAnnotations(annotations)
+        .withTypes()
         .visit(this);
   }
 
   /// Prints the result of [debugString].
-  void debugPrint([Map annotations]) {
+  void debugPrint([Map annotations = const {}]) {
     print(debugString(annotations));
   }
 }
@@ -416,18 +417,27 @@
 /// continuation to invoke when returning from the function.
 class FunctionDefinition extends InteriorNode {
   final ExecutableElement element;
-  final Parameter thisParameter;
+  Parameter interceptorParameter;
+  final Parameter receiverParameter;
   final List<Parameter> parameters;
   final Continuation returnContinuation;
+  final SourceInformation sourceInformation;
   Expression body;
 
-  FunctionDefinition(this.element, this.thisParameter, this.parameters,
-      this.returnContinuation, this.body);
+  FunctionDefinition(
+      this.element,
+      this.receiverParameter,
+      this.parameters,
+      this.returnContinuation,
+      this.body,
+      {this.interceptorParameter,
+       this.sourceInformation});
 
   accept(BlockVisitor visitor) => visitor.visitFunctionDefinition(this);
 
   void setParentPointers() {
-    if (thisParameter != null) thisParameter.parent = this;
+    if (interceptorParameter != null) interceptorParameter.parent = this;
+    if (receiverParameter != null) receiverParameter.parent = this;
     _setParentsOnNodes(parameters, this);
     returnContinuation.parent = this;
     if (body != null) body.parent = this;
@@ -491,6 +501,9 @@
 ///
 /// This class defines the common interface of function invocations.
 abstract class InvocationPrimitive extends UnsafePrimitive {
+  Reference<Primitive> get interceptorRef => null;
+  Primitive get interceptor => interceptorRef?.definition;
+
   Reference<Primitive> get receiverRef => null;
   Primitive get receiver => receiverRef?.definition;
 
@@ -498,30 +511,8 @@
   Primitive argument(int n) => argumentRefs[n].definition;
   Iterable<Primitive> get arguments => _dereferenceList(argumentRefs);
 
-  Reference<Primitive> get dartReceiverRef => null;
-  Primitive get dartReceiver => dartReceiverRef?.definition;
-
   CallingConvention get callingConvention => CallingConvention.Normal;
 
-  Reference<Primitive> dartArgumentReference(int n) {
-    switch (callingConvention) {
-      case CallingConvention.Normal:
-      case CallingConvention.OneShotIntercepted:
-        return argumentRefs[n];
-
-      case CallingConvention.Intercepted:
-      case CallingConvention.DummyIntercepted:
-        return argumentRefs[n + 1];
-    }
-  }
-
-  Primitive dartArgument(int n) => dartArgumentReference(n).definition;
-
-  int get dartArgumentsLength =>
-      argumentRefs.length -
-      (callingConvention == CallingConvention.Intercepted ||
-          callingConvention == CallingConvention.DummyIntercepted ? 1 : 0);
-
   SourceInformation get sourceInformation;
 }
 
@@ -565,35 +556,56 @@
 /// The [selector] records the names of named arguments. The value of named
 /// arguments occur at the end of the [arguments] list, in normalized order.
 class InvokeMethod extends InvocationPrimitive {
+  Reference<Primitive> interceptorRef;
   Reference<Primitive> receiverRef;
   Selector selector;
   TypeMask mask;
   final List<Reference<Primitive>> argumentRefs;
   final SourceInformation sourceInformation;
+  CallingConvention _callingConvention;
 
-  CallingConvention callingConvention = CallingConvention.Normal;
-
-  Reference<Primitive> get dartReceiverRef {
-    return callingConvention == CallingConvention.Intercepted
-        ? argumentRefs[0]
-        : receiverRef;
-  }
+  CallingConvention get callingConvention => _callingConvention;
 
   InvokeMethod(
       Primitive receiver, this.selector, this.mask, List<Primitive> arguments,
       {this.sourceInformation,
-      this.callingConvention: CallingConvention.Normal})
+       CallingConvention callingConvention,
+       Primitive interceptor})
       : this.receiverRef = new Reference<Primitive>(receiver),
-        this.argumentRefs = _referenceList(arguments);
+        this.argumentRefs = _referenceList(arguments),
+        this.interceptorRef = _optionalReference(interceptor),
+        this._callingConvention = callingConvention ??
+            (interceptor != null
+                ? CallingConvention.Intercepted
+                : CallingConvention.Normal);
 
   accept(Visitor visitor) => visitor.visitInvokeMethod(this);
 
   bool get hasValue => true;
 
   void setParentPointers() {
+    interceptorRef?.parent = this;
     receiverRef.parent = this;
     _setParentsOnList(argumentRefs, this);
   }
+
+  void makeIntercepted(Primitive interceptor) {
+    interceptorRef?.unlink();
+    interceptorRef = new Reference<Primitive>(interceptor)..parent = this;
+    _callingConvention = CallingConvention.Intercepted;
+  }
+
+  void makeOneShotIntercepted() {
+    interceptorRef?.unlink();
+    interceptorRef = null;
+    _callingConvention = CallingConvention.OneShotIntercepted;
+  }
+
+  void makeDummyIntercepted() {
+    interceptorRef?.unlink();
+    interceptorRef = null;
+    _callingConvention = CallingConvention.DummyIntercepted;
+  }
 }
 
 /// Invoke [target] on [receiver], bypassing dispatch and override semantics.
@@ -616,37 +628,37 @@
 /// All optional arguments declared by [target] are passed in explicitly, and
 /// occur at the end of [arguments] list, in normalized order.
 class InvokeMethodDirectly extends InvocationPrimitive {
+  Reference<Primitive> interceptorRef;
   Reference<Primitive> receiverRef;
   final FunctionElement target;
   final Selector selector;
   final List<Reference<Primitive>> argumentRefs;
   final SourceInformation sourceInformation;
 
-  CallingConvention callingConvention;
-
-  Reference<Primitive> get dartReceiverRef {
-    return callingConvention == CallingConvention.Intercepted
-        ? argumentRefs[0]
-        : receiverRef;
-  }
-
   InvokeMethodDirectly(Primitive receiver, this.target, this.selector,
       List<Primitive> arguments, this.sourceInformation,
-      {this.callingConvention: CallingConvention.Normal})
+      {Primitive interceptor})
       : this.receiverRef = new Reference<Primitive>(receiver),
-        this.argumentRefs = _referenceList(arguments);
+        this.argumentRefs = _referenceList(arguments),
+        this.interceptorRef = _optionalReference(interceptor);
 
   accept(Visitor visitor) => visitor.visitInvokeMethodDirectly(this);
 
   bool get hasValue => true;
 
   void setParentPointers() {
+    interceptorRef?.parent = this;
     receiverRef.parent = this;
     _setParentsOnList(argumentRefs, this);
   }
 
   bool get isConstructorBodyCall => target is ConstructorBodyElement;
   bool get isTearOff => selector.isGetter && !target.isGetter;
+
+  void makeIntercepted(Primitive interceptor) {
+    interceptorRef?.unlink();
+    interceptorRef = new Reference<Primitive>(interceptor)..parent = this;
+  }
 }
 
 /// Non-const call to a constructor.
@@ -2273,7 +2285,8 @@
   processFunctionDefinition(FunctionDefinition node) {}
   visitFunctionDefinition(FunctionDefinition node) {
     processFunctionDefinition(node);
-    if (node.thisParameter != null) visit(node.thisParameter);
+    if (node.interceptorParameter != null) visit(node.interceptorParameter);
+    if (node.receiverParameter != null) visit(node.receiverParameter);
     node.parameters.forEach(visit);
     visit(node.body);
   }
@@ -2331,6 +2344,9 @@
   processInvokeMethod(InvokeMethod node) {}
   visitInvokeMethod(InvokeMethod node) {
     processInvokeMethod(node);
+    if (node.interceptorRef != null) {
+      processReference(node.interceptorRef);
+    }
     processReference(node.receiverRef);
     node.argumentRefs.forEach(processReference);
   }
@@ -2338,6 +2354,9 @@
   processInvokeMethodDirectly(InvokeMethodDirectly node) {}
   visitInvokeMethodDirectly(InvokeMethodDirectly node) {
     processInvokeMethodDirectly(node);
+    if (node.interceptorRef != null) {
+      processReference(node.interceptorRef);
+    }
     processReference(node.receiverRef);
     node.argumentRefs.forEach(processReference);
   }
@@ -2626,7 +2645,8 @@
 
   visitFunctionDefinition(FunctionDefinition node) {
     processFunctionDefinition(node);
-    if (node.thisParameter != null) visit(node.thisParameter);
+    if (node.interceptorParameter != null) visit(node.interceptorParameter);
+    if (node.receiverParameter != null) visit(node.receiverParameter);
     node.parameters.forEach(visit);
     visit(node.body);
   }
@@ -2775,13 +2795,14 @@
     return new InvokeMethod(getCopy(node.receiverRef), node.selector, node.mask,
         getList(node.argumentRefs),
         sourceInformation: node.sourceInformation,
-        callingConvention: node.callingConvention);
+        callingConvention: node.callingConvention,
+        interceptor: getCopyOrNull(node.interceptorRef));
   }
 
   Definition visitInvokeMethodDirectly(InvokeMethodDirectly node) {
     return new InvokeMethodDirectly(getCopy(node.receiverRef), node.target,
         node.selector, getList(node.argumentRefs), node.sourceInformation,
-        callingConvention: node.callingConvention);
+        interceptor: getCopyOrNull(node.interceptorRef));
   }
 
   Definition visitInvokeConstructor(InvokeConstructor node) {
@@ -3007,9 +3028,12 @@
     _first = _current = null;
     // Definitions are copied where they are bound, before processing
     // expressions in the scope of their binding.
-    Parameter thisParameter = node.thisParameter == null
+    Parameter thisParameter = node.receiverParameter == null
         ? null
-        : _definitions.copy(node.thisParameter);
+        : _definitions.copy(node.receiverParameter);
+    Parameter interceptorParameter = node.interceptorParameter == null
+        ? null
+        : _definitions.copy(node.interceptorParameter);
     List<Parameter> parameters =
         node.parameters.map(_definitions.copy).toList();
     // Though the return continuation's parameter does not have any uses,
@@ -3022,7 +3046,9 @@
 
     visit(node.body);
     FunctionDefinition copy = new FunctionDefinition(
-        node.element, thisParameter, parameters, returnContinuation, _first);
+        node.element, thisParameter, parameters, returnContinuation, _first,
+        interceptorParameter: interceptorParameter,
+        sourceInformation: node.sourceInformation);
     _first = _current = null;
     return copy;
   }
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
index 4c39e16..5dad783 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
@@ -98,18 +98,21 @@
     return decorator(node, s);
   }
 
-  String formatThisParameter(Parameter thisParameter) {
-    return thisParameter == null ? '()' : '(${visit(thisParameter)})';
+  String formatOptionalParameter(Parameter parameter) {
+    return parameter == null ? '()' : '(${visit(parameter)})';
   }
 
   String visitFunctionDefinition(FunctionDefinition node) {
     String name = node.element.name;
-    String thisParameter = formatThisParameter(node.thisParameter);
+    String interceptorParameter =
+        formatOptionalParameter(node.interceptorParameter);
+    String thisParameter = formatOptionalParameter(node.receiverParameter);
     String parameters = node.parameters.map(visit).join(' ');
     namer.setReturnContinuation(node.returnContinuation);
     String body = indentBlock(() => visit(node.body));
     return '$indentation'
-        '(FunctionDefinition $name $thisParameter ($parameters) return\n'
+        '(FunctionDefinition $name $interceptorParameter $thisParameter '
+        '($parameters) return\n'
         '$body)';
   }
 
@@ -179,10 +182,6 @@
       List<Reference<Primitive>> arguments,
       [CallingConvention callingConvention = CallingConvention.Normal]) {
     int positionalArgumentCount = call.positionalArgumentCount;
-    if (callingConvention == CallingConvention.Intercepted ||
-        callingConvention == CallingConvention.DummyIntercepted) {
-      ++positionalArgumentCount;
-    }
     List<String> args =
         arguments.take(positionalArgumentCount).map(access).toList();
     List<String> argumentNames = call.getOrderedNamedArguments();
@@ -206,18 +205,20 @@
 
   String visitInvokeMethod(InvokeMethod node) {
     String name = node.selector.name;
-    String rcv = access(node.receiverRef);
-    String args = formatArguments(node.selector.callStructure, node.argumentRefs,
-        node.callingConvention);
-    return '(InvokeMethod $rcv $name $args)';
+    String interceptor = optionalAccess(node.interceptorRef);
+    String receiver = access(node.receiverRef);
+    String arguments = formatArguments(node.selector.callStructure,
+        node.argumentRefs, node.callingConvention);
+    return '(InvokeMethod $interceptor $receiver $name $arguments)';
   }
 
   String visitInvokeMethodDirectly(InvokeMethodDirectly node) {
+    String interceptor = optionalAccess(node.interceptorRef);
     String receiver = access(node.receiverRef);
     String name = node.selector.name;
-    String args = formatArguments(node.selector.callStructure, node.argumentRefs,
-        node.callingConvention);
-    return '(InvokeMethodDirectly $receiver $name $args)';
+    String arguments = formatArguments(node.selector.callStructure,
+        node.argumentRefs, node.callingConvention);
+    return '(InvokeMethodDirectly $interceptor $receiver $name $arguments)';
   }
 
   String visitInvokeConstructor(InvokeConstructor node) {
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
index 1c7779b..8a53864 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
@@ -84,11 +84,14 @@
           return '${names.name(param)} ${param.type}';
         }
         if (entryPoint != null) {
-          String thisParam = entryPoint.thisParameter != null
-              ? formatParameter(entryPoint.thisParameter)
+          String thisParam = entryPoint.receiverParameter != null
+              ? formatParameter(entryPoint.receiverParameter)
               : 'no receiver';
+          String interceptorParam = entryPoint.interceptorParameter != null
+              ? formatParameter(entryPoint.interceptorParameter)
+              : 'no interceptor';
           String params = entryPoint.parameters.map(formatParameter).join(', ');
-          printStmt('x0', 'Entry ($thisParam) ($params)');
+          printStmt('x0', 'Entry ($interceptorParam) ($thisParam) ($params)');
         }
         String params = block.parameters.map(formatParameter).join(', ');
         printStmt('x0', 'Parameters ($params)');
diff --git a/pkg/compiler/lib/src/cps_ir/inline.dart b/pkg/compiler/lib/src/cps_ir/inline.dart
index 6c9f30c..076e809 100644
--- a/pkg/compiler/lib/src/cps_ir/inline.dart
+++ b/pkg/compiler/lib/src/cps_ir/inline.dart
@@ -185,6 +185,11 @@
   Inliner(this.functionCompiler);
 
   bool isCalledOnce(Element element) {
+    if (element is ConstructorBodyElement) {
+      ClassElement class_ = element.enclosingClass;
+      return !functionCompiler.compiler.world.hasAnyStrictSubclass(class_) &&
+          class_.constructors.tail?.isEmpty ?? false;
+    }
     return functionCompiler.compiler.typesTask.typesInferrer.isCalledOnce(
         element);
   }
@@ -222,14 +227,12 @@
 class SizeVisitor extends TrampolineRecursiveVisitor {
   int size = 0;
 
-  void countArgument(Reference<Primitive> argument, Parameter parameter) {
+  void countArgument(Primitive argument, Parameter parameter) {
     // If a parameter is unused and the corresponding argument has only the
     // one use at the invocation, then inlining the call might enable
     // elimination of the argument.  This 'pays for itself' by decreasing the
     // cost of inlining at the call site.
-    if (argument != null &&
-        argument.definition.hasExactlyOneUse &&
-        parameter.hasNoUses) {
+    if (argument != null && argument.hasExactlyOneUse && parameter.hasNoUses) {
       --size;
     }
   }
@@ -237,9 +240,15 @@
   static int sizeOf(InvocationPrimitive invoke, FunctionDefinition function) {
     SizeVisitor visitor = new SizeVisitor();
     visitor.visit(function);
-    visitor.countArgument(invoke.receiverRef, function.thisParameter);
+    if (invoke.callingConvention == CallingConvention.Intercepted) {
+      // Note that if the invocation is a dummy-intercepted call, then the
+      // target has an unused interceptor parameter, but the caller provides
+      // no interceptor argument.
+      visitor.countArgument(invoke.interceptor, function.interceptorParameter);
+    }
+    visitor.countArgument(invoke.receiver, function.receiverParameter);
     for (int i = 0; i < invoke.argumentRefs.length; ++i) {
-      visitor.countArgument(invoke.argumentRefs[i], function.parameters[i]);
+      visitor.countArgument(invoke.argument(i), function.parameters[i]);
     }
     return visitor.size;
   }
@@ -285,7 +294,6 @@
   }
 }
 
-
 class InliningVisitor extends TrampolineRecursiveVisitor {
   final Inliner _inliner;
 
@@ -328,8 +336,8 @@
     return next;
   }
 
-  TypeMask abstractType(Reference<Primitive> ref) {
-    return ref.definition.type ?? typeSystem.dynamicType;
+  TypeMask abstractType(Primitive def) {
+    return def.type ?? typeSystem.dynamicType;
   }
 
   /// Build the IR term for the function that adapts a call site targeting a
@@ -337,6 +345,9 @@
   FunctionDefinition buildAdapter(InvokeMethod node, FunctionElement target) {
     Parameter thisParameter = new Parameter(new ThisParameterLocal(target))
         ..type = node.receiver.type;
+    Parameter interceptorParameter = node.interceptorRef != null
+        ? new Parameter(null)
+        : null;
     List<Parameter> parameters = new List<Parameter>.generate(
         node.argumentRefs.length,
         (int index) {
@@ -349,10 +360,6 @@
 
     FunctionSignature signature = target.functionSignature;
     int requiredParameterCount = signature.requiredParameterCount;
-    if (node.callingConvention == CallingConvention.Intercepted ||
-        node.callingConvention == CallingConvention.DummyIntercepted) {
-      ++requiredParameterCount;
-    }
     List<Primitive> arguments = new List<Primitive>.generate(
         requiredParameterCount,
         (int index) => parameters[index]);
@@ -396,14 +403,19 @@
     Selector newSelector =
         new Selector(node.selector.kind, node.selector.memberName,
             newCallStructure);
-    Primitive result = cps.invokeMethod(thisParameter, newSelector, node.mask,
-        arguments, node.callingConvention);
+    Primitive result = cps.invokeMethod(thisParameter,
+        newSelector,
+        node.mask,
+        arguments,
+        interceptor: interceptorParameter,
+        callingConvention: node.callingConvention);
     result.type = typeSystem.getInvokeReturnType(node.selector, node.mask);
     returnContinuation.parameters.single.type = result.type;
     cps.invokeContinuation(returnContinuation, <Primitive>[result]);
     return new FunctionDefinition(target, thisParameter, parameters,
         returnContinuation,
-        cps.root);
+        cps.root,
+        interceptorParameter: interceptorParameter);
   }
 
   // Given an invocation and a known target, possibly perform inlining.
@@ -431,7 +443,7 @@
 
     // Don't inline methods that never return. They are usually helper functions
     // that throw an exception.
-    if (invoke.type.isEmpty && !invoke.type.isNullable) {
+    if (invoke.type.isEmpty) {
       // TODO(sra): It would be ok to inline if doing so was shrinking.
       return null;
     }
@@ -444,18 +456,18 @@
       return null;
     }
 
-    Reference<Primitive> dartReceiver = invoke.dartReceiverRef;
+    Primitive receiver = invoke.receiver;
     TypeMask abstractReceiver =
-        dartReceiver == null ? null : abstractType(dartReceiver);
+        receiver == null ? null : abstractType(receiver);
     // The receiver is non-null in a method body, unless the receiver is known
     // to be `null` (isEmpty covers `null` and unreachable).
     TypeMask abstractReceiverInMethod = abstractReceiver == null
         ? null
-        : abstractReceiver.isEmpty
+        : abstractReceiver.isEmptyOrNull
             ? abstractReceiver
             : abstractReceiver.nonNullable();
     List<TypeMask> abstractArguments =
-        invoke.argumentRefs.map(abstractType).toList();
+        invoke.arguments.map(abstractType).toList();
     var cachedResult = _inliner.cache.get(target, callStructure,
         abstractReceiverInMethod,
         abstractArguments);
@@ -469,17 +481,12 @@
       List<Primitive> arguments = invoke.arguments.toList();
       // Add a null check to the inlined function body if necessary.  The
       // cached function body does not contain the null check.
-      if (dartReceiver != null && abstractReceiver.isNullable) {
-        Primitive check = nullReceiverGuard(
-            invoke, _fragment, dartReceiver.definition, abstractReceiver);
-        if (invoke.callingConvention == CallingConvention.Intercepted) {
-          arguments[0] = check;
-        } else {
-          receiver = check;
-        }
+      if (receiver != null && abstractReceiver.isNullable) {
+        receiver = nullReceiverGuard(
+            invoke, _fragment, receiver, abstractReceiver);
       }
       return _fragment.inlineFunction(function, receiver, arguments,
-          hint: invoke.hint);
+            interceptor: invoke.interceptor, hint: invoke.hint);
     }
 
     // Positive inlining result in the cache.
@@ -513,22 +520,11 @@
       }
     } else {
       function = compileToCpsIr(target);
-      void setValue(Variable variable, Reference<Primitive> value) {
-        variable.type = value.definition.type;
+      if (function.receiverParameter != null) {
+        function.receiverParameter.type = abstractReceiverInMethod;
       }
-      if (invoke.callingConvention == CallingConvention.Intercepted) {
-        setValue(function.thisParameter, invoke.receiverRef);
-        function.parameters[0].type = abstractReceiverInMethod;
-        for (int i = 1; i < invoke.argumentRefs.length; ++i) {
-          setValue(function.parameters[i], invoke.argumentRefs[i]);
-        }
-      } else {
-        if (invoke.receiverRef != null) {
-          function.thisParameter.type = abstractReceiverInMethod;
-        }
-        for (int i = 0; i < invoke.argumentRefs.length; ++i) {
-          setValue(function.parameters[i], invoke.argumentRefs[i]);
-        }
+      for (int i = 0; i < invoke.argumentRefs.length; ++i) {
+        function.parameters[i].type = invoke.argument(i).type;
       }
       optimizeBeforeInlining(function);
     }
@@ -582,7 +578,7 @@
 
   @override
   Primitive visitInvokeMethod(InvokeMethod node) {
-    Primitive receiver = node.dartReceiver;
+    Primitive receiver = node.receiver;
     Element element = world.locateSingleElement(node.selector, receiver.type);
     if (element == null || element is! FunctionElement) return null;
     if (node.selector.isGetter != element.isGetter) return null;
diff --git a/pkg/compiler/lib/src/cps_ir/insert_refinements.dart b/pkg/compiler/lib/src/cps_ir/insert_refinements.dart
index ef291b1..d5412c6 100644
--- a/pkg/compiler/lib/src/cps_ir/insert_refinements.dart
+++ b/pkg/compiler/lib/src/cps_ir/insert_refinements.dart
@@ -73,10 +73,6 @@
     let.insertAbove(use);
   }
 
-  Primitive unfoldInterceptor(Primitive prim) {
-    return prim is Interceptor ? prim.input : prim;
-  }
-
   /// Sets [refined] to be the current refinement for its value, and pushes an
   /// action that will restore the original scope again.
   ///
@@ -115,7 +111,7 @@
 
     // Note: node.dartArgumentsLength is shorter when the call doesn't include
     // some optional arguments.
-    int length = min(argumentSuccessTypes.length, node.dartArgumentsLength);
+    int length = min(argumentSuccessTypes.length, node.argumentRefs.length);
     for (int i = 0; i < length; i++) {
       TypeMask argSuccessType = argumentSuccessTypes[i];
 
@@ -123,7 +119,7 @@
       if (argSuccessType == types.dynamicType) continue;
 
       applyRefinement(node.parent,
-          new Refinement(node.dartArgument(i), argSuccessType));
+          new Refinement(node.argument(i), argSuccessType));
     }
   }
 
@@ -140,7 +136,7 @@
 
     // If the call is intercepted, we want to refine the actual receiver,
     // not the interceptor.
-    Primitive receiver = unfoldInterceptor(node.receiver);
+    Primitive receiver = node.receiver;
 
     // Do not try to refine the receiver of closure calls; the class world
     // does not know about closure classes.
@@ -237,8 +233,8 @@
     }
 
     if (condition is InvokeMethod && condition.selector == Selectors.equals) {
-      refineEquality(condition.dartReceiver,
-                     condition.dartArgument(0),
+      refineEquality(condition.receiver,
+                     condition.argument(0),
                      trueCont,
                      falseCont);
       return;
diff --git a/pkg/compiler/lib/src/cps_ir/optimize_interceptors.dart b/pkg/compiler/lib/src/cps_ir/optimize_interceptors.dart
index d9c59b6..9dd05c7b 100644
--- a/pkg/compiler/lib/src/cps_ir/optimize_interceptors.dart
+++ b/pkg/compiler/lib/src/cps_ir/optimize_interceptors.dart
@@ -104,7 +104,7 @@
     for (Reference ref = interceptor.firstRef; ref != null; ref = ref.next) {
       Node use = ref.parent;
       if (use is InvokeMethod) {
-        TypeMask type = use.dartReceiver.type;
+        TypeMask type = use.receiver.type;
         bool canOccurAsReceiver(ClassElement elem) {
           return classWorld.isInstantiated(elem) &&
               !typeSystem.areDisjoint(type,
@@ -137,7 +137,7 @@
     for (Reference ref = node.firstRef; ref != null; ref = ref.next) {
       if (ref.parent is InvokeMethod) {
         InvokeMethod invoke = ref.parent;
-        if (invoke.receiverRef != ref) return false;
+        if (invoke.interceptorRef != ref) return false;
         var interceptedClasses =
             backend.getInterceptedClassesOn(invoke.selector.name);
         if (interceptedClasses.contains(helpers.jsDoubleClass)) return false;
@@ -157,7 +157,7 @@
       Node use = ref.parent;
       if (use is InvokeMethod) {
         if (selectorsOnNull.contains(use.selector) &&
-            use.dartReceiver.type.isNullable) {
+            use.receiver.type.isNullable) {
           return true;
         }
       } else {
@@ -261,7 +261,7 @@
   @override
   void visitInvokeMethod(InvokeMethod node) {
     if (node.callingConvention != CallingConvention.Intercepted) return;
-    Primitive interceptor = node.receiver;
+    Primitive interceptor = node.interceptor;
     if (interceptor is! Interceptor ||
         interceptor.hasMultipleUses ||
         loopHeaderFor[interceptor] != currentLoopHeader) {
@@ -269,8 +269,7 @@
     }
     // TODO(asgerf): Consider heuristics for when to use one-shot interceptors.
     //   E.g. using only one-shot interceptors with a fast path.
-    node.callingConvention = CallingConvention.OneShotIntercepted;
-    node..receiverRef.unlink()..receiverRef = node.argumentRefs.removeAt(0);
+    node.makeOneShotIntercepted();
   }
 
   @override
diff --git a/pkg/compiler/lib/src/cps_ir/path_based_optimizer.dart b/pkg/compiler/lib/src/cps_ir/path_based_optimizer.dart
index aed13e6..e7c747f 100644
--- a/pkg/compiler/lib/src/cps_ir/path_based_optimizer.dart
+++ b/pkg/compiler/lib/src/cps_ir/path_based_optimizer.dart
@@ -157,27 +157,23 @@
   }
 
   void visitInvokeMethod(InvokeMethod node) {
-    int receiverValue = valueOf[node.dartReceiver] ?? ANY;
+    int receiverValue = valueOf[node.receiver] ?? ANY;
     if (!backend.isInterceptedSelector(node.selector)) {
       // Only self-interceptors can respond to a non-intercepted selector.
-      valueOf[node.dartReceiver] = receiverValue & SELF_INTERCEPTOR;
+      valueOf[node.receiver] = receiverValue & SELF_INTERCEPTOR;
     } else if (receiverValue & ~SELF_INTERCEPTOR == 0 &&
                node.callingConvention == CallingConvention.Intercepted) {
       // This is an intercepted call whose receiver is definitely a
       // self-interceptor.
       // TODO(25646): If TypeMasks could represent "any self-interceptor" this
       //   optimization should be subsumed by type propagation.
-      node.receiverRef.changeTo(node.dartReceiver);
+      node.interceptorRef.changeTo(node.receiver);
 
       // Replace the extra receiver argument with a dummy value if the
       // target definitely does not use it.
-      if (typeSystem.targetIgnoresReceiverArgument(node.dartReceiver.type,
+      if (typeSystem.targetIgnoresReceiverArgument(node.receiver.type,
             node.selector)) {
-        Constant dummy = new Constant(new IntConstantValue(0))
-            ..type = typeSystem.intType;
-        new LetPrim(dummy).insertAbove(node.parent);
-        node.argumentRefs[0].changeTo(dummy);
-        node.callingConvention = CallingConvention.DummyIntercepted;
+        node.makeDummyIntercepted();
       }
     }
   }
diff --git a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
index 2042320..b7a070e 100644
--- a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
@@ -281,7 +281,7 @@
       TypeMask computed = computeTypeMask(inferrer.compiler, constant);
       TypeMask inferred = inferrer.getGuaranteedTypeOfElement(element);
       TypeMask best = intersection(inferred, computed);
-      assert(!best.isEmpty);
+      assert(!best.isEmptyOrNull);
       _constantMasks[constant] = best;
     }
   }
diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
index 6b09771..f665897 100644
--- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
@@ -968,7 +968,7 @@
     }
     // If a primitive has a value, but can't return anything, it must throw
     // or diverge.
-    return prim.hasValue && prim.type.isEmpty && !prim.type.isNullable;
+    return prim.hasValue && prim.type.isEmpty;
   }
 
   void visitContinuation(Continuation node) {
@@ -1160,7 +1160,7 @@
   /// Returns `true` if the node was replaced.
   specializeOperatorCall(InvokeMethod node) {
     if (!backend.isInterceptedSelector(node.selector)) return null;
-    if (node.dartArgumentsLength > 1) return null;
+    if (node.argumentRefs.length > 1) return null;
     if (node.callingConvention == CallingConvention.OneShotIntercepted) {
       return null;
     }
@@ -1178,11 +1178,11 @@
 
       // Determine which guards are needed.
       ChecksNeeded receiverChecks =
-          receiverGuard.getChecksNeeded(node.dartReceiver, classWorld);
+          receiverGuard.getChecksNeeded(node.receiver, classWorld);
       bool needReceiverGuard = receiverChecks != ChecksNeeded.None;
       bool needArgumentGuard =
           argumentGuard != null &&
-          argumentGuard.needsCheck(node.dartArgument(0), classWorld);
+          argumentGuard.needsCheck(node.argument(0), classWorld);
 
       if (!needReceiverGuard && !needArgumentGuard) return cps;
 
@@ -1193,9 +1193,9 @@
       //   if (typeof receiver !== "number") return receiver.$lt();
       //
       if (!needArgumentGuard) {
-        Primitive condition = receiverGuard.makeCheck(cps, node.dartReceiver);
+        Primitive condition = receiverGuard.makeCheck(cps, node.receiver);
         cps.letPrim(new ReceiverCheck(
-            node.dartReceiver,
+            node.receiver,
             node.selector,
             node.sourceInformation,
             condition: condition,
@@ -1214,9 +1214,9 @@
       //   if (typeof argument !== "number") return H.iae(argument);
       //
       if (!needReceiverGuard) {
-        cps.ifTruthy(argumentGuard.makeCheck(cps, node.dartArgument(0)))
+        cps.ifTruthy(argumentGuard.makeCheck(cps, node.argument(0)))
            .invokeStaticThrower(helpers.throwIllegalArgumentException,
-              [node.dartArgument(0)]);
+              [node.argument(0)]);
         return cps;
       }
 
@@ -1228,14 +1228,15 @@
       //       return J.$lt(receiver, argument);
       //
       Continuation fail = cps.letCont();
-      cps.ifTruthy(receiverGuard.makeCheck(cps, node.dartReceiver))
+      cps.ifTruthy(receiverGuard.makeCheck(cps, node.receiver))
          .invokeContinuation(fail);
-      cps.ifTruthy(argumentGuard.makeCheck(cps, node.dartArgument(0)))
+      cps.ifTruthy(argumentGuard.makeCheck(cps, node.argument(0)))
          .invokeContinuation(fail);
 
       cps.insideContinuation(fail)
-         ..invokeMethod(node.dartReceiver, node.selector, node.mask,
-             [node.dartArgument(0)], CallingConvention.OneShotIntercepted)
+         ..invokeMethod(node.receiver, node.selector, node.mask,
+             [node.argument(0)],
+             callingConvention: CallingConvention.OneShotIntercepted)
          ..put(new Unreachable());
 
       return cps;
@@ -1249,9 +1250,9 @@
     CpsFragment makeBinary(BuiltinOperator operator,
                            {TypeCheckOperator guard: TypeCheckOperator.none}) {
       CpsFragment cps = makeGuard(guard, guard);
-      Primitive left = guard.makeRefinement(cps, node.dartReceiver, classWorld);
+      Primitive left = guard.makeRefinement(cps, node.receiver, classWorld);
       Primitive right =
-          guard.makeRefinement(cps, node.dartArgument(0), classWorld);
+          guard.makeRefinement(cps, node.argument(0), classWorld);
       Primitive result = cps.applyBuiltin(operator, [left, right]);
       result.hint = node.hint;
       node.replaceUsesWith(result);
@@ -1264,7 +1265,7 @@
                           {TypeCheckOperator guard: TypeCheckOperator.none}) {
       CpsFragment cps = makeGuard(guard);
       Primitive argument =
-          guard.makeRefinement(cps, node.dartReceiver, classWorld);
+          guard.makeRefinement(cps, node.receiver, classWorld);
       Primitive result = cps.applyBuiltin(operator, [argument]);
       result.hint = node.hint;
       node.replaceUsesWith(result);
@@ -1284,15 +1285,16 @@
           node.mask,
           node.arguments.toList(),
           sourceInformation: node.sourceInformation,
-          callingConvention: node.callingConvention);
+          callingConvention: node.callingConvention,
+          interceptor: node.interceptor);
     }
 
     TypeMask successType =
-        typeSystem.receiverTypeFor(node.selector, node.dartReceiver.type);
+        typeSystem.receiverTypeFor(node.selector, node.receiver.type);
 
-    if (node.selector.isOperator && node.dartArgumentsLength == 1) {
-      Primitive leftArg = node.dartReceiver;
-      Primitive rightArg = node.dartArgument(0);
+    if (node.selector.isOperator && node.argumentRefs.length == 1) {
+      Primitive leftArg = node.receiver;
+      Primitive rightArg = node.argument(0);
       AbstractConstantValue left = getValue(leftArg);
       AbstractConstantValue right = getValue(rightArg);
 
@@ -1383,7 +1385,7 @@
         }
       }
     }
-    if (node.selector.isOperator && node.dartArgumentsLength == 0) {
+    if (node.selector.isOperator && node.argumentRefs.length == 0) {
       if (typeSystem.isDefinitelyNum(successType)) {
         String opname = node.selector.name;
         if (opname == '~') {
@@ -1396,11 +1398,11 @@
     }
     if (node.selector.isCall) {
       String name = node.selector.name;
-      Primitive receiver = node.dartReceiver;
+      Primitive receiver = node.receiver;
       AbstractConstantValue receiverValue = getValue(receiver);
       if (name == 'remainder') {
-        if (node.dartArgumentsLength == 1) {
-          Primitive arg = node.dartArgument(0);
+        if (node.argumentRefs.length == 1) {
+          Primitive arg = node.argument(0);
           AbstractConstantValue argValue = getValue(arg);
           if (lattice.isDefinitelyInt(receiverValue, allowNull: true) &&
               lattice.isDefinitelyInt(argValue) &&
@@ -1410,8 +1412,8 @@
           }
         }
       } else if (name == 'codeUnitAt') {
-        if (node.dartArgumentsLength == 1) {
-          Primitive index = node.dartArgument(0);
+        if (node.argumentRefs.length == 1) {
+          Primitive index = node.argument(0);
           if (lattice.isDefinitelyString(receiverValue) &&
               lattice.isDefinitelyInt(getValue(index))) {
             CpsFragment cps = new CpsFragment(node.sourceInformation);
@@ -1443,9 +1445,8 @@
   /// invocation with a direct access to a field.
   ///
   /// Returns `true` if the node was replaced.
-  Primitive specializeFieldAccess(InvokeMethod node) {
-    if (!node.selector.isGetter && !node.selector.isSetter) return null;
-    AbstractConstantValue receiver = getValue(node.dartReceiver);
+  specializeFieldAccess(InvokeMethod node) {
+    AbstractConstantValue receiver = getValue(node.receiver);
     Element target =
         typeSystem.locateSingleElement(receiver.type, node.selector);
     if (target is! FieldElement) return null;
@@ -1455,13 +1456,25 @@
       return null;
     }
     if (node.selector.isGetter) {
-      return new GetField(node.dartReceiver, target);
-    } else {
+      return new GetField(node.receiver, target);
+    } else if (node.selector.isSetter) {
       if (target.isFinal) return null;
       assert(node.hasNoUses);
-      return new SetField(node.dartReceiver,
+      return new SetField(node.receiver,
                           target,
-                          node.dartArgument(0));
+                          node.argument(0));
+    } else if (node.selector.isCall) {
+      CpsFragment cps = new CpsFragment(node.sourceInformation);
+      Primitive fieldValue = cps.letPrim(new GetField(node.receiver, target));
+      Primitive result = cps.invokeMethod(
+          fieldValue,
+          new Selector.callClosureFrom(node.selector),
+          typeSystem.getFieldType(target),
+          node.arguments.toList());
+      node.replaceUsesWith(result);
+      return cps;
+    } else {
+      return null;
     }
   }
 
@@ -1515,7 +1528,7 @@
   ///
   /// Returns `true` if the node was replaced.
   specializeIndexableAccess(InvokeMethod node) {
-    Primitive receiver = node.dartReceiver;
+    Primitive receiver = node.receiver;
     AbstractConstantValue receiverValue = getValue(receiver);
     if (!typeSystem.isDefinitelyIndexable(receiverValue.type,
             allowNull: true)) {
@@ -1532,7 +1545,7 @@
             return null;
           }
           CpsFragment cps = new CpsFragment(node.sourceInformation);
-          Primitive newLength = node.dartArgument(0);
+          Primitive newLength = node.argument(0);
           if (!typeSystem.isDefinitelyUint(newLength.type)) {
             // TODO(asgerf): We could let the SetLength instruction throw for
             // negative right-hand sides (see length setter in js_array.dart).
@@ -1557,7 +1570,7 @@
         return null;
 
       case '[]':
-        Primitive index = node.dartArgument(0);
+        Primitive index = node.argument(0);
         CpsFragment cps = new CpsFragment(node.sourceInformation);
         receiver = makeBoundsCheck(cps, receiver, index);
         GetIndex get = cps.letPrim(new GetIndex(receiver, index));
@@ -1571,8 +1584,8 @@
                 allowNull: true)) {
           return null;
         }
-        Primitive index = node.dartArgument(0);
-        Primitive value = node.dartArgument(1);
+        Primitive index = node.argument(0);
+        Primitive value = node.argument(1);
         CpsFragment cps = new CpsFragment(node.sourceInformation);
         receiver = makeBoundsCheck(cps, receiver, index);
         cps.letPrim(new SetIndex(receiver, index, value));
@@ -1610,7 +1623,7 @@
   ///
   /// Returns `true` if the node was replaced.
   CpsFragment specializeArrayAccess(InvokeMethod node) {
-    Primitive list = node.dartReceiver;
+    Primitive list = node.receiver;
     AbstractConstantValue listValue = getValue(list);
     // Ensure that the object is a native list or null.
     if (!lattice.isDefinitelyArray(listValue, allowNull: true)) {
@@ -1629,7 +1642,7 @@
           return null;
         }
         if (!isExtendable) return null;
-        Primitive addedItem = node.dartArgument(0);
+        Primitive addedItem = node.argument(0);
         CpsFragment cps = new CpsFragment(sourceInfo);
         cps.invokeBuiltin(BuiltinMethod.Push,
             list,
@@ -1661,7 +1674,7 @@
           return null;
         }
         if (!isExtendable) return null;
-        Primitive addedList = node.dartArgument(0);
+        Primitive addedList = node.argument(0);
         // Rewrite addAll([x1, ..., xN]) to push(x1), ..., push(xN).
         // Ensure that the list is not mutated between creation and use.
         // We aim for the common case where this is the only use of the list,
@@ -1688,7 +1701,7 @@
           return null;
         }
         if (listValue.isNullable) return null;
-        Primitive index = node.dartArgument(0);
+        Primitive index = node.argument(0);
         if (!lattice.isDefinitelyInt(getValue(index))) return null;
         CpsFragment cps = new CpsFragment(node.sourceInformation);
         list = makeBoundsCheck(cps, list, index);
@@ -1711,6 +1724,7 @@
         Primitive result = cps.inlineFunction(target,
             node.receiver,
             node.arguments.toList(),
+            interceptor: node.interceptor,
             hint: node.hint);
         node.replaceUsesWith(result);
         return cps;
@@ -1898,7 +1912,7 @@
     assert(!isInterceptedSelector(call));
     assert(call.argumentCount == node.argumentRefs.length);
 
-    Primitive tearOff = node.dartReceiver.effectiveDefinition;
+    Primitive tearOff = node.receiver.effectiveDefinition;
     // Note: We don't know if [tearOff] is actually a tear-off.
     // We name variables based on the pattern we are trying to match.
 
@@ -2028,7 +2042,7 @@
     // Accesses to closed-over values are field access primitives.  We we don't
     // inline if there are other uses of 'this' since that could be an escape or
     // a recursive call.
-    for (Reference ref = target.thisParameter.firstRef;
+    for (Reference ref = target.receiverParameter.firstRef;
          ref != null;
          ref = ref.next) {
       Node use = ref.parent;
@@ -2074,13 +2088,13 @@
     }
     node.effects =
         Effects.from(compiler.world.getSideEffectsOfElement(target));
-    TypeMask receiverType = node.dartReceiver.type;
+    TypeMask receiverType = node.receiver.type;
     if (node.callingConvention == CallingConvention.Intercepted &&
         typeSystem.areDisjoint(receiverType, typeSystem.interceptorType)) {
       // Some direct calls take an interceptor because the target class is
       // mixed into a native class.  If it is known at the call site that the
       // receiver is non-intercepted, get rid of the interceptor.
-      node.receiverRef.changeTo(node.dartReceiver);
+      node.interceptorRef.changeTo(node.receiver);
     }
   }
 
@@ -2094,7 +2108,7 @@
         specializeClosureCall(node);
     if (specialized != null) return specialized;
 
-    TypeMask receiverType = node.dartReceiver.type;
+    TypeMask receiverType = node.receiver.type;
     node.mask = typeSystem.intersection(node.mask, receiverType);
 
     node.effects = Effects.from(
@@ -2109,16 +2123,13 @@
         typeSystem.areDisjoint(receiverType, typeSystem.interceptorType)) {
       // Use the Dart receiver as the JS receiver. This changes the wording of
       // the error message when the receiver is null, but we accept this.
-      node.receiverRef.changeTo(node.dartReceiver);
+      node.interceptorRef.changeTo(node.receiver);
 
       // Replace the extra receiver argument with a dummy value if the
       // target definitely does not use it.
       if (typeSystem.targetIgnoresReceiverArgument(receiverType,
             node.selector)) {
-        Constant dummy = makeConstantPrimitive(new IntConstantValue(0));
-        new LetPrim(dummy).insertAbove(node.parent);
-        node.argumentRefs[0].changeTo(dummy);
-        node.callingConvention = CallingConvention.DummyIntercepted;
+        node.makeDummyIntercepted();
       }
     }
   }
@@ -2155,11 +2166,12 @@
             Selectors.toString_, value.type);
         if (typeSystem.isDefinitelyString(toStringReturn)) {
           CpsFragment cps = new CpsFragment(node.sourceInformation);
-          Primitive invoke = cps.invokeMethod(argument,
+          Primitive invoke = cps.invokeMethod(
+              argument,
               Selectors.toString_,
               value.type,
-              [cps.makeZero()],
-              CallingConvention.DummyIntercepted);
+              [],
+              callingConvention: CallingConvention.DummyIntercepted);
           node.replaceUsesWith(invoke);
           return cps;
         }
@@ -2680,38 +2692,25 @@
   void visit(Node node) { node.accept(this); }
 
   void visitFunctionDefinition(FunctionDefinition node) {
-    bool isIntercepted = backend.isInterceptedMethod(node.element);
-
+    if (node.interceptorParameter != null) {
+      setValue(node.interceptorParameter, nonConstant(typeSystem.nonNullType));
+    }
     // If the abstract value of the function parameters is Nothing, use the
     // inferred parameter type.  Otherwise (e.g., when inlining) do not
     // change the abstract value.
-    if (node.thisParameter != null && getValue(node.thisParameter).isNothing) {
-      if (isIntercepted &&
-          !typeSystem.methodIgnoresReceiverArgument(node.element)) {
-        setValue(node.thisParameter, nonConstant(typeSystem.nonNullType));
-      } else {
-        setValue(node.thisParameter,
-            nonConstant(typeSystem.getReceiverType(node.element)));
-      }
-    }
-    if (isIntercepted && getValue(node.parameters[0]).isNothing) {
-      if (typeSystem.methodIgnoresReceiverArgument(node.element)) {
-        setValue(node.parameters[0], nonConstant());
-      } else {
-        setValue(node.parameters[0],
-            nonConstant(typeSystem.getReceiverType(node.element)));
-      }
+    if (node.receiverParameter != null &&
+        getValue(node.receiverParameter).isNothing) {
+      setValue(node.receiverParameter,
+          nonConstant(typeSystem.getReceiverType(node.element)));
     }
     bool hasParameterWithoutValue = false;
-    for (Parameter param in node.parameters.skip(isIntercepted ? 1 : 0)) {
+    for (Parameter param in node.parameters) {
       if (getValue(param).isNothing) {
         TypeMask type = param.hint is ParameterElement
             ? typeSystem.getParameterType(param.hint)
             : typeSystem.dynamicType;
         setValue(param, lattice.fromMask(type));
-        if (type.isEmpty && !type.isNullable) {
-          hasParameterWithoutValue = true;
-        }
+        if (type.isEmpty) hasParameterWithoutValue = true;
       }
     }
     if (!hasParameterWithoutValue) { // Don't analyze unreachable code.
@@ -2775,7 +2774,7 @@
   }
 
   void visitInvokeMethod(InvokeMethod node) {
-    AbstractConstantValue receiver = getValue(node.dartReceiver);
+    AbstractConstantValue receiver = getValue(node.receiver);
     if (receiver.isNothing) {
       return setResult(node, lattice.nothing);
     }
@@ -2801,7 +2800,7 @@
 
     if (node.selector.isCall) {
       if (node.selector == Selectors.codeUnitAt) {
-        AbstractConstantValue right = getValue(node.dartArgument(0));
+        AbstractConstantValue right = getValue(node.argument(0));
         AbstractConstantValue result =
             lattice.codeUnitAtSpecial(receiver, right);
         return finish(result, canReplace: !receiver.isNullable);
@@ -2810,7 +2809,7 @@
     }
 
     if (node.selector == Selectors.index) {
-      AbstractConstantValue right = getValue(node.dartArgument(0));
+      AbstractConstantValue right = getValue(node.argument(0));
       AbstractConstantValue result = lattice.indexSpecial(receiver, right);
       return finish(result, canReplace: !receiver.isNullable);
     }
@@ -2821,7 +2820,7 @@
 
     // Calculate the resulting constant if possible.
     String opname = node.selector.name;
-    if (node.dartArgumentsLength == 0) {
+    if (node.argumentRefs.length == 0) {
       // Unary operator.
       if (opname == "unary-") {
         opname = "-";
@@ -2829,9 +2828,9 @@
       UnaryOperator operator = UnaryOperator.parse(opname);
       AbstractConstantValue result = lattice.unaryOp(operator, receiver);
       return finish(result, canReplace: !receiver.isNullable);
-    } else if (node.dartArgumentsLength == 1) {
+    } else if (node.argumentRefs.length == 1) {
       // Binary operator.
-      AbstractConstantValue right = getValue(node.dartArgument(0));
+      AbstractConstantValue right = getValue(node.argument(0));
       BinaryOperator operator = BinaryOperator.parse(opname);
       AbstractConstantValue result =
           lattice.binaryOp(operator, receiver, right);
@@ -3383,11 +3382,10 @@
 
   factory AbstractConstantValue.nonConstant(TypeMask type) {
     if (type.isEmpty) {
-      if (type.isNullable)
-        return new AbstractConstantValue.constantValue(
-            new NullConstantValue(), type);
-      else
-        return new AbstractConstantValue.nothing();
+      return new AbstractConstantValue.nothing();
+    } else if (type.isNull) {
+      return new AbstractConstantValue.constantValue(
+          new NullConstantValue(), type);
     } else {
       return new AbstractConstantValue._internal(NONCONST, null, type);
     }
diff --git a/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart b/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
index 13d4c95..50dc24a 100644
--- a/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
@@ -67,7 +67,7 @@
   ),  // Generated. Don't edit.
   MessageKind.CONSTRUCTOR_WITH_RETURN_TYPE: const MessageTemplate(
     MessageKind.CONSTRUCTOR_WITH_RETURN_TYPE,
-    "Constructors can't have a return type",
+    "Constructors can't have a return type.",
     howToFix: "Try removing the return type.",
     examples: const [
       "class A { int A() {} } main() { new A(); }",
@@ -84,7 +84,7 @@
   ),  // Generated. Don't edit.
   MessageKind.RETHROW_OUTSIDE_CATCH: const MessageTemplate(
     MessageKind.RETHROW_OUTSIDE_CATCH,
-    "Rethrow must be inside of catch clause",
+    "Rethrow must be inside of catch clause.",
     howToFix: "Try moving the expression into a catch clause, or using a 'throw' expression.",
     examples: const [
       "main() { rethrow; }",
@@ -108,7 +108,7 @@
   MessageKind.RETURN_IN_GENERATOR: const MessageTemplate(
     MessageKind.RETURN_IN_GENERATOR,
     "Can't return a value from a generator function (using the '#{modifier}' modifier).",
-    howToFix: "Try removing the value, replacing 'return' with 'yield' or changing the method body modifier",
+    howToFix: "Try removing the value, replacing 'return' with 'yield' or changing the method body modifier.",
     examples: const [
       r"""
         foo() async* { return 0; }
@@ -120,4 +120,113 @@
         """,
     ]
   ),  // Generated. Don't edit.
+  MessageKind.NOT_ASSIGNABLE: const MessageTemplate(
+    MessageKind.NOT_ASSIGNABLE,
+    "'#{fromType}' is not assignable to '#{toType}'."  ),  // Generated. Don't edit.
+  MessageKind.FORIN_NOT_ASSIGNABLE: const MessageTemplate(
+    MessageKind.FORIN_NOT_ASSIGNABLE,
+    "The element type '#{currentType}' of '#{expressionType}' is not assignable to '#{elementType}'.",
+    examples: const [
+      r"""
+        main() {
+          List<int> list = <int>[1, 2];
+          for (String x in list) x;
+        }
+        """,
+    ]
+  ),  // Generated. Don't edit.
+  MessageKind.CANNOT_RESOLVE: const MessageTemplate(
+    MessageKind.CANNOT_RESOLVE,
+    "Can't resolve '#{name}'."  ),  // Generated. Don't edit.
+  MessageKind.UNDEFINED_METHOD: const MessageTemplate(
+    MessageKind.UNDEFINED_METHOD,
+    "The method '#{memberName}' is not defined for the class '#{className}'.",
+    examples: const [
+      r"""
+        class A {
+          foo() { bar(); }
+        }
+        main() { new A().foo(); }
+        """,
+    ]
+  ),  // Generated. Don't edit.
+  MessageKind.UNDEFINED_GETTER: const MessageTemplate(
+    MessageKind.UNDEFINED_GETTER,
+    "The getter '#{memberName}' is not defined for the class '#{className}'.",
+    examples: const [
+      "class A {} main() { new A().x; }",
+      "class A {} main() { A.x; }",
+    ]
+  ),  // Generated. Don't edit.
+  MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER: const MessageTemplate(
+    MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER,
+    "The setter '#{memberName}' in class '#{className}' can not be used as a getter.",
+    examples: const [
+      "class A { set x(y) {} } main() { new A().x; }",
+    ]
+  ),  // Generated. Don't edit.
+  MessageKind.UNDEFINED_OPERATOR: const MessageTemplate(
+    MessageKind.UNDEFINED_OPERATOR,
+    "The operator '#{memberName}' is not defined for the class '#{className}'.",
+    examples: const [
+      "class A {} main() { new A() + 3; }",
+    ]
+  ),  // Generated. Don't edit.
+  MessageKind.UNDEFINED_SETTER: const MessageTemplate(
+    MessageKind.UNDEFINED_SETTER,
+    "The setter '#{memberName}' is not defined for the class '#{className}'.",
+    examples: const [
+      "class A {} main() { new A().x = 499; }",
+    ]
+  ),  // Generated. Don't edit.
+  MessageKind.NO_SUCH_SUPER_MEMBER: const MessageTemplate(
+    MessageKind.NO_SUCH_SUPER_MEMBER,
+    "Can't resolve '#{memberName}' in a superclass of '#{className}'."  ),  // Generated. Don't edit.
+  MessageKind.UNDEFINED_SUPER_SETTER: const MessageTemplate(
+    MessageKind.UNDEFINED_SUPER_SETTER,
+    "The setter '#{memberName}' is not defined in a superclass of '#{className}'.",
+    examples: const [
+      r"""
+        class A {}
+        class B extends A {
+          foo() { super.x = 499; }
+        }
+        main() { new B().foo(); }
+        """,
+    ]
+  ),  // Generated. Don't edit.
+  MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER: const MessageTemplate(
+    MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
+    "Cannot resolve getter '#{name}'.",
+    examples: const [
+      "set foo(x) {}  main() { foo; }",
+    ]
+  ),  // Generated. Don't edit.
+  MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER: const MessageTemplate(
+    MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
+    "Cannot resolve setter '#{name}'.",
+    examples: const [
+      r"""
+        main() {
+          final x = 1;
+          x = 2;
+        }""",
+      r"""
+        main() {
+          const x = 1;
+          x = 2;
+        }
+        """,
+      r"""
+        final x = 1;
+        main() { x = 3; }
+        """,
+      r"""
+        const x = 1;
+        main() { x = 3; }
+        """,
+      "get foo => null  main() { foo = 5; }",
+      "const foo = 0  main() { foo = 5; }",
+    ]
+  ),  // Generated. Don't edit.
 };
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 84e9cc2..7a80947 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -132,9 +132,9 @@
   CANNOT_RESOLVE_AWAIT_IN_CLOSURE,
   CANNOT_RESOLVE_CONSTRUCTOR,
   CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT,
-  CANNOT_RESOLVE_GETTER,
+  UNDEFINED_STATIC_GETTER_BUT_SETTER,
   CANNOT_RESOLVE_IN_INITIALIZER,
-  CANNOT_RESOLVE_SETTER,
+  UNDEFINED_STATIC_SETTER_BUT_GETTER,
   CANNOT_RESOLVE_TYPE,
   RETURN_IN_GENERATIVE_CONSTRUCTOR,
   CLASS_NAME_EXPECTED,
@@ -212,7 +212,7 @@
   FUNCTION_WITH_INITIALIZER,
   GENERIC,
   GETTER_MISMATCH,
-  GETTER_NOT_FOUND,
+  UNDEFINED_INSTANCE_GETTER_BUT_SETTER,
   HEX_DIGIT_EXPECTED,
   HIDDEN_HINTS,
   HIDDEN_IMPLICIT_IMPORT,
@@ -300,10 +300,10 @@
   MAIN_NOT_A_FUNCTION,
   MAIN_WITH_EXTRA_PARAMETER,
   MALFORMED_STRING_LITERAL,
-  MEMBER_NOT_FOUND,
+  UNDEFINED_GETTER,
   MEMBER_NOT_STATIC,
   MEMBER_USES_CLASS_NAME,
-  METHOD_NOT_FOUND,
+  UNDEFINED_METHOD,
   MINUS_OPERATOR_BAD_ARITY,
   MIRROR_BLOAT,
   MIRROR_IMPORT,
@@ -359,7 +359,7 @@
   NULL_NOT_ALLOWED,
   ONLY_ONE_LIBRARY_TAG,
   OPERATOR_NAMED_PARAMETERS,
-  OPERATOR_NOT_FOUND,
+  UNDEFINED_OPERATOR,
   OPERATOR_OPTIONAL_PARAMETERS,
   OPTIONAL_PARAMETER_IN_CATCH,
   OVERRIDE_EQUALS_NOT_HASH_CODE,
@@ -412,8 +412,8 @@
   RETURN_NOTHING,
   RETURN_VALUE_IN_VOID,
   SETTER_MISMATCH,
-  SETTER_NOT_FOUND,
-  SETTER_NOT_FOUND_IN_SUPER,
+  UNDEFINED_SETTER,
+  UNDEFINED_SUPER_SETTER,
   STATIC_FUNCTION_BLOAT,
   STRING_EXPECTED,
   SUPER_CALL_TO_FACTORY,
@@ -518,15 +518,6 @@
       MessageKind.GENERIC:
         const MessageTemplate(MessageKind.GENERIC, '#{text}'),
 
-      MessageKind.NOT_ASSIGNABLE:
-        const MessageTemplate(MessageKind.NOT_ASSIGNABLE,
-          "'#{fromType}' is not assignable to '#{toType}'."),
-
-      MessageKind.FORIN_NOT_ASSIGNABLE:
-        const MessageTemplate(MessageKind.FORIN_NOT_ASSIGNABLE,
-          "The element type '#{currentType}' of '#{expressionType}' "
-          "is not assignable to '#{elementType}'."),
-
       MessageKind.VOID_EXPRESSION:
         const MessageTemplate(MessageKind.VOID_EXPRESSION,
           "Expression does not yield a value."),
@@ -555,10 +546,6 @@
         const MessageTemplate(MessageKind.NAMED_ARGUMENT_NOT_FOUND,
           "No named argument '#{argumentName}' found on method."),
 
-      MessageKind.MEMBER_NOT_FOUND:
-        const MessageTemplate(MessageKind.MEMBER_NOT_FOUND,
-          "No member named '#{memberName}' in class '#{className}'."),
-
       MessageKind.AWAIT_MEMBER_NOT_FOUND:
         const MessageTemplate(MessageKind.AWAIT_MEMBER_NOT_FOUND,
           "No member named 'await' in class '#{className}'.",
@@ -583,26 +570,6 @@
 main() => new A().m();
 """]),
 
-      MessageKind.METHOD_NOT_FOUND:
-        const MessageTemplate(MessageKind.METHOD_NOT_FOUND,
-          "No method named '#{memberName}' in class '#{className}'."),
-
-      MessageKind.OPERATOR_NOT_FOUND:
-        const MessageTemplate(MessageKind.OPERATOR_NOT_FOUND,
-          "No operator '#{memberName}' in class '#{className}'."),
-
-      MessageKind.SETTER_NOT_FOUND:
-        const MessageTemplate(MessageKind.SETTER_NOT_FOUND,
-          "No setter named '#{memberName}' in class '#{className}'."),
-
-      MessageKind.SETTER_NOT_FOUND_IN_SUPER:
-        const MessageTemplate(MessageKind.SETTER_NOT_FOUND_IN_SUPER,
-          "No setter named '#{name}' in superclass of '#{className}'."),
-
-      MessageKind.GETTER_NOT_FOUND:
-        const MessageTemplate(MessageKind.GETTER_NOT_FOUND,
-          "No getter named '#{memberName}' in class '#{className}'."),
-
       MessageKind.NOT_CALLABLE:
         const MessageTemplate(MessageKind.NOT_CALLABLE,
           "'#{elementName}' is not callable."),
@@ -1652,10 +1619,6 @@
         const MessageTemplate(MessageKind.ILLEGAL_SUPER_SEND,
           "'#{name}' cannot be called on super."),
 
-      MessageKind.NO_SUCH_SUPER_MEMBER:
-        const MessageTemplate(MessageKind.NO_SUCH_SUPER_MEMBER,
-          "Cannot resolve '#{memberName}' in a superclass of '#{className}'."),
-
       MessageKind.ADDITIONAL_TYPE_ARGUMENT:
         const MessageTemplate(MessageKind.ADDITIONAL_TYPE_ARGUMENT,
           "Additional type argument."),
@@ -1896,12 +1859,8 @@
         const MessageTemplate(MessageKind.PARAMETER_NAME_EXPECTED,
           "parameter name expected."),
 
-      MessageKind.CANNOT_RESOLVE_GETTER:
-        const MessageTemplate(MessageKind.CANNOT_RESOLVE_GETTER,
-          "Cannot resolve getter."),
-
-      MessageKind.CANNOT_RESOLVE_SETTER:
-        const MessageTemplate(MessageKind.CANNOT_RESOLVE_SETTER,
+      MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER:
+        const MessageTemplate(MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
           "Cannot resolve setter."),
 
       MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER:
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index 4ff72ab..68cf701 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -553,7 +553,7 @@
     }
 
     TypeMask newType = null;
-    for (TypeMask mask in masks) {
+    for (TypeMask mask in list) {
       newType = newType == null ? mask : newType.union(mask, classWorld);
       // Likewise - stop early if we already reach dynamic.
       if (newType.containsAll(classWorld)) return dynamicType;
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index cbc662c..98a9309 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -832,7 +832,6 @@
                                             TypeGraphInferrerEngine inferrer) {
     ClassWorld classWorld = inferrer.classWorld;
     if (!classWorld.backend.intImplementation.isResolved) return null;
-    TypeMask emptyType = const TypeMask.nonNullEmpty();
     if (mask == null) return null;
     if (!mask.containsOnlyInt(classWorld)) {
       return null;
@@ -843,7 +842,7 @@
 
     ClassElement uint31Implementation = classWorld.backend.uint31Implementation;
     bool isInt(info) => info.type.containsOnlyInt(classWorld);
-    bool isEmpty(info) => info.type == emptyType;
+    bool isEmpty(info) => info.type.isEmpty;
     bool isUInt31(info) {
       return info.type.satisfies(uint31Implementation, classWorld);
     }
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 8966763..1a561cd 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -163,7 +163,8 @@
               sourceFile, element.position.charOffset, name));
     } else {
       return new PositionSourceInformation(
-          null,
+          new OffsetSourceLocation(sourceFile,
+              element.resolvedAst.node.getBeginToken().charOffset, name),
           new OffsetSourceLocation(sourceFile,
               element.resolvedAst.node.getEndToken().charOffset, name));
     }
@@ -500,16 +501,30 @@
   void onStep(js.Node node, Offset offset, StepKind kind) {
     SourceInformation sourceInformation = computeSourceInformation(node);
     if (sourceInformation == null) return;
+    int codeLocation = offset.subexpressionOffset;
+    if (codeLocation == null) return;
 
-    SourcePositionKind sourcePositionKind = SourcePositionKind.START;
+    void registerPosition(SourcePositionKind sourcePositionKind) {
+      SourceLocation sourceLocation =
+          getSourceLocation(sourceInformation, sourcePositionKind);
+      if (sourceLocation != null) {
+        sourceMapper.register(node, codeLocation, sourceLocation);
+      }
+    }
+
     switch (kind) {
-      case StepKind.FUN:
-        sourcePositionKind = SourcePositionKind.INNER;
+      case StepKind.FUN_ENTRY:
+        // TODO(johnniwinther): Remove this when fully transitioned to the
+        // new source info system.
+        registerPosition(SourcePositionKind.START);
+        break;
+      case StepKind.FUN_EXIT:
+        registerPosition(SourcePositionKind.INNER);
         break;
       case StepKind.CALL:
         CallPosition callPosition =
             CallPosition.getSemanticPositionForCall(node);
-        sourcePositionKind = callPosition.sourcePositionKind;
+        registerPosition(callPosition.sourcePositionKind);
         break;
       case StepKind.NEW:
       case StepKind.RETURN:
@@ -524,14 +539,9 @@
       case StepKind.WHILE_CONDITION:
       case StepKind.DO_CONDITION:
       case StepKind.SWITCH_EXPRESSION:
+        registerPosition(SourcePositionKind.START);
         break;
     }
-    int codeLocation = offset.subexpressionOffset;
-    SourceLocation sourceLocation =
-        getSourceLocation(sourceInformation, sourcePositionKind);
-    if (codeLocation != null && sourceLocation != null) {
-      sourceMapper.register(node, codeLocation, sourceLocation);
-    }
   }
 }
 
@@ -672,7 +682,8 @@
 }
 
 enum StepKind {
-  FUN,
+  FUN_ENTRY,
+  FUN_EXIT,
   CALL,
   NEW,
   RETURN,
@@ -797,11 +808,17 @@
     if (!active) {
       active = node.sourceInformation != null;
     }
+    leftToRightOffset = statementOffset =
+        getSyntaxOffset(node, kind: CodePositionKind.START);
+    Offset entryOffset = getOffsetForNode(node, statementOffset);
+    notifyStep(node, entryOffset, StepKind.FUN_ENTRY);
+
     visit(node.body);
+
     leftToRightOffset = statementOffset =
         getSyntaxOffset(node, kind: CodePositionKind.CLOSING);
-    Offset offset = getOffsetForNode(node, statementOffset);
-    notifyStep(node, offset, StepKind.FUN);
+    Offset exitOffset = getOffsetForNode(node, statementOffset);
+    notifyStep(node, exitOffset, StepKind.FUN_EXIT);
     active = activeBefore;
   }
 
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index da46d43..35d9583 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -15,9 +15,6 @@
     JavaScriptNodeSourceInformation;
 import 'source_file.dart';
 
-bool useNewSourceInfo =
-    const bool.fromEnvironment('USE_NEW_SOURCE_INFO', defaultValue: false);
-
 /// Interface for passing source information, for instance for use in source
 /// maps, through the backend.
 abstract class SourceInformation extends JavaScriptNodeSourceInformation {
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 14d1f6e..1d8a35a 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -509,7 +509,8 @@
 
   JavaScriptBackend(Compiler compiler,
                     {bool generateSourceMap: true,
-                     bool useStartupEmitter: false})
+                     bool useStartupEmitter: false,
+                     bool useNewSourceInfo: false})
       : namer = determineNamer(compiler),
         oneShotInterceptors = new Map<jsAst.Name, Selector>(),
         interceptedElements = new Map<String, Set<Element>>(),
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
index 4d0f497..9f1947f 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
@@ -184,7 +184,8 @@
     if (jsVariables.length > 0) {
       // Would be nice to avoid inserting at the beginning of list.
       accumulator.insert(0, new js.ExpressionStatement(
-          new js.VariableDeclarationList(jsVariables)));
+          new js.VariableDeclarationList(jsVariables)
+              .withSourceInformation(function.sourceInformation)));
     }
     return new js.Fun(parameters, new js.Block(accumulator));
   }
diff --git a/pkg/compiler/lib/src/js_backend/codegen/glue.dart b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
index 46ef1a5..abbb894 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/glue.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
@@ -299,4 +299,10 @@
   bool mayGenerateInstanceofCheck(DartType type) {
     return _backend.mayGenerateInstanceofCheck(type);
   }
+
+  bool methodUsesReceiverArgument(FunctionElement function) {
+    assert(isInterceptedMethod(function));
+    ClassElement class_ = function.enclosingClass.declaration;
+    return isInterceptorClass(class_) || isUsedAsMixin(class_);
+  }
 }
diff --git a/pkg/compiler/lib/src/js_backend/codegen/task.dart b/pkg/compiler/lib/src/js_backend/codegen/task.dart
index edc7c55..89b9aab 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/task.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/task.dart
@@ -216,9 +216,8 @@
     if (type is UnionTypeMask) {
       return '[${type.disjointMasks.map(formatTypeMask).join(', ')}]';
     } else if (type is FlatTypeMask) {
-      if (type.isEmpty) {
-        return "null";
-      }
+      if (type.isEmpty) return "empty";
+      if (type.isNull) return "null";
       String suffix = (type.isExact ? "" : "+") + (type.isNullable ? "?" : "!");
       return '${type.base.name}$suffix';
     } else if (type is ForwardingTypeMask) {
@@ -296,7 +295,7 @@
   tree_ir.FunctionDefinition compileToTreeIr(cps.FunctionDefinition cpsNode) {
     applyCpsPass(new Finalize(backend), cpsNode);
     tree_builder.Builder builder = new tree_builder.Builder(
-        reporter.internalError);
+        reporter.internalError, glue);
     tree_ir.FunctionDefinition treeNode =
         treeBuilderTask.measure(() => builder.buildFunction(cpsNode));
     assert(treeNode != null);
diff --git a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
index 4ca64fa..f7ff67f 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
@@ -7,7 +7,6 @@
 import '../../elements/elements.dart';
 import '../../js_backend/codegen/glue.dart';
 import '../../universe/selector.dart' show Selector;
-import '../../cps_ir/cps_ir_builder.dart' show ThisParameterLocal;
 import '../../cps_ir/cps_fragment.dart';
 import '../../common/names.dart';
 
@@ -38,8 +37,13 @@
 class UnsugarVisitor extends TrampolineRecursiveVisitor implements Pass {
   Glue _glue;
 
-  Parameter thisParameter;
-  Parameter explicitReceiverParameter;
+  FunctionDefinition function;
+
+  Parameter get receiverParameter => function.receiverParameter;
+
+  /// The interceptor of the receiver.  For some methods, this is the receiver
+  /// itself, for others, it is the interceptor parameter.
+  Parameter receiverInterceptor;
 
   // In a catch block, rethrow implicitly throws the block's exception
   // parameter.  This is the exception parameter when nested in a catch
@@ -50,15 +54,8 @@
 
   String get passName => 'Unsugaring';
 
-  bool methodUsesReceiverArgument(FunctionElement function) {
-    assert(_glue.isInterceptedMethod(function));
-    ClassElement clazz = function.enclosingClass.declaration;
-    return _glue.isInterceptorClass(clazz) ||
-           _glue.isUsedAsMixin(clazz);
-  }
-
   void rewrite(FunctionDefinition function) {
-    thisParameter = function.thisParameter;
+    this.function = function;
     bool inInterceptedMethod = _glue.isInterceptedMethod(function.element);
 
     if (function.element.name == '==' &&
@@ -70,15 +67,16 @@
     }
 
     if (inInterceptedMethod) {
-      ThisParameterLocal holder = thisParameter.hint;
-      explicitReceiverParameter = new Parameter(
-          new ExplicitReceiverParameterEntity(holder.executableContext));
-      explicitReceiverParameter.parent = function;
-      function.parameters.insert(0, explicitReceiverParameter);
-    }
-
-    if (inInterceptedMethod && methodUsesReceiverArgument(function.element)) {
-      thisParameter.replaceUsesWith(explicitReceiverParameter);
+      function.interceptorParameter = new Parameter(null)..parent = function;
+      // Since the receiver won't be compiled to "this", set a hint on it
+      // so the parameter gets a meaningful name.
+      function.receiverParameter.hint =
+          new ExplicitReceiverParameterEntity(function.element);
+      // If we need an interceptor for the receiver, use the receiver itself
+      // if possible, otherwise the interceptor argument.
+      receiverInterceptor = _glue.methodUsesReceiverArgument(function.element)
+          ? function.interceptorParameter
+          : receiverParameter;
     }
 
     visit(function);
@@ -211,45 +209,44 @@
     }
 
     Primitive receiver = node.receiver;
-    Primitive newReceiver;
+    Primitive interceptor;
 
-    if (receiver == explicitReceiverParameter) {
-      // If the receiver is the explicit receiver, we are calling a method in
+    if (receiver == receiverParameter && receiverInterceptor != null) {
+      // TODO(asgerf): This could be done by GVN.
+      // If the receiver is 'this', we are calling a method in
       // the same interceptor:
       //  Change 'receiver.foo()'  to  'this.foo(receiver)'.
-      newReceiver = thisParameter;
+      interceptor = receiverInterceptor;
     } else {
-      newReceiver = new Interceptor(receiver, node.sourceInformation);
+      interceptor = new Interceptor(receiver, node.sourceInformation);
       if (receiver.hint != null) {
-        newReceiver.hint = new InterceptorEntity(receiver.hint);
+        interceptor.hint = new InterceptorEntity(receiver.hint);
       }
-      new LetPrim(newReceiver).insertAbove(node.parent);
+      new LetPrim(interceptor).insertAbove(node.parent);
     }
-    node.argumentRefs.insert(0, node.receiverRef);
-    node.receiverRef = new Reference<Primitive>(newReceiver)..parent = node;
-    node.callingConvention = CallingConvention.Intercepted;
+    assert(node.interceptorRef == null);
+    node.makeIntercepted(interceptor);
   }
 
   processInvokeMethodDirectly(InvokeMethodDirectly node) {
     if (!_glue.isInterceptedMethod(node.target)) return;
 
     Primitive receiver = node.receiver;
-    Primitive newReceiver;
+    Primitive interceptor;
 
-    if (receiver == explicitReceiverParameter) {
-      // If the receiver is the explicit receiver, we are calling a method in
+    if (receiver == receiverParameter && receiverInterceptor != null) {
+      // If the receiver is 'this', we are calling a method in
       // the same interceptor:
       //  Change 'receiver.foo()'  to  'this.foo(receiver)'.
-      newReceiver = thisParameter;
+      interceptor = receiverInterceptor;
     } else {
-      newReceiver = new Interceptor(receiver, node.sourceInformation);
+      interceptor = new Interceptor(receiver, node.sourceInformation);
       if (receiver.hint != null) {
-        newReceiver.hint = new InterceptorEntity(receiver.hint);
+        interceptor.hint = new InterceptorEntity(receiver.hint);
       }
-      new LetPrim(newReceiver).insertAbove(node.parent);
+      new LetPrim(interceptor).insertAbove(node.parent);
     }
-    node.argumentRefs.insert(0, node.receiverRef);
-    node.receiverRef = new Reference<Primitive>(newReceiver)..parent = node;
-    node.callingConvention = CallingConvention.Intercepted;
+    assert(node.interceptorRef == null);
+    node.makeIntercepted(interceptor);
   }
 }
diff --git a/pkg/compiler/lib/src/js_backend/js_backend.dart b/pkg/compiler/lib/src/js_backend/js_backend.dart
index 4431a10..297f79f 100644
--- a/pkg/compiler/lib/src/js_backend/js_backend.dart
+++ b/pkg/compiler/lib/src/js_backend/js_backend.dart
@@ -62,8 +62,7 @@
     ResolutionEnqueuer;
 import '../io/code_output.dart';
 import '../io/source_information.dart' show
-    SourceInformationStrategy,
-    useNewSourceInfo;
+    SourceInformationStrategy;
 import '../io/position_information.dart' show
     PositionSourceInformationStrategy;
 import '../io/start_end_information.dart' show
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index fb5a6f8..5821afa 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -1024,8 +1024,8 @@
       Element error;
       if (selector.isSetter) {
         error = reportAndCreateErroneousElement(
-          node, name.text, MessageKind.SETTER_NOT_FOUND_IN_SUPER,
-          {'className': currentClass.name, 'name': name});
+          node, name.text, MessageKind.UNDEFINED_SUPER_SETTER,
+          {'className': currentClass.name, 'memberName': name});
       } else {
         error = reportAndCreateErroneousElement(
           node, name.text, MessageKind.NO_SUCH_SUPER_MEMBER,
@@ -1760,7 +1760,7 @@
     // [resolveSend] to select better warning messages for getters and
     // setters.
     ErroneousElement error = reportAndCreateErroneousElement(
-        node, name.text, MessageKind.MEMBER_NOT_FOUND,
+        node, name.text, MessageKind.UNDEFINED_GETTER,
         {'className': receiverClass.name, 'memberName': name.text});
     // TODO(johnniwinther): Add an [AccessSemantics] for unresolved static
     // member access.
@@ -1784,7 +1784,7 @@
 
     // TODO(johnniwinther): Produce a different error for complex update.
     ErroneousElement error = reportAndCreateErroneousElement(
-        node, name.text, MessageKind.MEMBER_NOT_FOUND,
+        node, name.text, MessageKind.UNDEFINED_GETTER,
         {'className': receiverClass.name, 'memberName': name.text});
     // TODO(johnniwinther): Add an [AccessSemantics] for unresolved static
     // member access.
@@ -2654,7 +2654,8 @@
       if (element.isFinal) {
         error = reportAndCreateErroneousElement(
             node.selector, name.text,
-            MessageKind.CANNOT_RESOLVE_SETTER, const {});
+            MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
+            {'name': name});
         semantics = new StaticAccess.finalParameter(element);
       } else {
         semantics = new StaticAccess.parameter(element);
@@ -2663,7 +2664,8 @@
       if (element.isFinal || element.isConst) {
         error = reportAndCreateErroneousElement(
             node.selector, name.text,
-            MessageKind.CANNOT_RESOLVE_SETTER, const {});
+            MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
+            {'name': name});
         semantics = new StaticAccess.finalLocalVariable(element);
       } else {
         semantics = new StaticAccess.localVariable(element);
@@ -2775,7 +2777,8 @@
           registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
           member = reportAndCreateErroneousElement(
               node.selector, name.text,
-              MessageKind.CANNOT_RESOLVE_GETTER, const {});
+              MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
+              {'name': name});
           break;
         default:
           reporter.internalError(node,
@@ -2809,7 +2812,8 @@
           registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
           member = reportAndCreateErroneousElement(
               node.selector, name.text,
-              MessageKind.CANNOT_RESOLVE_GETTER, const {});
+              MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
+              {'name': name});
           break;
         default:
           reporter.internalError(node,
@@ -2843,7 +2847,8 @@
       if (abstractField.setter == null) {
         ErroneousElement error = reportAndCreateErroneousElement(
             node.selector, name.text,
-            MessageKind.CANNOT_RESOLVE_SETTER, const {});
+            MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
+            {'name': name});
         registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
 
         if (node.isComplex) {
@@ -2866,7 +2871,8 @@
         if (abstractField.getter == null) {
           ErroneousElement error = reportAndCreateErroneousElement(
               node.selector, name.text,
-              MessageKind.CANNOT_RESOLVE_GETTER, const {});
+              MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
+              {'name': name});
           registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
           // `a++` or `a += b` where `a` has no getter.
           semantics = new CompoundAccessSemantics(
@@ -2931,7 +2937,8 @@
         if (member.isFinal || member.isConst) {
           ErroneousElement error = reportAndCreateErroneousElement(
                node.selector, name.text,
-               MessageKind.CANNOT_RESOLVE_SETTER, const {});
+               MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
+               {'name': name});
           registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
           semantics = member.isTopLevel
               ? new StaticAccess.finalTopLevelField(member)
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 85fd583..fb979aa 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -1401,9 +1401,7 @@
         // This means that the function always throws an exception.
         TypeMask returnType =
             compiler.typesTask.getGuaranteedReturnTypeOfElement(element);
-        if (returnType != null
-            && returnType.isEmpty
-            && !returnType.isNullable) {
+        if (returnType != null && returnType.isEmpty) {
           isReachable = false;
           return false;
         }
@@ -1688,8 +1686,8 @@
       }
     }
     if (const bool.fromEnvironment('unreachable-throw') == true) {
-      var emptyParameters = parameters.values.where((p) =>
-          p.instructionType.isEmpty && !p.instructionType.isNullable);
+      var emptyParameters = parameters.values
+          .where((p) => p.instructionType.isEmpty);
       if (emptyParameters.length > 0) {
         addComment('${emptyParameters} inferred as [empty]');
         pushInvokeStatic(function.body, helpers.assertUnreachableMethod, []);
diff --git a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
index 8d5e08f..b88fc41 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
@@ -135,7 +135,7 @@
       Set<ClassElement> interceptedClasses) {
 
     if (type.isNullable) {
-      if (type.isEmpty) {
+      if (type.isNull) {
         return helpers.jsNullClass;
       }
     } else if (type.containsOnlyInt(classWorld)) {
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index c279da9..28647bd 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -881,10 +881,9 @@
 
   bool canBeNull() => instructionType.isNullable;
 
-  bool isNull() => instructionType.isEmpty && instructionType.isNullable;
-  bool isConflicting() {
-    return instructionType.isEmpty && !instructionType.isNullable;
-  }
+  bool isNull() => instructionType.isNull;
+
+  bool isConflicting() => instructionType.isEmpty;
 
   /// Returns `true` if [typeMask] contains [cls].
   static bool containsType(
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index a8d82ae..8d274d7 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -249,8 +249,7 @@
     // there is a throw expression in a short-circuit conditional.  Removing the
     // unreachable HBoolify makes it easier to reconstruct the short-circuit
     // operation.
-    if (input.instructionType.isEmpty && !input.instructionType.isNullable)
-      return input;
+    if (input.instructionType.isEmpty) return input;
 
     // All values that cannot be 'true' are boolified to false.
     TypeMask mask = input.instructionType;
diff --git a/pkg/compiler/lib/src/ssa/types.dart b/pkg/compiler/lib/src/ssa/types.dart
index a34e60b..530a968 100644
--- a/pkg/compiler/lib/src/ssa/types.dart
+++ b/pkg/compiler/lib/src/ssa/types.dart
@@ -48,7 +48,7 @@
     TypeMask result = nativeBehavior.typesReturned
         .map((type) => fromNativeType(type, compiler))
         .reduce((t1, t2) => t1.union(t2, classWorld));
-    assert(!(result.isEmpty && !result.isNullable));
+    assert(!result.isEmpty);
     return result;
   }
 
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index adda76e..00032c6 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -178,7 +178,7 @@
     }
 
     TypeMask outputType = checkedType.intersection(inputType, classWorld);
-    if (outputType.isEmpty && !outputType.isNullable) {
+    if (outputType.isEmpty) {
       // Intersection of double and integer conflicts (is empty), but JS numbers
       // can be both int and double at the same time.  For example, the input
       // can be a literal double '8.0' that is marked as an integer (because 'is
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
index 324f45f..b4ca9ab 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -9,6 +9,7 @@
 import '../cps_ir/cps_ir_nodes.dart' as cps_ir;
 import '../elements/elements.dart';
 import 'package:js_ast/js_ast.dart' as js;
+import '../js_backend/codegen/glue.dart';
 
 import 'tree_ir_nodes.dart';
 
@@ -48,6 +49,7 @@
  */
 class Builder implements cps_ir.Visitor/*<NodeCallback|Node>*/ {
   final InternalErrorFunction internalError;
+  final Glue glue;
 
   final Map<cps_ir.Primitive, Variable> primitive2variable =
       <cps_ir.Primitive, Variable>{};
@@ -60,17 +62,12 @@
   final Map<cps_ir.Continuation, Label> labels = <cps_ir.Continuation, Label>{};
 
   ExecutableElement currentElement;
-  /// The 'this' Parameter for currentElement or the enclosing method.
+  /// The parameter to be translated to 'this'.  This can either be the receiver
+  /// parameter, the interceptor parameter, or null if the method has neither.
   cps_ir.Parameter thisParameter;
   cps_ir.Continuation returnContinuation;
 
-  Builder parent;
-
-  Builder(this.internalError, [this.parent]);
-
-  Builder createInnerBuilder() {
-    return new Builder(internalError, this);
-  }
+  Builder(this.internalError, this.glue);
 
   /// Variable used in [buildPhiAssignments] as a temporary when swapping
   /// variables.
@@ -84,9 +81,6 @@
   }
 
   Variable getMutableVariable(cps_ir.MutableVariable mutableVariable) {
-    if (!mutable2variable.containsKey(mutableVariable)) {
-      return parent.getMutableVariable(mutableVariable)..isCaptured = true;
-    }
     return mutable2variable[mutableVariable];
   }
 
@@ -128,24 +122,22 @@
     return labels.putIfAbsent(cont, () => new Label());
   }
 
-  Variable addFunctionParameter(cps_ir.Parameter parameter) {
-    return getVariable(parameter);
-  }
-
   FunctionDefinition buildFunction(cps_ir.FunctionDefinition node) {
     currentElement = node.element;
-    if (parent != null) {
-      // Local function's 'this' refers to enclosing method's 'this'
-      thisParameter = parent.thisParameter;
+    List<Variable> parameters = node.parameters.map(getVariable).toList();
+    if (node.interceptorParameter != null) {
+      parameters.insert(0, getVariable(node.receiverParameter));
+      thisParameter = glue.methodUsesReceiverArgument(node.element)
+          ? node.interceptorParameter
+          : node.receiverParameter;
     } else {
-      thisParameter = node.thisParameter;
+      thisParameter = node.receiverParameter;
     }
-    List<Variable> parameters =
-        node.parameters.map(addFunctionParameter).toList();
     returnContinuation = node.returnContinuation;
     phiTempVar = new Variable(node.element, null);
     Statement body = translateExpression(node.body);
-    return new FunctionDefinition(node.element, parameters, body);
+    return new FunctionDefinition(node.element, parameters, body,
+        sourceInformation: node.sourceInformation);
   }
 
   /// Returns a list of variables corresponding to the arguments to a method
@@ -621,38 +613,86 @@
                                          node.sourceInformation);
   }
 
+  List<Expression> insertReceiverArgument(Expression receiver,
+        List<Expression> arguments) {
+    return new List<Expression>.generate(arguments.length + 1,
+        (n) => n == 0 ? receiver : arguments[n - 1],
+        growable: false);
+  }
+
   Expression visitInvokeMethod(cps_ir.InvokeMethod node) {
-    if (node.callingConvention == cps_ir.CallingConvention.OneShotIntercepted) {
-      List<Expression> arguments = new List.generate(
-          1 + node.argumentRefs.length,
-          (n) => getVariableUse(n == 0 ? node.receiverRef : node.argumentRefs[n - 1]),
-          growable: false);
-      return new OneShotInterceptor(node.selector, node.mask, arguments,
-          node.sourceInformation);
+    switch (node.callingConvention) {
+      case cps_ir.CallingConvention.Normal:
+        InvokeMethod invoke = new InvokeMethod(
+            getVariableUse(node.receiverRef),
+            node.selector,
+            node.mask,
+            translateArguments(node.argumentRefs),
+            node.sourceInformation);
+        invoke.receiverIsNotNull = !node.receiver.type.isNullable;
+        return invoke;
+
+      case cps_ir.CallingConvention.Intercepted:
+        List<Expression> arguments = insertReceiverArgument(
+            getVariableUse(node.receiverRef),
+            translateArguments(node.argumentRefs));
+        InvokeMethod invoke = new InvokeMethod(
+            getVariableUse(node.interceptorRef),
+            node.selector,
+            node.mask,
+            arguments,
+            node.sourceInformation);
+        // Sometimes we know the Dart receiver is non-null because it has been
+        // refined, which implies that the JS receiver also can not be null at
+        // the use-site.  Interceptors are not refined, so this information is
+        // not always available on the JS receiver.
+        // Also check the JS receiver's type, however, because sometimes we know
+        // an interceptor is non-null because it intercepts JSNull.
+        invoke.receiverIsNotNull =
+            !node.receiver.type.isNullable ||
+            !node.interceptor.type.isNullable;
+        return invoke;
+
+      case cps_ir.CallingConvention.DummyIntercepted:
+        List<Expression> arguments = insertReceiverArgument(
+            new Constant(new IntConstantValue(0)),
+            translateArguments(node.argumentRefs));
+        InvokeMethod invoke = new InvokeMethod(
+            getVariableUse(node.receiverRef),
+            node.selector,
+            node.mask,
+            arguments,
+            node.sourceInformation);
+        invoke.receiverIsNotNull = !node.receiver.type.isNullable;
+        return invoke;
+
+      case cps_ir.CallingConvention.OneShotIntercepted:
+        List<Expression> arguments = insertReceiverArgument(
+            getVariableUse(node.receiverRef),
+            translateArguments(node.argumentRefs));
+        return new OneShotInterceptor(
+            node.selector,
+            node.mask,
+            arguments,
+            node.sourceInformation);
     }
-    InvokeMethod invoke = new InvokeMethod(
-        getVariableUse(node.receiverRef),
-        node.selector,
-        node.mask,
-        translateArguments(node.argumentRefs),
-        node.sourceInformation);
-    // Sometimes we know the Dart receiver is non-null because it has been
-    // refined, which implies that the JS receiver also can not be null at the
-    // use-site.  Interceptors are not refined, so this information is not
-    // always available on the JS receiver.
-    // Also check the JS receiver's type, however, because sometimes we know an
-    // interceptor is non-null because it intercepts JSNull.
-    invoke.receiverIsNotNull =
-        !node.dartReceiver.type.isNullable ||
-        !node.receiver.type.isNullable;
-    return invoke;
   }
 
   Expression visitInvokeMethodDirectly(cps_ir.InvokeMethodDirectly node) {
-    Expression receiver = getVariableUse(node.receiverRef);
-    List<Expression> arguments = translateArguments(node.argumentRefs);
-    return new InvokeMethodDirectly(receiver, node.target,
-        node.selector, arguments, node.sourceInformation);
+    if (node.interceptorRef != null) {
+      return new InvokeMethodDirectly(getVariableUse(node.interceptorRef),
+          node.target,
+          node.selector,
+          insertReceiverArgument(getVariableUse(node.receiverRef),
+              translateArguments(node.argumentRefs)),
+          node.sourceInformation);
+    } else {
+      return new InvokeMethodDirectly(getVariableUse(node.receiverRef),
+          node.target,
+          node.selector,
+          translateArguments(node.argumentRefs),
+          node.sourceInformation);
+    }
   }
 
   Expression visitTypeCast(cps_ir.TypeCast node) {
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
index ec2e34a..5e09254 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
@@ -654,10 +654,15 @@
 class FunctionDefinition extends Node {
   final ExecutableElement element;
   final List<Variable> parameters;
+  final SourceInformation sourceInformation;
   Statement body;
 
   /// Creates a function definition and updates `writeCount` for [parameters].
-  FunctionDefinition(this.element, this.parameters, this.body) {
+  FunctionDefinition(
+      this.element,
+      this.parameters,
+      this.body,
+      {this.sourceInformation}) {
     for (Variable param in parameters) {
       param.writeCount++; // Being a parameter counts as a write.
     }
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index 71a0fc1..449618b 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -829,12 +829,12 @@
       if (!foundPrivateMember) {
         switch (memberKind) {
           case MemberKind.METHOD:
-            reportMessage(node, MessageKind.METHOD_NOT_FOUND,
+            reportMessage(node, MessageKind.UNDEFINED_METHOD,
                 {'className': receiverType.name, 'memberName': name},
                 isHint: isHint);
             break;
           case MemberKind.OPERATOR:
-            reportMessage(node, MessageKind.OPERATOR_NOT_FOUND,
+            reportMessage(node, MessageKind.UNDEFINED_OPERATOR,
                 {'className': receiverType.name, 'memberName': name},
                 isHint: isHint);
             break;
@@ -842,7 +842,8 @@
             if (lookupMemberSignature(memberName.setter, interface) != null) {
               // A setter is present so warn explicitly about the missing
               // getter.
-              reportMessage(node, MessageKind.GETTER_NOT_FOUND,
+              reportMessage(node,
+                  MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER,
                   {'className': receiverType.name, 'memberName': name},
                   isHint: isHint);
             } else if (name == 'await') {
@@ -857,13 +858,13 @@
               }
               reportMessage(node, kind, arguments, isHint: isHint);
             } else {
-              reportMessage(node, MessageKind.MEMBER_NOT_FOUND,
+              reportMessage(node, MessageKind.UNDEFINED_GETTER,
                   {'className': receiverType.name, 'memberName': name},
                   isHint: isHint);
             }
             break;
           case MemberKind.SETTER:
-            reportMessage(node, MessageKind.SETTER_NOT_FOUND,
+            reportMessage(node, MessageKind.UNDEFINED_SETTER,
                 {'className': receiverType.name, 'memberName': name},
                 isHint: isHint);
             break;
diff --git a/pkg/compiler/lib/src/types/container_type_mask.dart b/pkg/compiler/lib/src/types/container_type_mask.dart
index 5f22462..c38a03a 100644
--- a/pkg/compiler/lib/src/types/container_type_mask.dart
+++ b/pkg/compiler/lib/src/types/container_type_mask.dart
@@ -61,7 +61,7 @@
 
   TypeMask intersection(TypeMask other, ClassWorld classWorld) {
     TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
-    if (forwardIntersection.isEmpty) return forwardIntersection;
+    if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable
         ? nullable()
         : nonNullable();
@@ -72,7 +72,7 @@
       return this;
     } else if (equalsDisregardNull(other)) {
       return other.isNullable ? other : this;
-    } else if (other.isEmpty) {
+    } else if (other.isEmptyOrNull) {
       return other.isNullable ? this.nullable() : this;
     } else if (other.isContainer
                && elementType != null
diff --git a/pkg/compiler/lib/src/types/dictionary_type_mask.dart b/pkg/compiler/lib/src/types/dictionary_type_mask.dart
index 27419779..cba828f 100644
--- a/pkg/compiler/lib/src/types/dictionary_type_mask.dart
+++ b/pkg/compiler/lib/src/types/dictionary_type_mask.dart
@@ -59,7 +59,7 @@
 
   TypeMask intersection(TypeMask other, ClassWorld classWorld) {
     TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
-    if (forwardIntersection.isEmpty) return forwardIntersection;
+    if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable
         ? nullable()
         : nonNullable();
@@ -70,7 +70,7 @@
       return this;
     } else if (equalsDisregardNull(other)) {
       return other.isNullable ? other : this;
-    } else if (other.isEmpty) {
+    } else if (other.isEmptyOrNull) {
       return other.isNullable ? this.nullable() : this;
     } else if (other.isDictionary) {
       TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
@@ -115,4 +115,4 @@
     return
         'Dictionary mask: [$keyType/$valueType with $typeMap] type: $forwardTo';
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/types/flat_type_mask.dart b/pkg/compiler/lib/src/types/flat_type_mask.dart
index 914e673..5939147 100644
--- a/pkg/compiler/lib/src/types/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/types/flat_type_mask.dart
@@ -67,7 +67,9 @@
         () => new FlatTypeMask.internal(base, flags));
   }
 
-  bool get isEmpty => (flags >> 1) == EMPTY;
+  bool get isEmpty => isEmptyOrNull && !isNullable;
+  bool get isNull => isEmptyOrNull && isNullable;
+  bool get isEmptyOrNull => (flags >> 1) == EMPTY;
   bool get isExact => (flags >> 1) == EXACT;
   bool get isNullable => (flags & 1) != 0;
 
@@ -94,7 +96,7 @@
 
   bool contains(ClassElement type, ClassWorld classWorld) {
     assert(type.isDeclaration);
-    if (isEmpty) {
+    if (isEmptyOrNull) {
       return false;
     } else if (identical(base, type)) {
       return true;
@@ -137,10 +139,9 @@
   }
 
   bool isInMask(TypeMask other, ClassWorld classWorld) {
-    // null is treated separately, so the empty mask might still contain it.
-    if (isEmpty) return isNullable ? other.isNullable : true;
+    if (isEmptyOrNull) return isNullable ? other.isNullable : true;
     // The empty type contains no classes.
-    if (other.isEmpty) return false;
+    if (other.isEmptyOrNull) return false;
     // Quick check whether to handle null.
     if (isNullable && !other.isNullable) return false;
     other = TypeMask.nonForwardingMask(other);
@@ -215,7 +216,7 @@
 
   bool satisfies(ClassElement cls, ClassWorld classWorld) {
     assert(cls.isDeclaration);
-    if (isEmpty) return false;
+    if (isEmptyOrNull) return false;
     if (classWorld.isSubtypeOf(base, cls)) return true;
     return false;
   }
@@ -225,7 +226,7 @@
    * otherwise returns `null`.  This method is conservative.
    */
   ClassElement singleClass(ClassWorld classWorld) {
-    if (isEmpty) return null;
+    if (isEmptyOrNull) return null;
     if (isNullable) return null;  // It is Null and some other class.
     if (isExact) {
       return base;
@@ -241,7 +242,7 @@
    * Returns whether or not this type mask contains all types.
    */
   bool containsAll(ClassWorld classWorld) {
-    if (isEmpty || isExact) return false;
+    if (isEmptyOrNull || isExact) return false;
     return identical(base, classWorld.objectClass);
   }
 
@@ -251,9 +252,9 @@
     assert(TypeMask.assertIsNormalized(other, classWorld));
     if (other is! FlatTypeMask) return other.union(this, classWorld);
     FlatTypeMask flatOther = other;
-    if (isEmpty) {
+    if (isEmptyOrNull) {
       return isNullable ? flatOther.nullable() : flatOther;
-    } else if (flatOther.isEmpty) {
+    } else if (flatOther.isEmptyOrNull) {
       return flatOther.isNullable ? nullable() : this;
     } else if (base == flatOther.base) {
       return unionSame(flatOther, classWorld);
@@ -339,9 +340,9 @@
     assert(TypeMask.assertIsNormalized(this, classWorld));
     assert(TypeMask.assertIsNormalized(other, classWorld));
     FlatTypeMask flatOther = other;
-    if (isEmpty) {
+    if (isEmptyOrNull) {
       return flatOther.isNullable ? this : nonNullable();
-    } else if (flatOther.isEmpty) {
+    } else if (flatOther.isEmptyOrNull) {
       return isNullable ? flatOther : other.nonNullable();
     } else if (base == flatOther.base) {
       return intersectionSame(flatOther, classWorld);
@@ -363,7 +364,7 @@
     FlatTypeMask flatOther = other;
 
     if (isNullable && flatOther.isNullable) return false;
-    if (isEmpty || flatOther.isEmpty) return true;
+    if (isEmptyOrNull || flatOther.isEmptyOrNull) return true;
     if (base == flatOther.base) return false;
     if (isExact && flatOther.isExact) return true;
 
@@ -539,8 +540,8 @@
   bool canHit(Element element, Selector selector, ClassWorld classWorld) {
     Backend backend = classWorld.backend;
     assert(element.name == selector.name);
-    if (isEmpty) {
-      if (!isNullable) return false;
+    if (isEmpty) return false;
+    if (isNull) {
       return hasElementIn(backend.nullImplementation, selector, element);
     }
 
@@ -603,7 +604,7 @@
   bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld) {
     // A call on an empty type mask is either dead code, or a call on
     // `null`.
-    if (isEmpty) return false;
+    if (isEmptyOrNull) return false;
     // A call on an exact mask for an abstract class is dead code.
     if (isExact && base.isAbstract) return false;
     // If the receiver is guaranteed to have a member that
@@ -684,7 +685,7 @@
   Element locateSingleElement(Selector selector,
                               TypeMask mask,
                               Compiler compiler) {
-    if (isEmpty) return null;
+    if (isEmptyOrNull) return null;
     Iterable<Element> targets =
         compiler.world.allFunctions.filter(selector, mask);
     if (targets.length != 1) return null;
@@ -709,7 +710,7 @@
   }
 
   String toString() {
-    if (isEmpty) return isNullable ? '[null]' : '[empty]';
+    if (isEmptyOrNull) return isNullable ? '[null]' : '[empty]';
     StringBuffer buffer = new StringBuffer();
     if (isNullable) buffer.write('null|');
     if (isExact) buffer.write('exact=');
diff --git a/pkg/compiler/lib/src/types/forwarding_type_mask.dart b/pkg/compiler/lib/src/types/forwarding_type_mask.dart
index a4400c6..6212bb8 100644
--- a/pkg/compiler/lib/src/types/forwarding_type_mask.dart
+++ b/pkg/compiler/lib/src/types/forwarding_type_mask.dart
@@ -14,8 +14,10 @@
 
   ForwardingTypeMask();
 
+  bool get isEmptyOrNull => forwardTo.isEmptyOrNull;
   bool get isEmpty => forwardTo.isEmpty;
   bool get isNullable => forwardTo.isNullable;
+  bool get isNull => forwardTo.isNull;
   bool get isExact => forwardTo.isExact;
 
   bool get isUnion => false;
@@ -78,7 +80,7 @@
       return this;
     } else if (equalsDisregardNull(other)) {
       return other.isNullable ? other : this;
-    } else if (other.isEmpty) {
+    } else if (other.isEmptyOrNull) {
       return other.isNullable ? this.nullable() : this;
     }
     return forwardTo.union(other, classWorld);
diff --git a/pkg/compiler/lib/src/types/map_type_mask.dart b/pkg/compiler/lib/src/types/map_type_mask.dart
index 39ed50b..52fe4a2 100644
--- a/pkg/compiler/lib/src/types/map_type_mask.dart
+++ b/pkg/compiler/lib/src/types/map_type_mask.dart
@@ -64,7 +64,7 @@
 
   TypeMask intersection(TypeMask other, ClassWorld classWorld) {
     TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
-    if (forwardIntersection.isEmpty) return forwardIntersection;
+    if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable
         ? nullable()
         : nonNullable();
@@ -75,7 +75,7 @@
       return this;
     } else if (equalsDisregardNull(other)) {
       return other.isNullable ? other : this;
-    } else if (other.isEmpty) {
+    } else if (other.isEmptyOrNull) {
       return other.isNullable ? this.nullable() : this;
     } else if (other.isMap &&
                keyType != null &&
diff --git a/pkg/compiler/lib/src/types/type_mask.dart b/pkg/compiler/lib/src/types/type_mask.dart
index 736df0d..2129fa9 100644
--- a/pkg/compiler/lib/src/types/type_mask.dart
+++ b/pkg/compiler/lib/src/types/type_mask.dart
@@ -204,7 +204,7 @@
   static String getNotNormalizedReason(TypeMask mask, ClassWorld classWorld) {
     mask = nonForwardingMask(mask);
     if (mask is FlatTypeMask) {
-      if (mask.isEmpty) return null;
+      if (mask.isEmptyOrNull) return null;
       if (mask.isExact) {
         if (!classWorld.isInstantiated(mask.base)) {
           return 'Exact ${mask.base} is not instantiated.';
@@ -247,8 +247,20 @@
    */
   TypeMask nonNullable();
 
+  /// Whether nothing matches this mask, not even null.
   bool get isEmpty;
+
+  /// Whether null is a valid value of this mask.
   bool get isNullable;
+
+  /// Whether the only possible value in this mask is Null.
+  bool get isNull;
+
+  /// Whether [isEmpty] or [isNull] is true.
+  bool get isEmptyOrNull;
+
+  /// Whether this mask only includes instances of an exact class, and none of
+  /// it's subclasses or subtypes.
   bool get isExact;
 
   /// Returns true if this mask is a union type.
diff --git a/pkg/compiler/lib/src/types/union_type_mask.dart b/pkg/compiler/lib/src/types/union_type_mask.dart
index 6166349..9cd5bcb 100644
--- a/pkg/compiler/lib/src/types/union_type_mask.dart
+++ b/pkg/compiler/lib/src/types/union_type_mask.dart
@@ -43,7 +43,7 @@
       if (mask.isUnion) {
         UnionTypeMask union = mask;
         unionOfHelper(union.disjointMasks, disjoint, classWorld);
-      } else if (mask.isEmpty && !mask.isNullable) {
+      } else if (mask.isEmpty) {
         continue;
       } else {
         FlatTypeMask flatMask = mask;
@@ -192,7 +192,9 @@
     return new UnionTypeMask._internal(newIterable);
   }
 
+  bool get isEmptyOrNull => false;
   bool get isEmpty => false;
+  bool get isNull => false;
   bool get isNullable => disjointMasks.any((e) => e.isNullable);
   bool get isExact => false;
   bool get isUnion => true;
diff --git a/pkg/compiler/lib/src/types/value_type_mask.dart b/pkg/compiler/lib/src/types/value_type_mask.dart
index 72c5af2..ffe1e3b 100644
--- a/pkg/compiler/lib/src/types/value_type_mask.dart
+++ b/pkg/compiler/lib/src/types/value_type_mask.dart
@@ -31,7 +31,7 @@
 
   TypeMask intersection(TypeMask other, ClassWorld classWorld) {
     TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
-    if (forwardIntersection.isEmpty) return forwardIntersection;
+    if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable
         ? nullable()
         : nonNullable();
@@ -46,4 +46,4 @@
   String toString() {
     return 'Value mask: [${value.unparse()}] type: $forwardTo';
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index 3790a03..bf2f31c 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.dart
@@ -221,10 +221,10 @@
       EnumSet<Instantiation> mask,
       {bool strict: false}) {
 
-    ForEach wrapper(ClassElement cls) {
-      return predicate(cls) ? ForEach.STOP : ForEach.CONTINUE;
+    IterationStep wrapper(ClassElement cls) {
+      return predicate(cls) ? IterationStep.STOP : IterationStep.CONTINUE;
     }
-    return forEachSubclass(wrapper, mask, strict: strict) == ForEach.STOP;
+    return forEachSubclass(wrapper, mask, strict: strict) == IterationStep.STOP;
   }
 
   /// Applies [f] to each subclass of [cls] matching the criteria specified by
@@ -241,31 +241,31 @@
   /// continues. The return value of the function is either [ForEach.STOP], if
   /// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
   /// the end.
-  ForEach forEachSubclass(
+  IterationStep forEachSubclass(
       ForEachFunction f,
       EnumSet<Instantiation> mask,
       {bool strict: false}) {
-    ForEach forEach;
+    IterationStep nextStep;
     if (!strict && mask.intersects(_mask)) {
-      forEach = f(cls);
+      nextStep = f(cls);
     }
     // Interpret `forEach == null` as `forEach == ForEach.CONTINUE`.
-    forEach ??= ForEach.CONTINUE;
+    nextStep ??= IterationStep.CONTINUE;
 
-    if (forEach == ForEach.CONTINUE) {
+    if (nextStep == IterationStep.CONTINUE) {
       if (mask.contains(Instantiation.UNINSTANTIATED) || isInstantiated) {
         for (ClassHierarchyNode subclass in _directSubclasses) {
-          ForEach subForEach = subclass.forEachSubclass(f, mask);
-          if (subForEach == ForEach.STOP) {
+          IterationStep subForEach = subclass.forEachSubclass(f, mask);
+          if (subForEach == IterationStep.STOP) {
             return subForEach;
           }
         }
       }
     }
-    if (forEach == ForEach.STOP) {
-      return forEach;
+    if (nextStep == IterationStep.STOP) {
+      return nextStep;
     }
-    return ForEach.CONTINUE;
+    return IterationStep.CONTINUE;
   }
 
   /// Returns the most specific subclass of [cls] (including [cls]) that is
@@ -425,7 +425,23 @@
   final ClassHierarchyNode node;
   ClassElement _leastUpperInstantiatedSubtype;
 
-  List<ClassHierarchyNode> _directSubtypes;
+  /// A list of the class hierarchy nodes for the subtypes that declare a
+  /// subtype relationship to [cls] either directly or indirectly.
+  ///
+  /// For instance
+  ///
+  ///     class A {}
+  ///     class B extends A {}
+  ///     class C implements B {}
+  ///     class D implements A {}
+  ///     class E extends D {}
+  ///
+  /// The class hierarchy nodes for classes `C` and `D` are in [_subtypes]. `C`
+  /// because it implements `A` through `B` and `D` because it implements `A`
+  /// directly. `E` also implements `A` through its extension of `D` and it is
+  /// therefore included through the class hierarchy node for `D`.
+  ///
+  List<ClassHierarchyNode> _subtypes;
 
   ClassSet(this.node);
 
@@ -434,8 +450,8 @@
   /// Returns the number of directly instantiated subtypes of [cls].
   int get instantiatedSubtypeCount {
     int count = node.instantiatedSubclassCount;
-    if (_directSubtypes != null) {
-      for (ClassHierarchyNode subtypeNode in _directSubtypes) {
+    if (_subtypes != null) {
+      for (ClassHierarchyNode subtypeNode in _subtypes) {
         if (subtypeNode.isDirectlyInstantiated) {
           count++;
         }
@@ -448,8 +464,8 @@
   /// Returns `true` if all instantiated subtypes of [cls] are subclasses of
   /// [cls].
   bool get hasOnlyInstantiatedSubclasses {
-    if (_directSubtypes != null) {
-      for (ClassHierarchyNode subtypeNode in _directSubtypes) {
+    if (_subtypes != null) {
+      for (ClassHierarchyNode subtypeNode in _subtypes) {
         if (subtypeNode.isInstantiated) {
           return false;
         }
@@ -495,7 +511,7 @@
   Iterable<ClassElement> subtypesByMask(
       EnumSet<Instantiation> mask,
       {bool strict: false}) {
-    if (_directSubtypes == null) {
+    if (_subtypes == null) {
       return node.subclassesByMask(
           mask,
           strict: strict);
@@ -534,7 +550,7 @@
   /// continues. The return value of the function is either [ForEach.STOP], if
   /// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
   /// the end.
-  ForEach forEachSubclass(
+  IterationStep forEachSubclass(
       ForEachFunction f,
       EnumSet<Instantiation> mask,
       {bool strict: false}) {
@@ -553,10 +569,10 @@
       EnumSet<Instantiation> mask,
       {bool strict: false}) {
 
-    ForEach wrapper(ClassElement cls) {
-      return predicate(cls) ? ForEach.STOP : ForEach.CONTINUE;
+    IterationStep wrapper(ClassElement cls) {
+      return predicate(cls) ? IterationStep.STOP : IterationStep.CONTINUE;
     }
-    return forEachSubtype(wrapper, mask, strict: strict) == ForEach.STOP;
+    return forEachSubtype(wrapper, mask, strict: strict) == IterationStep.STOP;
   }
 
   /// Applies [f] to each subtype of [cls] matching the criteria specified by
@@ -573,22 +589,22 @@
   /// continues. The return value of the function is either [ForEach.STOP], if
   /// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
   /// the end.
-  ForEach forEachSubtype(
+  IterationStep forEachSubtype(
       ForEachFunction f,
       EnumSet<Instantiation> mask,
       {bool strict: false}) {
-    ForEach forEach = node.forEachSubclass(f, mask, strict: strict);
-    forEach ??= ForEach.CONTINUE;
-    if (forEach == ForEach.CONTINUE && _directSubtypes != null) {
-      for (ClassHierarchyNode subclass in _directSubtypes) {
-        ForEach subForEach = subclass.forEachSubclass(f, mask);
-        if (subForEach == ForEach.STOP) {
+    IterationStep nextStep =
+        node.forEachSubclass(f, mask, strict: strict) ?? IterationStep.CONTINUE;
+    if (nextStep == IterationStep.CONTINUE && _subtypes != null) {
+      for (ClassHierarchyNode subclass in _subtypes) {
+        IterationStep subForEach = subclass.forEachSubclass(f, mask);
+        if (subForEach == IterationStep.STOP) {
           return subForEach;
         }
       }
     }
-    assert(forEach != ForEach.SKIP_SUBCLASSES);
-    return forEach;
+    assert(nextStep != IterationStep.SKIP_SUBCLASSES);
+    return nextStep;
   }
 
   /// Adds [subtype] as a subtype of [cls].
@@ -596,13 +612,13 @@
     if (node.contains(subtype.cls)) {
       return;
     }
-    if (_directSubtypes == null) {
-      _directSubtypes = <ClassHierarchyNode>[subtype];
+    if (_subtypes == null) {
+      _subtypes = <ClassHierarchyNode>[subtype];
     } else {
       int hierarchyDepth = subtype.cls.hierarchyDepth;
       List<ClassHierarchyNode> newSubtypes = <ClassHierarchyNode>[];
       bool added = false;
-      for (ClassHierarchyNode otherSubtype in _directSubtypes) {
+      for (ClassHierarchyNode otherSubtype in _subtypes) {
         int otherHierarchyDepth = otherSubtype.cls.hierarchyDepth;
         if (hierarchyDepth == otherHierarchyDepth) {
           if (subtype == otherSubtype) {
@@ -637,7 +653,7 @@
       if (!added) {
         newSubtypes.add(subtype);
       }
-      _directSubtypes = newSubtypes;
+      _subtypes = newSubtypes;
     }
   }
 
@@ -655,14 +671,14 @@
     if (node.isDirectlyInstantiated) {
       return cls;
     }
-    if (_directSubtypes == null) {
+    if (_subtypes == null) {
       return node.getLubOfInstantiatedSubclasses();
     }
     ClassHierarchyNode subtype;
     if (node.isInstantiated) {
       subtype = node;
     }
-    for (ClassHierarchyNode subnode in _directSubtypes) {
+    for (ClassHierarchyNode subnode in _subtypes) {
       if (subnode.isInstantiated) {
         if (subtype == null) {
           subtype = subnode;
@@ -682,8 +698,8 @@
     sb.write('[\n');
     node.printOn(sb, '  ');
     sb.write('\n');
-    if (_directSubtypes != null) {
-      for (ClassHierarchyNode node in _directSubtypes) {
+    if (_subtypes != null) {
+      for (ClassHierarchyNode node in _subtypes) {
         node.printOn(sb, '  ');
         sb.write('\n');
       }
@@ -841,7 +857,7 @@
     }
     if (hierarchyNodes == null) {
       // Start iterating through subtypes.
-      hierarchyNodes = iterable.subtypeSet._directSubtypes.iterator;
+      hierarchyNodes = iterable.subtypeSet._subtypes.iterator;
     }
     while (hierarchyNodes.moveNext()) {
       elements = hierarchyNodes.current.subclassesByMask(mask).iterator;
@@ -856,7 +872,7 @@
 /// Enum values returned from the [ForEachFunction] provided to the `forEachX`
 /// functions of [ClassHierarchyNode] and [ClassSet]. The value is used to
 /// control the continued iteration.
-enum ForEach {
+enum IterationStep {
   /// Iteration continues.
   CONTINUE,
   /// Iteration stops immediately.
@@ -868,4 +884,4 @@
 /// Visiting function used for the `forEachX` functions of [ClassHierarchyNode]
 /// and [ClassSet]. The return value controls the continued iteration. If `null`
 /// is returned, iteration continues to the end.
-typedef ForEach ForEachFunction(ClassElement cls);
+typedef IterationStep ForEachFunction(ClassElement cls);
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index da08fb6..3e382e1 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -99,7 +99,8 @@
 
   /// Applies [f] to each live class that extend [cls] _not_ including [cls]
   /// itself.
-  void forEachStrictSubclassOf(ClassElement cls, ForEach f(ClassElement cls));
+  void forEachStrictSubclassOf(ClassElement cls,
+                               IterationStep f(ClassElement cls));
 
   /// Returns `true` if [predicate] applies to any live class that extend [cls]
   /// _not_ including [cls] itself.
@@ -119,7 +120,8 @@
 
   /// Applies [f] to each live class that implements [cls] _not_ including [cls]
   /// itself.
-  void forEachStrictSubtypeOf(ClassElement cls, ForEach f(ClassElement cls));
+  void forEachStrictSubtypeOf(ClassElement cls,
+                              IterationStep f(ClassElement cls));
 
   /// Returns `true` if [predicate] applies to any live class that implements
   /// [cls] _not_ including [cls] itself.
@@ -282,7 +284,8 @@
 
   /// Applies [f] to each live class that extend [cls] _not_ including [cls]
   /// itself.
-  void forEachStrictSubclassOf(ClassElement cls, ForEach f(ClassElement cls)) {
+  void forEachStrictSubclassOf(ClassElement cls,
+                               IterationStep f(ClassElement cls)) {
     ClassHierarchyNode subclasses = _classHierarchyNodes[cls.declaration];
     if (subclasses == null) return;
     subclasses.forEachSubclass(
@@ -336,7 +339,8 @@
 
   /// Applies [f] to each live class that implements [cls] _not_ including [cls]
   /// itself.
-  void forEachStrictSubtypeOf(ClassElement cls, ForEach f(ClassElement cls)) {
+  void forEachStrictSubtypeOf(ClassElement cls,
+                              IterationStep f(ClassElement cls)) {
     ClassSet classSet = _classSets[cls.declaration];
     if (classSet == null) return;
     classSet.forEachSubtype(
diff --git a/pkg/dart_messages/bin/publish.dart b/pkg/dart_messages/bin/publish.dart
index d6e3f87..48f0c30 100644
--- a/pkg/dart_messages/bin/publish.dart
+++ b/pkg/dart_messages/bin/publish.dart
@@ -172,6 +172,19 @@
   });
 }
 
+String camlToAllCaps(String input) {
+  StringBuffer out = new StringBuffer();
+  for (int i = 0; i < input.length; i++) {
+    String c = input[i];
+    if (c.toUpperCase() == c) {
+      out.write("_$c");
+    } else {
+      out.write(c.toUpperCase());
+    }
+  }
+  return out.toString();
+}
+
 /// Emits the messages in analyzer format.
 ///
 /// Messages are encoded as instances of `ErrorCode` classes where the
@@ -200,21 +213,25 @@
       "show ParserErrorCode;");
   input.forEach((name, message) {
     if (!message.usedBy.contains(Platform.analyzer)) return;
+    List<Category> categories = message.categories;
+    bool hasMultipleCategories = categories.length != 1;
+    for (Category category in categories) {
+      String className = category.name + "Code";
+      String analyzerName =
+          hasMultipleCategories ? "$name${camlToAllCaps(category.name)}" : name;
+      out.writeln();
+      out.writeln("const $className $analyzerName = const $className(");
+      out.writeln("    '$name',");
 
-    Category category = message.category;
-    String className = category.name + "Code";
-    out.writeln();
-    out.writeln("const $className $name = const $className(");
-    out.writeln("    '$name',");
-
-    String template = message.template;
-    List holeOrder = message.templateHoleOrder;
-    String analyzerTemplate = convertToAnalyzerTemplate(template, holeOrder);
-    out.write("    ");
-    out.write(escapeString(analyzerTemplate));
-    out.write(",\n    ");
-    out.write(escapeString(message.howToFix));
-    out.writeln(");  // Generated. Don't edit.");
+      String template = message.template;
+      List holeOrder = message.templateHoleOrder;
+      String analyzerTemplate = convertToAnalyzerTemplate(template, holeOrder);
+      out.write("    ");
+      out.write(escapeString(analyzerTemplate));
+      out.write(",\n    ");
+      out.write(escapeString(message.howToFix));
+      out.writeln(");  // Generated. Don't edit.");
+    }
   });
 
   new io.File(outPath).writeAsStringSync(out.toString());
diff --git a/pkg/dart_messages/lib/generated/shared_messages.json b/pkg/dart_messages/lib/generated/shared_messages.json
index a40bc3f..7693f4a 100644
--- a/pkg/dart_messages/lib/generated/shared_messages.json
+++ b/pkg/dart_messages/lib/generated/shared_messages.json
@@ -2,7 +2,9 @@
   "exampleMessage": {
     "id": "use an Id generated by bin/message_id.dart",
     "subId": 0,
-    "category": "AnalysisOptionsError",
+    "categories": [
+      "AnalysisOptionsError"
+    ],
     "template": "#use #named #arguments",
     "templateHoleOrder": [
       "arguments",
@@ -23,7 +25,9 @@
   "CONST_CONSTRUCTOR_OR_FACTORY_WITH_BODY": {
     "id": "LGJGHW",
     "subId": 0,
-    "category": "ParserError",
+    "categories": [
+      "ParserError"
+    ],
     "template": "Const constructor or factory can't have a body.",
     "templateHoleOrder": null,
     "howToFix": "Remove the 'const' keyword or the body.",
@@ -39,7 +43,9 @@
   "CONST_CONSTRUCTOR_WITH_BODY": {
     "id": "LGJGHW",
     "subId": 1,
-    "category": "ParserError",
+    "categories": [
+      "ParserError"
+    ],
     "template": "Const constructor can't have a body.",
     "templateHoleOrder": null,
     "howToFix": "Try removing the 'const' keyword or the body.",
@@ -54,7 +60,9 @@
   "CONST_FACTORY": {
     "id": "LGJGHW",
     "subId": 2,
-    "category": "ParserError",
+    "categories": [
+      "ParserError"
+    ],
     "template": "Only redirecting factory constructors can be declared to be 'const'.",
     "templateHoleOrder": null,
     "howToFix": "Try removing the 'const' keyword or replacing the body with '=' followed by a valid target.",
@@ -69,7 +77,9 @@
   "EXTRANEOUS_MODIFIER": {
     "id": "GRKIQE",
     "subId": 0,
-    "category": "ParserError",
+    "categories": [
+      "ParserError"
+    ],
     "template": "Can't have modifier '#{modifier}' here.",
     "templateHoleOrder": null,
     "howToFix": "Try removing '#{modifier}'.",
@@ -99,7 +109,9 @@
   "EXTRANEOUS_MODIFIER_REPLACE": {
     "id": "GRKIQE",
     "subId": 1,
-    "category": "ParserError",
+    "categories": [
+      "ParserError"
+    ],
     "template": "Can't have modifier '#{modifier}' here.",
     "templateHoleOrder": null,
     "howToFix": "Try replacing modifier '#{modifier}' with 'var', 'final', or a type.",
@@ -117,8 +129,10 @@
   "CONST_CLASS": {
     "id": "GRKIQE",
     "subId": 2,
-    "category": "ParserError",
-    "template": "Classes can't be declared to be 'const'",
+    "categories": [
+      "ParserError"
+    ],
+    "template": "Classes can't be declared to be 'const'.",
     "templateHoleOrder": null,
     "howToFix": "Try removing the 'const' keyword or moving to the class' constructor(s).",
     "options": null,
@@ -132,8 +146,10 @@
   "CONST_METHOD": {
     "id": "GRKIQE",
     "subId": 3,
-    "category": "ParserError",
-    "template": "Getters, setters and methods can't be declared to be 'const'",
+    "categories": [
+      "ParserError"
+    ],
+    "template": "Getters, setters and methods can't be declared to be 'const'.",
     "templateHoleOrder": null,
     "howToFix": "Try removing the 'const' keyword.",
     "options": null,
@@ -152,8 +168,10 @@
   "CONST_ENUM": {
     "id": "GRKIQE",
     "subId": 4,
-    "category": "ParserError",
-    "template": "Enums can't be declared to be 'const'",
+    "categories": [
+      "ParserError"
+    ],
+    "template": "Enums can't be declared to be 'const'.",
     "templateHoleOrder": null,
     "howToFix": "Try removing the 'const' keyword.",
     "options": null,
@@ -167,8 +185,10 @@
   "CONST_TYPEDEF": {
     "id": "GRKIQE",
     "subId": 5,
-    "category": "ParserError",
-    "template": "Type aliases can't be declared to be 'const'",
+    "categories": [
+      "ParserError"
+    ],
+    "template": "Type aliases can't be declared to be 'const'.",
     "templateHoleOrder": null,
     "howToFix": "Try removing the 'const' keyword.",
     "options": null,
@@ -182,8 +202,10 @@
   "CONST_AND_FINAL": {
     "id": "GRKIQE",
     "subId": 6,
-    "category": "ParserError",
-    "template": "Members can't be declared to be both 'const' and 'final'",
+    "categories": [
+      "ParserError"
+    ],
+    "template": "Members can't be declared to be both 'const' and 'final'.",
     "templateHoleOrder": null,
     "howToFix": "Try removing either the 'const' or 'final' keyword.",
     "options": null,
@@ -200,8 +222,10 @@
   "CONST_AND_VAR": {
     "id": "GRKIQE",
     "subId": 7,
-    "category": "ParserError",
-    "template": "Members can't be declared to be both 'const' and 'var'",
+    "categories": [
+      "ParserError"
+    ],
+    "template": "Members can't be declared to be both 'const' and 'var'.",
     "templateHoleOrder": null,
     "howToFix": "Try removing either the 'const' or 'var' keyword.",
     "options": null,
@@ -218,7 +242,9 @@
   "CLASS_IN_CLASS": {
     "id": "DOTHQH",
     "subId": 0,
-    "category": "ParserError",
+    "categories": [
+      "ParserError"
+    ],
     "template": "Classes can't be declared inside other classes.",
     "templateHoleOrder": null,
     "howToFix": "Try moving the class to the top-level.",
@@ -233,8 +259,10 @@
   "CONSTRUCTOR_WITH_RETURN_TYPE": {
     "id": "VOJBWY",
     "subId": 0,
-    "category": "ParserError",
-    "template": "Constructors can't have a return type",
+    "categories": [
+      "ParserError"
+    ],
+    "template": "Constructors can't have a return type.",
     "templateHoleOrder": null,
     "howToFix": "Try removing the return type.",
     "options": null,
@@ -249,7 +277,9 @@
   "MISSING_EXPRESSION_IN_THROW": {
     "id": "FTGGMJ",
     "subId": 0,
-    "category": "ParserError",
+    "categories": [
+      "ParserError"
+    ],
     "template": "Missing expression after 'throw'.",
     "templateHoleOrder": null,
     "howToFix": "Did you mean 'rethrow'?",
@@ -266,8 +296,10 @@
   "RETHROW_OUTSIDE_CATCH": {
     "id": "MWETLC",
     "subId": 0,
-    "category": "CompileTimeError",
-    "template": "Rethrow must be inside of catch clause",
+    "categories": [
+      "CompileTimeError"
+    ],
+    "template": "Rethrow must be inside of catch clause.",
     "templateHoleOrder": null,
     "howToFix": "Try moving the expression into a catch clause, or using a 'throw' expression.",
     "options": null,
@@ -282,7 +314,9 @@
   "RETURN_IN_GENERATIVE_CONSTRUCTOR": {
     "id": "UOTDQH",
     "subId": 0,
-    "category": "CompileTimeError",
+    "categories": [
+      "CompileTimeError"
+    ],
     "template": "Constructors can't return values.",
     "templateHoleOrder": null,
     "howToFix": "Try removing the return statement or using a factory constructor.",
@@ -298,10 +332,12 @@
   "RETURN_IN_GENERATOR": {
     "id": "JRUTUQ",
     "subId": 0,
-    "category": "CompileTimeError",
+    "categories": [
+      "CompileTimeError"
+    ],
     "template": "Can't return a value from a generator function (using the '#{modifier}' modifier).",
     "templateHoleOrder": null,
-    "howToFix": "Try removing the value, replacing 'return' with 'yield' or changing the method body modifier",
+    "howToFix": "Try removing the value, replacing 'return' with 'yield' or changing the method body modifier.",
     "options": null,
     "usedBy": [
       "Platform.analyzer",
@@ -311,5 +347,359 @@
       "        foo() async* { return 0; }\n        main() => foo();\n        ",
       "        foo() sync* { return 0; }\n        main() => foo();\n        "
     ]
+  },
+  "NOT_ASSIGNABLE": {
+    "id": "FYQYXB",
+    "subId": 0,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "'#{fromType}' is not assignable to '#{toType}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js"
+    ],
+    "examples": null
+  },
+  "FORIN_NOT_ASSIGNABLE": {
+    "id": "FYQYXB",
+    "subId": 1,
+    "categories": [
+      "Hint"
+    ],
+    "template": "The element type '#{currentType}' of '#{expressionType}' is not assignable to '#{elementType}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js"
+    ],
+    "examples": [
+      "        main() {\n          List<int> list = <int>[1, 2];\n          for (String x in list) x;\n        }\n        "
+    ]
+  },
+  "RETURN_OF_INVALID_TYPE": {
+    "id": "FYQYXB",
+    "subId": 2,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "The return type '#{fromType}' is not a '#{toType}', as defined by the method '#{method}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "int foo() => 'foo'; main() { foo(); }"
+    ]
+  },
+  "ARGUMENT_TYPE_NOT_ASSIGNABLE": {
+    "id": "FYQYXB",
+    "subId": 3,
+    "categories": [
+      "Hint",
+      "StaticWarning"
+    ],
+    "template": "The argument type '#{fromType}' cannot be assigned to the parameter type '#{toType}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "foo(int x) => x; main() { foo('bar'); }"
+    ]
+  },
+  "CANNOT_RESOLVE": {
+    "id": "ERUSKD",
+    "subId": 0,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "Can't resolve '#{name}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js"
+    ],
+    "examples": null
+  },
+  "UNDEFINED_METHOD": {
+    "id": "ERUSKD",
+    "subId": 1,
+    "categories": [
+      "StaticTypeWarning",
+      "Hint"
+    ],
+    "template": "The method '#{memberName}' is not defined for the class '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js",
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "        class A {\n          foo() { bar(); }\n        }\n        main() { new A().foo(); }\n        "
+    ]
+  },
+  "UNDEFINED_METHOD_WITH_CONSTRUCTOR": {
+    "id": "ERUSKD",
+    "subId": 2,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "The method '#{memberName}' is not defined for the class '#{className}', but a constructor with that name is defined.",
+    "templateHoleOrder": null,
+    "howToFix": "Try adding 'new' or 'const' to invoke the constuctor, or change the method name.",
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "        class A {\n          A.bar() {}\n        }\n        main() { A.bar(); }\n        "
+    ]
+  },
+  "UNDEFINED_GETTER": {
+    "id": "ERUSKD",
+    "subId": 3,
+    "categories": [
+      "StaticTypeWarning",
+      "StaticWarning",
+      "Hint"
+    ],
+    "template": "The getter '#{memberName}' is not defined for the class '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js",
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "class A {} main() { new A().x; }",
+      "class A {} main() { A.x; }"
+    ]
+  },
+  "UNDEFINED_ENUM_CONSTANT": {
+    "id": "ERUSKD",
+    "subId": 4,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "There is no constant named '#{memberName}' in '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "        enum E { ONE }\n        E e() { return E.TWO; }\n        main() { e(); }\n       "
+    ]
+  },
+  "UNDEFINED_INSTANCE_GETTER_BUT_SETTER": {
+    "id": "ERUSKD",
+    "subId": 5,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "The setter '#{memberName}' in class '#{className}' can not be used as a getter.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js"
+    ],
+    "examples": [
+      "class A { set x(y) {} } main() { new A().x; }"
+    ]
+  },
+  "UNDEFINED_OPERATOR": {
+    "id": "ERUSKD",
+    "subId": 6,
+    "categories": [
+      "StaticTypeWarning",
+      "Hint"
+    ],
+    "template": "The operator '#{memberName}' is not defined for the class '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js",
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "class A {} main() { new A() + 3; }"
+    ]
+  },
+  "UNDEFINED_SETTER": {
+    "id": "ERUSKD",
+    "subId": 7,
+    "categories": [
+      "StaticTypeWarning",
+      "StaticWarning",
+      "Hint"
+    ],
+    "template": "The setter '#{memberName}' is not defined for the class '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js",
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "class A {} main() { new A().x = 499; }"
+    ]
+  },
+  "NO_SUCH_SUPER_MEMBER": {
+    "id": "ERUSKD",
+    "subId": 8,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "Can't resolve '#{memberName}' in a superclass of '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js"
+    ],
+    "examples": null
+  },
+  "UNDEFINED_SUPER_GETTER": {
+    "id": "ERUSKD",
+    "subId": 9,
+    "categories": [
+      "StaticTypeWarning",
+      "StaticWarning"
+    ],
+    "template": "The getter '#{memberName}' is not defined in a superclass of '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "        class A {}\n        class B extends A {\n          foo() => super.x;\n        }\n        main() { new B().foo(); }\n        "
+    ]
+  },
+  "UNDEFINED_SUPER_METHOD": {
+    "id": "ERUSKD",
+    "subId": 10,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "The method '#{memberName}' is not defined in a superclass of '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "        class A {}\n        class B extends A {\n          foo() => super.x();\n        }\n        main() { new B().foo(); }\n        "
+    ]
+  },
+  "UNDEFINED_SUPER_OPERATOR": {
+    "id": "ERUSKD",
+    "subId": 11,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "The operator '#{memberName}' is not defined in a superclass of '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "        class A {}\n        class B extends A {\n          foo() => super + 499;\n        }\n        main() { new B().foo(); }\n        "
+    ]
+  },
+  "UNDEFINED_SUPER_SETTER": {
+    "id": "ERUSKD",
+    "subId": 12,
+    "categories": [
+      "StaticTypeWarning",
+      "StaticWarning"
+    ],
+    "template": "The setter '#{memberName}' is not defined in a superclass of '#{className}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer",
+      "Platform.dart2js"
+    ],
+    "examples": [
+      "        class A {}\n        class B extends A {\n          foo() { super.x = 499; }\n        }\n        main() { new B().foo(); }\n        "
+    ]
+  },
+  "UNDEFINED_FUNCTION": {
+    "id": "ERUSKD",
+    "subId": 13,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "The function '#{memberName}' is not defined.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.analyzer"
+    ],
+    "examples": [
+      "main() { foo(); }"
+    ]
+  },
+  "UNDEFINED_STATIC_GETTER_BUT_SETTER": {
+    "id": "ERUSKD",
+    "subId": 14,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "Cannot resolve getter '#{name}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js"
+    ],
+    "examples": [
+      "set foo(x) {}  main() { foo; }"
+    ]
+  },
+  "UNDEFINED_STATIC_SETTER_BUT_GETTER": {
+    "id": "ERUSKD",
+    "subId": 15,
+    "categories": [
+      "StaticTypeWarning"
+    ],
+    "template": "Cannot resolve setter '#{name}'.",
+    "templateHoleOrder": null,
+    "howToFix": null,
+    "options": null,
+    "usedBy": [
+      "Platform.dart2js"
+    ],
+    "examples": [
+      "        main() {\n          final x = 1;\n          x = 2;\n        }",
+      "        main() {\n          const x = 1;\n          x = 2;\n        }\n        ",
+      "        final x = 1;\n        main() { x = 3; }\n        ",
+      "        const x = 1;\n        main() { x = 3; }\n        ",
+      "get foo => null  main() { foo = 5; }",
+      "const foo = 0  main() { foo = 5; }"
+    ]
   }
 }
\ No newline at end of file
diff --git a/pkg/dart_messages/lib/shared_messages.dart b/pkg/dart_messages/lib/shared_messages.dart
index ece8895..5aa2ced 100644
--- a/pkg/dart_messages/lib/shared_messages.dart
+++ b/pkg/dart_messages/lib/shared_messages.dart
@@ -77,6 +77,12 @@
 
   static final compileTimeError = new Category("CompileTimeError");
 
+  static final staticTypeWarning = new Category("StaticTypeWarning");
+
+  static final staticWarning = new Category("StaticWarning");
+
+  static final hint = new Category("Hint");
+
   final String name;
 
   Category(this.name);
@@ -100,16 +106,24 @@
   /// This id just needs to be unique within the same [id].
   final int subId;
 
-  /// The error sub-id of which this message is a specialization.
+  /// The error of which this message is a specialization.
   ///
   /// For example, "Const is not allowed on getters" may be a specialization of
   /// "The 'const' keyword is not allowed here".
   ///
   /// Examples of the specialized message, should trigger for the more generic
   /// message, when the platform doesn't support the more specialized message.
-  final int specializationOf;
+  ///
+  /// Specializations must have the same error-id (but not sub-id) as the more
+  /// generic message.
+  final String specializationOf;
 
-  final Category category;
+  /// The categories of this message.
+  ///
+  /// The same message can be used in multiple categories, for example, as
+  /// hint and warning.
+  final List<Category> categories;
+
   final String template;
   // The analyzer fills holes positionally (and not named). The following field
   // overrides the order of the holes.
@@ -127,8 +141,8 @@
   Message(
       {this.id,
       this.subId: 0,
-      this.specializationOf: -1,
-      this.category,
+      this.specializationOf: null,
+      this.categories,
       this.template,
       this.templateHoleOrder,
       this.howToFix,
@@ -143,7 +157,8 @@
     jsonified[name] = {
       'id': message.id,
       'subId': message.subId,
-      'category': message.category.name,
+      'categories':
+          message.categories.map((category) => category.name).toList(),
       'template': message.template,
       'templateHoleOrder': message.templateHoleOrder,
       'howToFix': message.howToFix,
@@ -158,7 +173,7 @@
 final Map<String, Message> MESSAGES = {
   'exampleMessage': new Message(
       id: 'use an Id generated by bin/message_id.dart',
-      category: Category.analysisOptionsError,
+      categories: [Category.analysisOptionsError],
       template: "#use #named #arguments",
       templateHoleOrder: ["arguments", "named", "use"],
       howToFix: "an explanation on how to fix things",
@@ -180,12 +195,10 @@
   'CONST_CONSTRUCTOR_OR_FACTORY_WITH_BODY': new Message(
       id: 'LGJGHW',
       subId: 0,
-      category: Category.parserError,
+      categories: [Category.parserError],
       template: "Const constructor or factory can't have a body.",
       howToFix: "Remove the 'const' keyword or the body.",
-      usedBy: [
-        dart2js
-      ],
+      usedBy: [dart2js],
       examples: const [
         r"""
          class C {
@@ -204,13 +217,11 @@
   'CONST_CONSTRUCTOR_WITH_BODY': new Message(
       id: 'LGJGHW',
       subId: 1,
-      specializationOf: 0,
-      category: Category.parserError,
+      specializationOf: "CONST_CONSTRUCTOR_OR_FACTORY_WITH_BODY",
+      categories: [Category.parserError],
       template: "Const constructor can't have a body.",
       howToFix: "Try removing the 'const' keyword or the body.",
-      usedBy: [
-        analyzer
-      ],
+      usedBy: [analyzer],
       examples: const [
         r"""
          class C {
@@ -223,15 +234,13 @@
   'CONST_FACTORY': new Message(
       id: 'LGJGHW',
       subId: 2,
-      specializationOf: 0,
-      category: Category.parserError,
+      specializationOf: "CONST_CONSTRUCTOR_OR_FACTORY_WITH_BODY",
+      categories: [Category.parserError],
       template: "Only redirecting factory constructors can be declared to "
           "be 'const'.",
       howToFix: "Try removing the 'const' keyword or replacing the body with "
           "'=' followed by a valid target.",
-      usedBy: [
-        analyzer
-      ],
+      usedBy: [analyzer],
       examples: const [
         r"""
          class C {
@@ -244,12 +253,10 @@
   'EXTRANEOUS_MODIFIER': new Message(
       id: 'GRKIQE',
       subId: 0,
-      category: Category.parserError,
+      categories: [Category.parserError],
       template: "Can't have modifier '#{modifier}' here.",
       howToFix: "Try removing '#{modifier}'.",
-      usedBy: [
-        dart2js
-      ],
+      usedBy: [dart2js],
       examples: const [
         "var String foo; main(){}",
         // "var get foo; main(){}",
@@ -273,13 +280,11 @@
   'EXTRANEOUS_MODIFIER_REPLACE': new Message(
       id: 'GRKIQE',
       subId: 1,
-      category: Category.parserError,
+      categories: [Category.parserError],
       template: "Can't have modifier '#{modifier}' here.",
       howToFix: "Try replacing modifier '#{modifier}' with 'var', 'final', "
           "or a type.",
-      usedBy: [
-        dart2js
-      ],
+      usedBy: [dart2js],
       examples: const [
         // "get foo; main(){}",
         "set foo; main(){}",
@@ -291,15 +296,14 @@
   'CONST_CLASS': new Message(
       id: 'GRKIQE',
       subId: 2,
-      // The specialization could also be 1, but the example below triggers 0.
-      specializationOf: 0,
-      category: Category.parserError,
-      template: "Classes can't be declared to be 'const'",
+      // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the
+      // example below triggers 'EXTRANEOUS_MODIFIER'.
+      specializationOf: 'EXTRANEOUS_MODIFIER',
+      categories: [Category.parserError],
+      template: "Classes can't be declared to be 'const'.",
       howToFix: "Try removing the 'const' keyword or moving to the class'"
           " constructor(s).",
-      usedBy: [
-        analyzer
-      ],
+      usedBy: [analyzer],
       examples: const [
         r"""
         const class C {}
@@ -311,14 +315,13 @@
   'CONST_METHOD': new Message(
       id: 'GRKIQE',
       subId: 3,
-      // The specialization could also be 1, but the example below triggers 0.
-      specializationOf: 0,
-      category: Category.parserError,
-      template: "Getters, setters and methods can't be declared to be 'const'",
+      // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the
+      // example below triggers 'EXTRANEOUS_MODIFIER'.
+      specializationOf: 'EXTRANEOUS_MODIFIER',
+      categories: [Category.parserError],
+      template: "Getters, setters and methods can't be declared to be 'const'.",
       howToFix: "Try removing the 'const' keyword.",
-      usedBy: [
-        analyzer
-      ],
+      usedBy: [analyzer],
       examples: const [
         "const int foo() => 499; main() {}",
         "const int get foo => 499; main() {}",
@@ -331,10 +334,11 @@
   'CONST_ENUM': new Message(
       id: 'GRKIQE',
       subId: 4,
-      // The specialization could also be 1, but the example below triggers 0.
-      specializationOf: 0,
-      category: Category.parserError,
-      template: "Enums can't be declared to be 'const'",
+      // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the
+      // example below triggers 'EXTRANEOUS_MODIFIER'.
+      specializationOf: 'EXTRANEOUS_MODIFIER',
+      categories: [Category.parserError],
+      template: "Enums can't be declared to be 'const'.",
       howToFix: "Try removing the 'const' keyword.",
       usedBy: [analyzer],
       examples: const ["const enum Foo { x } main() {}",]),
@@ -342,10 +346,11 @@
   'CONST_TYPEDEF': new Message(
       id: 'GRKIQE',
       subId: 5,
-      // The specialization could also be 1, but the example below triggers 0.
-      specializationOf: 0,
-      category: Category.parserError,
-      template: "Type aliases can't be declared to be 'const'",
+      // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the
+      // example below triggers 'EXTRANEOUS_MODIFIER'.
+      specializationOf: 'EXTRANEOUS_MODIFIER',
+      categories: [Category.parserError],
+      template: "Type aliases can't be declared to be 'const'.",
       howToFix: "Try removing the 'const' keyword.",
       usedBy: [analyzer],
       examples: const ["const typedef void Foo(); main() {}",]),
@@ -353,14 +358,13 @@
   'CONST_AND_FINAL': new Message(
       id: 'GRKIQE',
       subId: 6,
-      // The specialization could also be 1, but the example below triggers 0.
-      specializationOf: 0,
-      category: Category.parserError,
-      template: "Members can't be declared to be both 'const' and 'final'",
+      // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the
+      // example below triggers 'EXTRANEOUS_MODIFIER'.
+      specializationOf: 'EXTRANEOUS_MODIFIER',
+      categories: [Category.parserError],
+      template: "Members can't be declared to be both 'const' and 'final'.",
       howToFix: "Try removing either the 'const' or 'final' keyword.",
-      usedBy: [
-        analyzer
-      ],
+      usedBy: [analyzer],
       examples: const [
         "final const int x = 499; main() {}",
         "const final int x = 499; main() {}",
@@ -371,14 +375,13 @@
   'CONST_AND_VAR': new Message(
       id: 'GRKIQE',
       subId: 7,
-      // The specialization could also be 1, but the example below triggers 0.
-      specializationOf: 0,
-      category: Category.parserError,
-      template: "Members can't be declared to be both 'const' and 'var'",
+      // The specialization could also be 'EXTRANEOUS_MODIFIER_REPLACE', but the
+      // example below triggers 'EXTRANEOUS_MODIFIER'.
+      specializationOf: 'EXTRANEOUS_MODIFIER',
+      categories: [Category.parserError],
+      template: "Members can't be declared to be both 'const' and 'var'.",
       howToFix: "Try removing either the 'const' or 'var' keyword.",
-      usedBy: [
-        analyzer
-      ],
+      usedBy: [analyzer],
       examples: const [
         "var const x = 499; main() {}",
         "const var x = 499; main() {}",
@@ -390,7 +393,7 @@
       // Dart2js currently reports this as an EXTRANEOUS_MODIFIER error.
       // TODO(floitsch): make dart2js use this error instead.
       id: 'DOTHQH',
-      category: Category.parserError,
+      categories: [Category.parserError],
       template: "Classes can't be declared inside other classes.",
       howToFix: "Try moving the class to the top-level.",
       usedBy: [analyzer],
@@ -398,8 +401,8 @@
 
   'CONSTRUCTOR_WITH_RETURN_TYPE': new Message(
       id: 'VOJBWY',
-      category: Category.parserError,
-      template: "Constructors can't have a return type",
+      categories: [Category.parserError],
+      template: "Constructors can't have a return type.",
       howToFix: "Try removing the return type.",
       usedBy: [analyzer, dart2js],
       examples: const ["class A { int A() {} } main() { new A(); }",]),
@@ -407,13 +410,10 @@
   'MISSING_EXPRESSION_IN_THROW': new Message(
       id: 'FTGGMJ',
       subId: 0,
-      category: Category.parserError,
+      categories: [Category.parserError],
       template: "Missing expression after 'throw'.",
       howToFix: "Did you mean 'rethrow'?",
-      usedBy: [
-        analyzer,
-        dart2js
-      ],
+      usedBy: [analyzer, dart2js],
       examples: const [
         'main() { throw; }',
         'main() { try { throw 0; } catch(e) { throw; } }'
@@ -425,8 +425,8 @@
    */
   'RETHROW_OUTSIDE_CATCH': new Message(
       id: 'MWETLC',
-      category: Category.compileTimeError,
-      template: 'Rethrow must be inside of catch clause',
+      categories: [Category.compileTimeError],
+      template: 'Rethrow must be inside of catch clause.',
       howToFix: "Try moving the expression into a catch clause, or "
           "using a 'throw' expression.",
       usedBy: [analyzer, dart2js],
@@ -438,14 +438,11 @@
    */
   'RETURN_IN_GENERATIVE_CONSTRUCTOR': new Message(
       id: 'UOTDQH',
-      category: Category.compileTimeError,
+      categories: [Category.compileTimeError],
       template: "Constructors can't return values.",
       howToFix:
           "Try removing the return statement or using a factory constructor.",
-      usedBy: [
-        analyzer,
-        dart2js
-      ],
+      usedBy: [analyzer, dart2js],
       examples: const [
         """
         class C {
@@ -464,15 +461,12 @@
   'RETURN_IN_GENERATOR': new Message(
       id: 'JRUTUQ',
       subId: 0,
-      category: Category.compileTimeError,
+      categories: [Category.compileTimeError],
       template: "Can't return a value from a generator function "
           "(using the '#{modifier}' modifier).",
       howToFix: "Try removing the value, replacing 'return' with 'yield' or"
-          " changing the method body modifier",
-      usedBy: [
-        analyzer,
-        dart2js
-      ],
+          " changing the method body modifier.",
+      usedBy: [analyzer, dart2js],
       examples: const [
         """
         foo() async* { return 0; }
@@ -483,4 +477,430 @@
         main() => foo();
         """
       ]),
+
+  'NOT_ASSIGNABLE': new Message(
+      id: 'FYQYXB',
+      subId: 0,
+      categories: [Category.staticTypeWarning],
+      template: "'#{fromType}' is not assignable to '#{toType}'.",
+      usedBy: [dart2js]),
+
+  'FORIN_NOT_ASSIGNABLE': new Message(
+      id: 'FYQYXB',
+      subId: 1,
+      categories: [Category.hint],
+      template: "The element type '#{currentType}' of '#{expressionType}' "
+          "is not assignable to '#{elementType}'.",
+      usedBy: [dart2js],
+      examples: const [
+        """
+        main() {
+          List<int> list = <int>[1, 2];
+          for (String x in list) x;
+        }
+        """
+      ]),
+
+  /**
+   * 13.11 Return: It is a static type warning if the type of <i>e</i> may not
+   * be assigned to the declared return type of the immediately enclosing
+   * function.
+   */
+  'RETURN_OF_INVALID_TYPE': new Message(
+      id: 'FYQYXB',
+      subId: 2,
+      specializationOf: 'NOT_ASSIGNABLE',
+      categories: [Category.staticTypeWarning],
+      template: "The return type '#{fromType}' is not a '#{toType}', as "
+          "defined by the method '#{method}'.",
+      usedBy: [analyzer],
+      examples: const ["int foo() => 'foo'; main() { foo(); }"]),
+
+  /**
+   * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>,
+   * 1 &lt;= i &lt;= n+ k</i> may not be assigned to the type of the
+   * corresponding formal parameter of the constructor <i>T.id</i> (respectively
+   * <i>T</i>).
+   *
+   * 12.11.2 Const: It is a static warning if the static type of
+   * <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+ k</i> may not be assigned to the type
+   * of the corresponding formal parameter of the constructor <i>T.id</i>
+   * (respectively <i>T</i>).
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
+   * &lt;= j &lt;= m</i>.
+   *
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub>, 1
+   * &lt;= i &lt;= l</i>, must have a corresponding named parameter in the set
+   * <i>{p<sub>n+1</sub>, &hellip; p<sub>n+k</sub>}</i> or a static warning
+   * occurs. It is a static warning if <i>T<sub>m+j</sub></i> may not be
+   * assigned to <i>S<sub>r</sub></i>, where <i>r = q<sub>j</sub>, 1 &lt;= j
+   * &lt;= l</i>.
+   */
+  'ARGUMENT_TYPE_NOT_ASSIGNABLE': new Message(
+      id: 'FYQYXB',
+      subId: 3,
+      specializationOf: 'NOT_ASSIGNABLE',
+      categories: [Category.hint, Category.staticWarning],
+      template: "The argument type '#{fromType}' cannot be assigned to the "
+          "parameter type '#{toType}'.",
+      usedBy: [analyzer],
+      // TODO(floitsch): support hint warnings and ways to specify which
+      // category an example should trigger for.
+      examples: const ["foo(int x) => x; main() { foo('bar'); }"]),
+
+  'CANNOT_RESOLVE': new Message(
+      id: 'ERUSKD',
+      subId: 0,
+      categories: [Category.staticTypeWarning],
+      template: "Can't resolve '#{name}'.",
+      usedBy: [dart2js]),
+
+  /**
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance member named <i>m</i>.
+   */
+  'UNDEFINED_METHOD': new Message(
+      id: 'ERUSKD',
+      subId: 1,
+      categories: [Category.staticTypeWarning, Category.hint],
+      template: "The method '#{memberName}' is not defined for the class"
+          " '#{className}'.",
+      usedBy: [dart2js, analyzer],
+      examples: const [
+        """
+        class A {
+          foo() { bar(); }
+        }
+        main() { new A().foo(); }
+        """,
+      ]),
+
+  /**
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance member named <i>m</i>.
+   */
+  'UNDEFINED_METHOD_WITH_CONSTRUCTOR': new Message(
+      id: 'ERUSKD',
+      subId: 2,
+      specializationOf: "UNDEFINED_METHOD",
+      categories: [Category.staticTypeWarning],
+      template: "The method '#{memberName}' is not defined for the class"
+          " '#{className}', but a constructor with that name is defined.",
+      howToFix: "Try adding 'new' or 'const' to invoke the constuctor, or "
+          "change the method name.",
+      usedBy: [analyzer],
+      examples: const [
+        """
+        class A {
+          A.bar() {}
+        }
+        main() { A.bar(); }
+        """,
+      ]),
+
+  /**
+   * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
+   * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
+   */
+  'UNDEFINED_GETTER': new Message(
+      id: 'ERUSKD',
+      subId: 3,
+      categories: [
+        Category.staticTypeWarning,
+        Category.staticWarning,
+        Category.hint
+      ],
+      template: "The getter '#{memberName}' is not defined for the "
+          "class '#{className}'.",
+      usedBy: [dart2js, analyzer],
+      examples: const [
+        "class A {} main() { new A().x; }",
+        "class A {} main() { A.x; }"
+      ]),
+
+  /**
+   * 12.17 Getter Invocation: It is a static warning if there is no class
+   * <i>C</i> in the enclosing lexical scope of <i>i</i>, or if <i>C</i> does
+   * not declare, implicitly or explicitly, a getter named <i>m</i>.
+   */
+  'UNDEFINED_ENUM_CONSTANT': new Message(
+      id: 'ERUSKD',
+      subId: 4,
+      specializationOf: 'UNDEFINED_GETTER',
+      categories: [Category.staticTypeWarning],
+      template: "There is no constant named '#{memberName}' in '#{className}'.",
+      usedBy: [analyzer],
+      examples: const [
+        """
+        enum E { ONE }
+        E e() { return E.TWO; }
+        main() { e(); }
+       """
+      ]),
+
+  'UNDEFINED_INSTANCE_GETTER_BUT_SETTER': new Message(
+      id: 'ERUSKD',
+      subId: 5,
+      specializationOf: 'UNDEFINED_GETTER',
+      categories: [Category.staticTypeWarning,],
+      template: "The setter '#{memberName}' in class '#{className}' can"
+          " not be used as a getter.",
+      usedBy: [dart2js],
+      examples: const ["class A { set x(y) {} } main() { new A().x; }",]),
+
+  /**
+   * 12.18 Assignment: Evaluation of an assignment of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
+   * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
+   * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>,
+   * <i>e<sub>2</sub></i>).
+   *
+   * 12.29 Assignable Expressions: An assignable expression of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method
+   * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument
+   * <i>e<sub>2</sub></i>.
+   *
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance member named <i>m</i>.
+   */
+  'UNDEFINED_OPERATOR': new Message(
+      id: 'ERUSKD',
+      subId: 6,
+      categories: [Category.staticTypeWarning, Category.hint],
+      template: "The operator '#{memberName}' is not defined for the "
+          "class '#{className}'.",
+      usedBy: [dart2js, analyzer],
+      examples: const ["class A {} main() { new A() + 3; }",]),
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance setter named <i>v=</i>.
+   *
+   * 12.18 Assignment: It is as static warning if an assignment of the form
+   * <i>v = e</i> occurs inside a top level or static function (be it function,
+   * method, getter, or setter) or variable initializer and there is no
+   * declaration <i>d</i> with name <i>v=</i> in the lexical scope enclosing the
+   * assignment.
+   *
+   * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in
+   * the enclosing lexical scope of the assignment, or if <i>C</i> does not
+   * declare, implicitly or explicitly, a setter <i>v=</i>.
+   */
+  'UNDEFINED_SETTER': new Message(
+      id: 'ERUSKD',
+      subId: 7,
+      categories: [
+        Category.staticTypeWarning,
+        Category.staticWarning,
+        Category.hint
+      ],
+      template: "The setter '#{memberName}' is not defined for the "
+          "class '#{className}'.",
+      usedBy: [dart2js, analyzer],
+      examples: const ["class A {} main() { new A().x = 499; }",]),
+
+  'NO_SUCH_SUPER_MEMBER': new Message(
+      id: 'ERUSKD',
+      subId: 8,
+      categories: [Category.staticTypeWarning],
+      template:
+          "Can't resolve '#{memberName}' in a superclass of '#{className}'.",
+      usedBy: [dart2js]),
+
+  /**
+   * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
+   * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
+   *
+   * 12.17 Getter Invocation: It is a static warning if there is no class
+   * <i>C</i> in the enclosing lexical scope of <i>i</i>, or if <i>C</i> does
+   * not declare, implicitly or explicitly, a getter named <i>m</i>.
+   */
+  'UNDEFINED_SUPER_GETTER': new Message(
+      id: 'ERUSKD',
+      subId: 9,
+      specializationOf: 'NO_SUCH_SUPER_MEMBER',
+      categories: [Category.staticTypeWarning, Category.staticWarning],
+      template: "The getter '#{memberName}' is not defined in a superclass "
+          "of '#{className}'.",
+      usedBy: [analyzer],
+      examples: const [
+        """
+        class A {}
+        class B extends A {
+          foo() => super.x;
+        }
+        main() { new B().foo(); }
+        """
+      ]),
+
+  /**
+   * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
+   * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a
+   * static type warning if <i>S</i> does not have an accessible instance member
+   * named <i>m</i>.
+   */
+  'UNDEFINED_SUPER_METHOD': new Message(
+      id: 'ERUSKD',
+      subId: 10,
+      specializationOf: 'NO_SUCH_SUPER_MEMBER',
+      categories: [Category.staticTypeWarning],
+      template: "The method '#{memberName}' is not defined in a superclass "
+          "of '#{className}'.",
+      usedBy: [analyzer],
+      examples: const [
+        """
+        class A {}
+        class B extends A {
+          foo() => super.x();
+        }
+        main() { new B().foo(); }
+        """
+      ]),
+
+  /**
+   * 12.18 Assignment: Evaluation of an assignment of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
+   * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
+   * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>,
+   * <i>e<sub>2</sub></i>).
+   *
+   * 12.29 Assignable Expressions: An assignable expression of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method
+   * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument
+   * <i>e<sub>2</sub></i>.
+   *
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance member named <i>m</i>.
+   */
+  'UNDEFINED_SUPER_OPERATOR': new Message(
+      id: 'ERUSKD',
+      subId: 11,
+      specializationOf: 'NO_SUCH_SUPER_MEMBER',
+      categories: [Category.staticTypeWarning],
+      template: "The operator '#{memberName}' is not defined in a superclass "
+          "of '#{className}'.",
+      usedBy: [analyzer],
+      examples: const [
+        """
+        class A {}
+        class B extends A {
+          foo() => super + 499;
+        }
+        main() { new B().foo(); }
+        """
+      ]),
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance setter named <i>v=</i>.
+   *
+   * 12.18 Assignment: It is as static warning if an assignment of the form
+   * <i>v = e</i> occurs inside a top level or static function (be it function,
+   * method, getter, or setter) or variable initializer and there is no
+   * declaration <i>d</i> with name <i>v=</i> in the lexical scope enclosing the
+   * assignment.
+   *
+   * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in
+   * the enclosing lexical scope of the assignment, or if <i>C</i> does not
+   * declare, implicitly or explicitly, a setter <i>v=</i>.
+
+   */
+  'UNDEFINED_SUPER_SETTER': new Message(
+      id: 'ERUSKD',
+      subId: 12,
+      categories: [Category.staticTypeWarning, Category.staticWarning],
+      template: "The setter '#{memberName}' is not defined in a superclass "
+          "of '#{className}'.",
+      usedBy: [analyzer, dart2js,],
+      examples: const [
+        """
+        class A {}
+        class B extends A {
+          foo() { super.x = 499; }
+        }
+        main() { new B().foo(); }
+        """,
+        // TODO(floitsch): reenable this test.
+        /*
+        """
+        main() => new B().m();
+        class A {
+          get x => 1;
+        }
+        class B extends A {
+          m() { super.x = 2; }
+        }
+        """
+        */
+      ]),
+
+  /**
+   * 12.15.3 Unqualified Invocation: If there exists a lexically visible
+   * declaration named <i>id</i>, let <i>f<sub>id</sub></i> be the innermost
+   * such declaration. Then: [skip]. Otherwise, <i>f<sub>id</sub></i> is
+   * considered equivalent to the ordinary method invocation
+   * <b>this</b>.<i>id</i>(<i>a<sub>1</sub></i>, ..., <i>a<sub>n</sub></i>,
+   * <i>x<sub>n+1</sub></i> : <i>a<sub>n+1</sub></i>, ...,
+   * <i>x<sub>n+k</sub></i> : <i>a<sub>n+k</sub></i>).
+   */
+  'UNDEFINED_FUNCTION': new Message(
+      id: 'ERUSKD',
+      subId: 13,
+      specializationOf: 'CANNOT_RESOLVE',
+      categories: [Category.staticTypeWarning],
+      template: "The function '#{memberName}' is not defined.",
+      usedBy: [analyzer],
+      examples: const ["main() { foo(); }",]),
+
+  'UNDEFINED_STATIC_GETTER_BUT_SETTER': new Message(
+      id: 'ERUSKD',
+      subId: 14,
+      specializationOf: 'CANNOT_RESOLVE',
+      categories: [Category.staticTypeWarning],
+      template: "Cannot resolve getter '#{name}'.",
+      usedBy: [dart2js],
+      examples: const ["set foo(x) {}  main() { foo; }",]),
+
+  'UNDEFINED_STATIC_SETTER_BUT_GETTER': new Message(
+      id: 'ERUSKD',
+      subId: 15,
+      specializationOf: 'CANNOT_RESOLVE',
+      categories: [Category.staticTypeWarning],
+      template: "Cannot resolve setter '#{name}'.",
+      usedBy: [dart2js],
+      examples: const [
+        """
+        main() {
+          final x = 1;
+          x = 2;
+        }""",
+        """
+        main() {
+          const x = 1;
+          x = 2;
+        }
+        """,
+        """
+        final x = 1;
+        main() { x = 3; }
+        """,
+        """
+        const x = 1;
+        main() { x = 3; }
+        """,
+        "get foo => null  main() { foo = 5; }",
+        "const foo = 0  main() { foo = 5; }",
+      ]),
 };
diff --git a/pkg/dart_messages/test/dart_messages_test.dart b/pkg/dart_messages/test/dart_messages_test.dart
index b05bc3f..80ecaaf 100644
--- a/pkg/dart_messages/test/dart_messages_test.dart
+++ b/pkg/dart_messages/test/dart_messages_test.dart
@@ -33,7 +33,24 @@
   }
 }
 
+void testSpecializationsAreOfSameId() {
+  for (var entry in MESSAGES.values) {
+    var specializationOf = entry.specializationOf;
+    if (specializationOf == null) continue;
+    var generic = MESSAGES[specializationOf];
+    if (generic == null) {
+      throw "More generic message doesn't exist: $specializationOf";
+    }
+    if (generic.id != entry.id) {
+      var id = "${entry.id}-${entry.subId}";
+      var genericId = "${generic.id}-${generic.subId}";
+      throw "Specialization doesn't have same id: $id - $genericId";
+    }
+  }
+}
+
 void main() {
   testJsonIsUpdated();
   testIdsAreUnique();
+  testSpecializationsAreOfSameId();
 }
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index fc3f06e..2420295 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.10.0
+* Introduce `@factory` annotation for methods that must either be abstract or
+must return a newly allocated object.
+* Introduce `@literal` annotation that indicates that any invocation of a
+constructor must use the keyword `const` unless one or more of the
+arguments to the constructor is not a compile-time constant.
+
 ## 0.9.0
 * Introduce `@protected` annotation for members that must only be called from
 instance members of subclasses.
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index c94fd80..16411b5 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Constants for use in metadata annotations such as `@protected`.
+/// Constants for use in metadata annotations.
 ///
 /// See also `@deprecated` and `@override` in the `dart:core` library.
 ///
@@ -84,7 +84,26 @@
 ///   name that does not have this annotation, or
 /// * an invocation of a method or function does not include an argument
 ///   corresponding to a named parameter that has this annotation.
-const _Required required = const _Required();
+const Required required = const Required();
+
+/// Used to annotate a named parameter `p` in a method or function `f`.
+///
+/// See [required] for more details.
+class Required {
+  /// A human-readable explanation of the reason why the annotated parameter is
+  /// required. For example, the annotation might look like:
+  ///
+  ///     ButtonWidget({
+  ///         Function onHover,
+  ///         @Required('Buttons must do something when pressed')
+  ///         Function onPressed,
+  ///         ...
+  ///     }) ...
+  final String reason;
+
+  /// Initialize a newly created instance to have the given [reason].
+  const Required([this.reason]);
+}
 
 class _Factory {
   const _Factory();
@@ -101,7 +120,3 @@
 class _Protected {
   const _Protected();
 }
-
-class _Required {
-  const _Required();
-}
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index 4b20d9c..abcbc8d 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: meta
-version: 0.9.0
+version: 0.10.0
 author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/pkg.status b/pkg/pkg.status
index f0e031c..c44aaea 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -73,6 +73,7 @@
 analyzer/test/src/context/context_test: Pass, Timeout # dartbug.com/23658
 analyzer/test/src/dart/ast/utilities_test: Pass, Slow # Issue 24914
 analyzer/test/src/dart/element/element_test: Pass, Slow # Issue 24914
+analyzer/test/src/summary/index_unit_test: Pass, Slow # Issue 24914
 analyzer/test/src/summary/prelinker_test: Pass, Slow # Issue 24914
 analyzer/test/src/summary/resynthesize_strong_test: Pass, Slow
 analyzer/test/src/summary/resynthesize_test: Pass, Slow
@@ -187,11 +188,17 @@
 analyzer/test/src/task/strong_mode_test: Pass, Slow # Times out due to inlining, but see issue 24485
 
 [ $compiler == dart2js && $cps_ir && $host_checked ]
+analyzer/test/dart/ast/ast_test: Crash # Issue 24485
+analyzer/test/dart/ast/visitor_test: Crash # Issue 24485
+analyzer/test/dart/element/element_test: Crash # Issue 24485
 analyzer/test/enum_test: Crash # Issue 24485
 analyzer/test/generated/all_the_rest_test: Crash # Issue 24485
 analyzer/test/generated/ast_test: Crash # Issue 24485
 analyzer/test/generated/compile_time_error_code_test: Crash # Issue 24485
+analyzer/test/generated/constant_test: Crash # Issue 24485
+analyzer/test/generated/declaration_resolver_test: Crash # Issue 24485
 analyzer/test/generated/element_test: Crash # Issue 24485
+analyzer/test/generated/error_suppression_test: Crash # Issue 24485
 analyzer/test/generated/incremental_resolver_test: Crash # Issue 24485
 analyzer/test/generated/incremental_scanner_test: Crash # Issue 24485
 analyzer/test/generated/non_error_resolver_test: Crash # Issue 24485
@@ -204,6 +211,15 @@
 analyzer/test/generated/utilities_test: Crash # Issue 24485
 analyzer/test/src/context/cache_test: Crash # Issue 24485
 analyzer/test/src/context/context_test: Crash # Issue 24485
+analyzer/test/src/dart/ast/utilities_test: Crash # Issue 24485
+analyzer/test/src/dart/element/element_test: Crash # Issue 24485
+analyzer/test/src/summary/index_unit_test: Crash # Issue 24485
+analyzer/test/src/summary/prelinker_test: Crash # Issue 24485
+analyzer/test/src/summary/resynthesize_test: Crash # Issue 24485
+analyzer/test/src/summary/resynthesize_strong_test: Crash # Issue 24485
+analyzer/test/src/summary/summarize_ast_test: Crash # Issue 24485
+analyzer/test/src/summary/summarize_elements_test: Crash # Issue 24485
+analyzer/test/src/summary/summarize_elements_strong_test: Crash # Issue 24485
 analyzer/test/src/task/dart_test: Crash # Issue 24485
 analyzer/test/src/task/dart_work_manager_test: Crash # Issue 24485
 analyzer/test/src/task/driver_test: Crash # Issue 24485
@@ -214,9 +230,15 @@
 analyzer/test/src/task/inputs_test: Crash # Issue 24485
 analyzer/test/src/task/manager_test: Crash # Issue 24485
 analyzer/test/src/task/model_test: Crash # Issue 24485
-analyzer/test/src/task/strong/checker_test: Crash # t: Failed assertion: line 88 pos 12: '!variable2index.containsKey(element)' is not true.
-analyzer/test/src/task/strong/inferred_type_test: Crash # t: Failed assertion: line 88 pos 12: '!variable2index.containsKey(element)' is not true.
+analyzer/test/src/task/options_test: Crash # Issue 24485
+analyzer/test/src/task/options_work_manager_test: Crash # Issue 24485
+analyzer/test/src/task/strong/checker_test: Crash # Issue 24485
+analyzer/test/src/task/strong/inferred_type_test: Crash # Issue 24485
 analyzer/test/src/task/strong_mode_test: Crash # Issue 24485
+analyzer/test/src/task/yaml_test: Crash # Issue 24485
 
 [ $noopt || $runtime == dart_precompiled || $runtime == dart_product ]
 *: SkipByDesign # The pkg test framework imports dart:mirrors.
+
+[ $compiler == dart2js && $cps_ir && $checked ]
+*: Skip # `assert` not implemented, about 75% tests crash
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 5d7b48e..0840125 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -15,8 +15,6 @@
     'isolate_snapshot_bin_file': '<(gen_source_dir)/isolate_snapshot_gen.bin',
     'gen_snapshot_stamp_file': '<(gen_source_dir)/gen_snapshot.stamp',
     'resources_cc_file': '<(gen_source_dir)/resources_gen.cc',
-    'bootstrap_resources_cc_file':
-        '<(gen_source_dir)/bootstrap_resources_gen.cc',
     'snapshot_cc_file': '<(gen_source_dir)/snapshot_gen.cc',
     'observatory_assets_cc_file': '<(gen_source_dir)/observatory_assets.cc',
     'observatory_assets_tar_file': '<(gen_source_dir)/observatory_assets.tar',
@@ -543,41 +541,6 @@
       ]
     },
     {
-      'target_name': 'generate_bootstrap_resources_cc_file',
-      'type': 'none',
-      'dependencies': [
-        'bin/zlib.gyp:zlib_dart',
-      ],
-      'toolsets':['host'],
-      'includes': [
-        'vmservice/vmservice_sources.gypi',
-      ],
-      'actions': [
-        {
-          'action_name': 'generate_resources_cc',
-          'inputs': [
-            '../tools/create_resources.py',
-            '<@(_sources)',
-          ],
-          'outputs': [
-            '<(bootstrap_resources_cc_file)',
-          ],
-          'action': [
-            'python',
-            'tools/create_resources.py',
-            '--output', '<(bootstrap_resources_cc_file)',
-            '--outer_namespace', 'dart',
-            '--inner_namespace', 'bin',
-            '--table_name', 'service_bin',
-            '--root_prefix', 'bin/',
-            '<@(_sources)'
-          ],
-          'message':
-              'Generating ''<(bootstrap_resources_cc_file)'' file.'
-        },
-      ]
-    },
-    {
       # dart_product binary.
       'target_name': 'dart_product',
       'type': 'executable',
@@ -780,63 +743,7 @@
         'libdart_nosnapshot',
         'libdart_builtin',
         'libdart_io',
-        'generate_bootstrap_resources_cc_file#host',
-      ],
-      'include_dirs': [
-        '..',
-        '../../third_party/', # Zlib
-      ],
-      'sources': [
-        'main.cc',
-        'builtin_common.cc',
-        'builtin_natives.cc',
-        'builtin.cc',
-        'builtin.h',
-        'io_natives.h',
-        'vmservice_impl.cc',
-        'vmservice_impl.h',
-        # Include generated source files.
-        '<(builtin_cc_file)',
-        '<(io_cc_file)',
-        '<(io_patch_cc_file)',
-        '<(bootstrap_resources_cc_file)',
-        'observatory_assets_empty.cc',
-        'snapshot_empty.cc',
-      ],
-      'conditions': [
-        ['OS=="win"', {
-          'link_settings': {
-            'libraries': [ '-lws2_32.lib', '-lRpcrt4.lib', '-lwinmm.lib' ],
-          },
-          # Generate an import library on Windows, by exporting a function.
-          # Extensions use this import library to link to the API in dart.exe.
-          'msvs_settings': {
-            'VCLinkerTool': {
-              'AdditionalOptions': [ '/EXPORT:Dart_True' ],
-            },
-          },
-        }],
-      ],
-      'configurations': {
-        'Dart_Linux_Base': {
-          # Have the linker add all symbols to the dynamic symbol table
-          # so that extensions can look them up dynamically in the binary.
-          'ldflags': [
-            '-rdynamic',
-          ],
-        },
-      },
-    },
-    {
-      # dart binary without any snapshot built in.
-      'target_name': 'dart_no_snapshot',
-      'type': 'executable',
-      'dependencies': [
-        'libdart_nosnapshot',
-        'libdart_builtin',
-        'libdart_io',
         'generate_resources_cc_file#host',
-        'generate_observatory_assets_cc_file#host',
       ],
       'include_dirs': [
         '..',
@@ -856,7 +763,7 @@
         '<(io_cc_file)',
         '<(io_patch_cc_file)',
         '<(resources_cc_file)',
-        '<(observatory_assets_cc_file)',
+        'observatory_assets_empty.cc',
         'snapshot_empty.cc',
       ],
       'defines': [
diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
index 5d24649..40bcde3 100644
--- a/runtime/bin/directory_android.cc
+++ b/runtime/bin/directory_android.cc
@@ -373,19 +373,6 @@
 }
 
 
-// Android doesn't currently provide mkdtemp.  Once Android provied mkdtemp,
-// remove this function in favor of calling mkdtemp directly.
-static char* MakeTempDirectory(char* path_template) {
-  if (mktemp(path_template) == NULL) {
-    return NULL;
-  }
-  if (mkdir(path_template, 0700) != 0) {
-    return NULL;
-  }
-  return path_template;
-}
-
-
 char* Directory::SystemTemp() {
   // Android does not have a /tmp directory. A partial substitute,
   // suitable for bring-up work and tests, is to create a tmp
@@ -416,7 +403,7 @@
   }
   char* result;
   do {
-    result = MakeTempDirectory(path.AsString());
+    result = mkdtemp(path.AsString());
   } while (result == NULL && errno == EINTR);
   if (result == NULL) {
     return NULL;
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index ea9f3d7..45087b4 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -1142,6 +1142,11 @@
     SetupForGenericSnapshotCreation();
     CreateAndWriteSnapshot();
   }
+  error = Dart_Cleanup();
+  if (error != NULL) {
+    Log::PrintErr("VM cleanup failed: %s\n", error);
+    free(error);
+  }
   EventHandler::Stop();
   return 0;
 }
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index bb21b9f..33d4ba5 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -45,7 +45,7 @@
  * A full application snapshot can be generated and run using the following
  * commands
  * - Generating a full application snapshot :
- * dart_no_snapshot --full-snapshot-after-run=<filename> --package-root=<dirs>
+ * dart_bootstrap --full-snapshot-after-run=<filename> --package-root=<dirs>
  *   <script_uri> [<script_options>]
  * - Running the full application snapshot generated above :
  * dart --run-full-snapshot=<filename> <script_uri> [<script_options>]
@@ -327,12 +327,11 @@
 static bool ProcessGenPrecompiledSnapshotOption(
     const char* arg,
     CommandLineOptions* vm_options) {
-  // Ensure that we are not already running using a full snapshot.
-  if (isolate_snapshot_buffer != NULL) {
-    Log::PrintErr("Precompiled snapshots must be generated with"
-                  " dart_no_snapshot.\n");
-    return false;
-  }
+#if !defined(DART_PRECOMPILER)
+  Log::PrintErr("Precompiled snapshots must be generated with "
+                "dart_bootstrap.\n");
+  return false;
+#else  // defined(DART_PRECOMPILER)
   ASSERT(arg != NULL);
   if ((arg[0] == '=') || (arg[0] == ':')) {
     precompiled_snapshot_directory = &arg[1];
@@ -340,11 +339,9 @@
     precompiled_snapshot_directory = arg;
   }
   gen_precompiled_snapshot = true;
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // The precompiled runtime has FLAG_precompilation set as const.
   vm_options->AddArgument("--precompilation");
-#endif
   return true;
+#endif  // defined(DART_PRECOMPILER)
 }
 
 
@@ -358,10 +355,7 @@
     precompiled_snapshot_directory = &precompiled_snapshot_directory[1];
   }
   run_precompiled_snapshot = true;
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // The precompiled runtime has FLAG_precompilation set as const.
   vm_options->AddArgument("--precompilation");
-#endif
   return true;
 }
 
@@ -401,10 +395,10 @@
   if ((filename == NULL) || (strlen(filename) == 0)) {
     return false;
   }
-  // Ensure that we are running 'dart_no_snapshot'.
+  // Ensure that we are running 'dart_bootstrap'.
   if (isolate_snapshot_buffer != NULL) {
     Log::PrintErr("Full Application snapshots must be generated with"
-                  " dart_no_snapshot\n");
+                  " dart_bootstrap\n");
     return false;
   }
   return ProcessSnapshotOptionHelper(filename,
@@ -1148,10 +1142,22 @@
 }
 
 
-static void* LoadLibrarySymbol(const char* libname, const char* symname) {
-  void* library = Extensions::LoadExtensionLibrary(libname);
+static void* LoadLibrarySymbol(const char* snapshot_directory,
+                               const char* libname,
+                               const char* symname) {
+  char* concat = NULL;
+  const char* qualified_libname;
+  if ((snapshot_directory != NULL) && strlen(snapshot_directory) > 0) {
+    intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, libname);
+    concat = new char[len + 1];
+    snprintf(concat, len + 1, "%s/%s", snapshot_directory, libname);
+    qualified_libname = concat;
+  } else {
+    qualified_libname = libname;
+  }
+  void* library = Extensions::LoadExtensionLibrary(qualified_libname);
   if (library == NULL) {
-    Log::PrintErr("Error: Failed to load library '%s'\n", libname);
+    Log::PrintErr("Error: Failed to load library '%s'\n", qualified_libname);
     Platform::Exit(kErrorExitCode);
   }
   void* symbol = Extensions::ResolveSymbol(library, symname);
@@ -1159,6 +1165,9 @@
     Log::PrintErr("Error: Failed to load symbol '%s'\n", symname);
     Platform::Exit(kErrorExitCode);
   }
+  if (concat != NULL) {
+    delete concat;
+  }
   return symbol;
 }
 
@@ -1427,6 +1436,9 @@
 
 #undef CHECK_RESULT
 
+
+// Observatory assets are only needed in the regular dart binary.
+#if !defined(DART_PRECOMPILER)
 extern unsigned int observatory_assets_archive_len;
 extern const uint8_t* observatory_assets_archive;
 
@@ -1508,6 +1520,9 @@
   free(decompressed);
   return tar_file;
 }
+#else  // !defined(DART_PRECOMPILER)
+static Dart_GetVMServiceAssetsArchive GetVMServiceAssetsArchiveCallback = NULL;
+#endif  // !defined(DART_PRECOMPILER)
 
 
 void main(int argc, char** argv) {
@@ -1587,10 +1602,12 @@
   const uint8_t* data_snapshot = NULL;
   if (run_precompiled_snapshot) {
     instructions_snapshot = reinterpret_cast<const uint8_t*>(
-        LoadLibrarySymbol(kPrecompiledLibraryName,
+        LoadLibrarySymbol(precompiled_snapshot_directory,
+                          kPrecompiledLibraryName,
                           kPrecompiledInstructionsSymbolName));
     data_snapshot = reinterpret_cast<const uint8_t*>(
-        LoadLibrarySymbol(kPrecompiledLibraryName,
+        LoadLibrarySymbol(precompiled_snapshot_directory,
+                          kPrecompiledLibraryName,
                           kPrecompiledDataSymbolName));
     ReadSnapshotFile(precompiled_snapshot_directory,
                      kPrecompiledVmIsolateName,
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index 7d79dc6..a269134 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -524,7 +524,6 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedMemBIO);
 };
 
-
 template<typename T, void (*free_func)(T*)>
 class ScopedSSLType {
  public:
@@ -582,20 +581,12 @@
 
 typedef ScopedSSLType<PKCS12, PKCS12_free> ScopedPKCS12;
 typedef ScopedSSLType<X509, X509_free> ScopedX509;
-
 typedef ScopedSSLStackType<STACK_OF(X509), X509, X509_free> ScopedX509Stack;
-typedef ScopedSSLStackType<STACK_OF(X509_NAME), X509_NAME, X509_NAME_free>
-    ScopedX509NAMEStack;
 
-
-// We try reading data as PKCS12 only if reading as PEM was unsuccessful and
-// if there is no indication that the data is malformed PEM. We assume the data
-// is malformed PEM if it contains the start line, i.e. a line with ----- BEGIN.
-static bool TryPKCS12(bool pem_success) {
+static bool NoPEMStartLine() {
   uint32_t last_error = ERR_peek_last_error();
-  return !pem_success &&
-      (ERR_GET_LIB(last_error) == ERR_LIB_PEM) &&
-      (ERR_GET_REASON(last_error) == PEM_R_NO_START_LINE);
+  return (ERR_GET_LIB(last_error) == ERR_LIB_PEM) &&
+         (ERR_GET_REASON(last_error) == PEM_R_NO_START_LINE);
 }
 
 
@@ -623,13 +614,19 @@
 static EVP_PKEY* GetPrivateKey(BIO* bio, const char* password) {
   EVP_PKEY *key = PEM_read_bio_PrivateKey(
       bio, NULL, PasswordCallback, const_cast<char*>(password));
-  if (TryPKCS12(key != NULL)) {
-    // Reset the bio, and clear the error from trying to read as PEM.
-    ERR_clear_error();
-    BIO_reset(bio);
+  if (key == NULL) {
+    // We try reading data as PKCS12 only if reading as PEM was unsuccessful and
+    // if there is no indication that the data is malformed PEM. We assume the
+    // data is malformed PEM if it contains the start line, i.e. a line
+    // with ----- BEGIN.
+    if (NoPEMStartLine()) {
+      // Reset the bio, and clear the error from trying to read as PEM.
+      ERR_clear_error();
+      BIO_reset(bio);
 
-    // Try to decode as PKCS12
-    key = GetPrivateKeyPKCS12(bio, password);
+      // Try to decode as PKCS12.
+      key = GetPrivateKeyPKCS12(bio, password);
+    }
   }
   return key;
 }
@@ -725,17 +722,12 @@
     }
   }
 
-  // If bio does not contain PEM data, the first call to PEM_read_bio_X509 will
-  // return NULL, and the while-loop will exit while status is still 0.
-  uint32_t err = ERR_peek_last_error();
-  if ((ERR_GET_LIB(err) != ERR_LIB_PEM) ||
-      (ERR_GET_REASON(err) != PEM_R_NO_START_LINE)) {
-    // If bio contains data that is trying to be PEM but is malformed, then
-    // this case will be triggered.
-    status = 0;
-  }
-
-  return status;
+  // If no PEM start line is found, it means that we read to the end of the
+  // file, or that the file isn't PEM. In the first case, status will be
+  // non-zero indicating success. In the second case, status will be 0,
+  // indicating that we should try to read as PKCS12. If there is some other
+  // error, we return it up to the caller.
+  return NoPEMStartLine() ? status : 0;
 }
 
 
@@ -743,11 +735,13 @@
                                        BIO* bio,
                                        const char* password) {
   int status = SetTrustedCertificatesBytesPEM(context, bio);
-  if (TryPKCS12(status != 0)) {
-    ERR_clear_error();
-    BIO_reset(bio);
-    status = SetTrustedCertificatesBytesPKCS12(context, bio, password);
-  } else if (status != 0) {
+  if (status == 0) {
+    if (NoPEMStartLine()) {
+      ERR_clear_error();
+      BIO_reset(bio);
+      status = SetTrustedCertificatesBytesPKCS12(context, bio, password);
+    }
+  } else {
     // The PEM file was successfully parsed.
     ERR_clear_error();
   }
@@ -860,27 +854,19 @@
     // count is increased by SSL_CTX_use_certificate.
   }
 
-  // If bio does not contain PEM data, the first call to PEM_read_bio_X509 will
-  // return NULL, and the while-loop will exit while status is still 0.
-  uint32_t err = ERR_peek_last_error();
-  if ((ERR_GET_LIB(err) != ERR_LIB_PEM) ||
-      (ERR_GET_REASON(err) != PEM_R_NO_START_LINE)) {
-    // If bio contains data that is trying to be PEM but is malformed, then
-    // this case will be triggered.
-    status = 0;
-  }
-
-  return status;
+  return NoPEMStartLine() ? status : 0;
 }
 
 
 static int UseChainBytes(SSL_CTX* context, BIO* bio, const char* password) {
   int status = UseChainBytesPEM(context, bio);
-  if (TryPKCS12(status != 0)) {
-    ERR_clear_error();
-    BIO_reset(bio);
-    status = UseChainBytesPKCS12(context, bio, password);
-  } else if (status != 0) {
+  if (status == 0) {
+    if (NoPEMStartLine()) {
+      ERR_clear_error();
+      BIO_reset(bio);
+      status = UseChainBytesPKCS12(context, bio, password);
+    }
+  } else {
     // The PEM file was successfully read.
     ERR_clear_error();
   }
@@ -903,16 +889,12 @@
 }
 
 
-static STACK_OF(X509_NAME)* GetCertificateNamesPKCS12(BIO* bio,
-                                                      const char* password) {
+static int SetClientAuthoritiesPKCS12(SSL_CTX* context,
+                                      BIO* bio,
+                                      const char* password) {
   ScopedPKCS12 p12(d2i_PKCS12_bio(bio, NULL));
   if (p12.get() == NULL) {
-    return NULL;
-  }
-
-  ScopedX509NAMEStack result(sk_X509_NAME_new_null());
-  if (result.get() == NULL) {
-    return NULL;
+    return 0;
   }
 
   EVP_PKEY* key = NULL;
@@ -920,99 +902,58 @@
   STACK_OF(X509) *ca_certs = NULL;
   int status = PKCS12_parse(p12.get(), password, &key, &cert, &ca_certs);
   if (status == 0) {
-    return NULL;
+    return status;
   }
 
-  ScopedX509 x509(cert);
-  ScopedX509Stack certs(ca_certs);
-  X509_NAME* x509_name = X509_get_subject_name(x509.get());
-  if (x509_name == NULL) {
-    return NULL;
+  ScopedX509Stack cert_stack(ca_certs);
+  status = SSL_CTX_add_client_CA(context, cert);
+  if (status == 0) {
+    X509_free(cert);
+    return status;
   }
 
-  x509_name = X509_NAME_dup(x509_name);
-  if (x509_name == NULL) {
-    return NULL;
-  }
-
-  sk_X509_NAME_push(result.get(), x509_name);
-
-  while (true) {
-    ScopedX509 ca(sk_X509_shift(certs.get()));
-    if (ca.get() == NULL) {
-      break;
+  X509* ca;
+  while ((ca = sk_X509_shift(cert_stack.get())) != NULL) {
+    status = SSL_CTX_add_client_CA(context, ca);
+    X509_free(ca);  // The name has been extracted.
+    if (status == 0) {
+      return status;
     }
-
-    X509_NAME* x509_name = X509_get_subject_name(ca.get());
-    if (x509_name == NULL) {
-      return NULL;
-    }
-
-    x509_name = X509_NAME_dup(x509_name);
-    if (x509_name == NULL) {
-      return NULL;
-    }
-
-    sk_X509_NAME_push(result.get(), x509_name);
   }
 
-  return result.release();
+  return status;
 }
 
 
-static STACK_OF(X509_NAME)* GetCertificateNamesPEM(BIO* bio) {
-  ScopedX509NAMEStack result(sk_X509_NAME_new_null());
-  if (result.get() == NULL) {
-    return NULL;
-  }
-
-  while (true) {
-    ScopedX509 x509(PEM_read_bio_X509(bio, NULL, NULL, NULL));
-    if (x509.get() == NULL) {
-      break;
+static int SetClientAuthoritiesPEM(SSL_CTX* context, BIO* bio) {
+  int status = 0;
+  X509* cert = NULL;
+  while ((cert = PEM_read_bio_X509(bio, NULL, NULL, NULL)) != NULL) {
+    status = SSL_CTX_add_client_CA(context, cert);
+    X509_free(cert);  // The name has been extracted.
+    if (status == 0) {
+      return status;
     }
-
-    X509_NAME* x509_name = X509_get_subject_name(x509.get());
-    if (x509_name == NULL) {
-      return NULL;
-    }
-
-    // Duplicate the name to put it on the stack.
-    x509_name = X509_NAME_dup(x509_name);
-    if (x509_name == NULL) {
-      return NULL;
-    }
-    sk_X509_NAME_push(result.get(), x509_name);
   }
-
-  if (sk_X509_NAME_num(result.get()) == 0) {
-    // The data was not PEM.
-    return NULL;
-  }
-
-  uint32_t err = ERR_peek_last_error();
-  if ((ERR_GET_LIB(err) != ERR_LIB_PEM) ||
-      (ERR_GET_REASON(err) != PEM_R_NO_START_LINE)) {
-    // The data was trying to be PEM, but was malformed.
-    return NULL;
-  }
-
-  return result.release();
+  return NoPEMStartLine() ? status : 0;
 }
 
 
-static STACK_OF(X509_NAME)* GetCertificateNames(BIO* bio,
-                                                const char* password) {
-  STACK_OF(X509_NAME)* result = GetCertificateNamesPEM(bio);
-  if (TryPKCS12(result != NULL)) {
-    ERR_clear_error();
-    BIO_reset(bio);
-    result = GetCertificateNamesPKCS12(bio, password);
-  } else if (result != NULL) {
+static int SetClientAuthorities(SSL_CTX* context,
+                                BIO* bio,
+                                const char* password) {
+  int status = SetClientAuthoritiesPEM(context, bio);
+  if (status == 0) {
+    if (NoPEMStartLine()) {
+      ERR_clear_error();
+      BIO_reset(bio);
+      status = SetClientAuthoritiesPKCS12(context, bio, password);
+    }
+  } else {
     // The PEM file was successfully parsed.
     ERR_clear_error();
   }
-  return result;
+  return status;
 }
 
 
@@ -1020,19 +961,16 @@
     Dart_NativeArguments args) {
   SSL_CTX* context = GetSecurityContext(args);
   const char* password = GetPasswordArgument(args, 2);
-  STACK_OF(X509_NAME)* certificate_names;
 
+  int status;
   {
     ScopedMemBIO bio(ThrowIfError(Dart_GetNativeArgument(args, 1)));
-    certificate_names = GetCertificateNames(bio.bio(), password);
+    status = SetClientAuthorities(context, bio.bio(), password);
   }
 
-  if (certificate_names != NULL) {
-    SSL_CTX_set_client_CA_list(context, certificate_names);
-  } else {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "Could not load certificate names from file in SetClientAuthorities"));
-  }
+  CheckStatus(status,
+      "TlsException",
+      "Failure in setClientAuthoritiesBytes");
 }
 
 
diff --git a/runtime/lib/regexp.cc b/runtime/lib/regexp.cc
index 47b4245..e3907d3 100644
--- a/runtime/lib/regexp.cc
+++ b/runtime/lib/regexp.cc
@@ -88,7 +88,7 @@
   GET_NON_NULL_NATIVE_ARGUMENT(String, subject, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_index, arguments->NativeArgAt(2));
 
-  if (FLAG_interpret_irregexp) {
+  if (FLAG_interpret_irregexp || FLAG_precompiled_runtime) {
     return BytecodeRegExpMacroAssembler::Interpret(regexp, subject, start_index,
                                                    zone);
   }
diff --git a/runtime/observatory/lib/src/app/application.dart b/runtime/observatory/lib/src/app/application.dart
index 644b659..e2d5126 100644
--- a/runtime/observatory/lib/src/app/application.dart
+++ b/runtime/observatory/lib/src/app/application.dart
@@ -87,6 +87,8 @@
   }
 
   void _onEvent(ServiceEvent event) {
+    assert(event.kind != ServiceEvent.kNone);
+
     switch(event.kind) {
       case ServiceEvent.kVMUpdate:
       case ServiceEvent.kIsolateStart:
diff --git a/runtime/observatory/lib/src/elements/debugger.dart b/runtime/observatory/lib/src/elements/debugger.dart
index 6595447..81541ef 100644
--- a/runtime/observatory/lib/src/elements/debugger.dart
+++ b/runtime/observatory/lib/src/elements/debugger.dart
@@ -1524,7 +1524,9 @@
   }
 
   void _reportPause(ServiceEvent event) {
-    if (event.kind == ServiceEvent.kPauseStart) {
+    if (event.kind == ServiceEvent.kNone) {
+      console.print("Paused until embedder makes the isolate runnable.");
+    } else if (event.kind == ServiceEvent.kPauseStart) {
       console.print(
           "Paused at isolate start "
           "(type 'continue' [F7] or 'step' [F10] to start the isolate')");
diff --git a/runtime/observatory/lib/src/elements/isolate_summary.html b/runtime/observatory/lib/src/elements/isolate_summary.html
index 64361ed..c089da9 100644
--- a/runtime/observatory/lib/src/elements/isolate_summary.html
+++ b/runtime/observatory/lib/src/elements/isolate_summary.html
@@ -55,6 +55,10 @@
         at isolate exit
       </template>
 
+      <template if="{{ isolate.pauseEvent.kind == 'None' }}">
+        not yet runnable
+      </template>
+
       <template if="{{ isolate.pauseEvent.kind == 'PauseInterrupted' ||
                        isolate.pauseEvent.kind == 'PauseBreakpoint' ||
                        isolate.pauseEvent.kind == 'PauseException' }}">
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index b3a06b9..3345716 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -849,6 +849,7 @@
   // Well-known stream ids.
   static const kVMStream = 'VM';
   static const kIsolateStream = 'Isolate';
+  static const kTimelineStream = 'Timeline';
   static const kDebugStream = 'Debug';
   static const kGCStream = 'GC';
   static const kStdoutStream = 'Stdout';
@@ -1185,7 +1186,7 @@
     if (endPos != null) {
       params['endTokenPos'] = endPos;
     }
-    return invokeRpc('_getSourceReport', params);
+    return invokeRpc('getSourceReport', params);
   }
 
   /// Fetches and builds the class hierarchy for this isolate. Returns the
@@ -1512,6 +1513,7 @@
       case ServiceEvent.kPauseBreakpoint:
       case ServiceEvent.kPauseInterrupted:
       case ServiceEvent.kPauseException:
+      case ServiceEvent.kNone:
       case ServiceEvent.kResume:
         assert((pauseEvent == null) ||
                !event.timestamp.isBefore(pauseEvent.timestamp));
@@ -1821,6 +1823,7 @@
   static const kPauseBreakpoint        = 'PauseBreakpoint';
   static const kPauseInterrupted       = 'PauseInterrupted';
   static const kPauseException         = 'PauseException';
+  static const kNone                   = 'None';
   static const kResume                 = 'Resume';
   static const kBreakpointAdded        = 'BreakpointAdded';
   static const kBreakpointResolved     = 'BreakpointResolved';
@@ -1855,6 +1858,7 @@
   @observable Map logRecord;
   @observable String extensionKind;
   @observable Map extensionData;
+  @observable List timelineEvents;
 
   int chunkIndex, chunkCount, nodeCount;
 
@@ -1863,7 +1867,8 @@
             kind == kPauseExit ||
             kind == kPauseBreakpoint ||
             kind == kPauseInterrupted ||
-            kind == kPauseException);
+            kind == kPauseException ||
+            kind == kNone);
   }
 
   void _update(ObservableMap map, bool mapIsRef) {
@@ -1932,6 +1937,9 @@
       extensionKind = map['extensionKind'];
       extensionData = map['extensionData'];
     }
+    if (map['timelineEvents'] != null) {
+      timelineEvents = map['timelineEvents'];
+    }
   }
 
   String toString() {
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index 006ef5b..2f089b2 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -72,7 +72,7 @@
   // Full script
   var params = { 'reports' : ['Coverage'],
                  'scriptId' : func.location.script.id };
-  var coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params);
+  var coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
   expect(coverage['type'], equals('SourceReport'));
   expect(coverage['ranges'].length, 6);
   expect(coverage['ranges'][0], equals(expectedRange));
@@ -85,7 +85,7 @@
   params = { 'reports' : ['Coverage'],
              'scriptId' : func.location.script.id,
              'forceCompile' : true };
-  coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params);
+  coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
   expect(coverage['type'], equals('SourceReport'));
   expect(coverage['ranges'].length, 6);
   expect(allRangesCompiled(coverage), isTrue);
@@ -95,7 +95,7 @@
              'scriptId' : func.location.script.id,
              'tokenPos' : func.location.tokenPos,
              'endTokenPos' : func.location.endTokenPos };
-  coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params);
+  coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
   expect(coverage['type'], equals('SourceReport'));
   expect(coverage['ranges'].length, 1);
   expect(coverage['ranges'][0], equals(expectedRange));
@@ -105,7 +105,7 @@
 
   // Full isolate
   params = { 'reports' : ['Coverage'] };
-  coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params);
+  coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
   expect(coverage['type'], equals('SourceReport'));
   expect(coverage['ranges'].length, greaterThan(1));
   expect(coverage['scripts'].length, greaterThan(1));
@@ -115,7 +115,7 @@
              'scriptId' : func.location.script.id,
              'tokenPos' : func.location.tokenPos,
              'endTokenPos' : func.location.endTokenPos };
-  coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params);
+  coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
   expect(coverage['type'], equals('SourceReport'));
   expect(coverage['ranges'].length, 1);
   var range = coverage['ranges'][0];
@@ -128,12 +128,12 @@
   try {
     params = { 'reports' : ['Coverage'],
                'tokenPos' : func.location.tokenPos };
-    coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params);
+    coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
   } on ServerRpcException catch(e) {
     caughtException = true;
     expect(e.code, equals(ServerRpcException.kInvalidParams));
     expect(e.message,
-           "_getSourceReport: the 'tokenPos' parameter requires the "
+           "getSourceReport: the 'tokenPos' parameter requires the "
            "\'scriptId\' parameter");
   }
   expect(caughtException, isTrue);
@@ -143,12 +143,12 @@
   try {
     params = { 'reports' : ['Coverage'],
                'endTokenPos' : func.location.endTokenPos };
-    coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params);
+    coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
   } on ServerRpcException catch(e) {
     caughtException = true;
     expect(e.code, equals(ServerRpcException.kInvalidParams));
     expect(e.message,
-           "_getSourceReport: the 'endTokenPos' parameter requires the "
+           "getSourceReport: the 'endTokenPos' parameter requires the "
            "\'scriptId\' parameter");
   }
   expect(caughtException, isTrue);
diff --git a/runtime/observatory/tests/service/pause_idle_isolate_test.dart b/runtime/observatory/tests/service/pause_idle_isolate_test.dart
index cfd418c..a75dcd1 100644
--- a/runtime/observatory/tests/service/pause_idle_isolate_test.dart
+++ b/runtime/observatory/tests/service/pause_idle_isolate_test.dart
@@ -3,55 +3,28 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--error_on_bad_type --error_on_bad_override
 
-import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
-import 'test_helper.dart';
 import 'dart:async';
+import 'dart:developer';
 import 'dart:io';
 import 'dart:isolate' show ReceivePort;
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
 
 var receivePort;
 
 void testMain() {
   receivePort = new ReceivePort();
+  debugger();
 }
 
 var tests = [
 
+hasStoppedAtBreakpoint,
+
 (Isolate isolate) async {
-  Completer completer = new Completer();
-  var stream = await isolate.vm.getEventStream(VM.kDebugStream);
-  var subscription;
-  subscription = stream.listen((ServiceEvent event) {
-    if (event.kind == ServiceEvent.kPauseStart) {
-      print('Received $event');
-      subscription.cancel();
-      completer.complete();
-    }
-  });
-
-  if (isolate.pauseEvent != null &&
-      isolate.pauseEvent.kind == ServiceEvent.kPauseStart) {
-    // Wait for the isolate to hit PauseStart.
-    subscription.cancel();
-  } else {
-    await completer.future;
-  }
-  print('Done waiting for pause event.');
-
-  // Wait for the isolate to pause due to interruption.
-  completer = new Completer();
-  stream = await isolate.vm.getEventStream(VM.kDebugStream);
-  bool receivedInterrupt = false;
-  subscription = stream.listen((ServiceEvent event) {
-    print('Received $event');
-    if (event.kind == ServiceEvent.kPauseInterrupted) {
-      receivedInterrupt = true;
-      subscription.cancel();
-      completer.complete();
-    }
-  });
-
+  print('Resuming...');
   await isolate.resume();
 
   // Wait for the isolate to become idle.  We detect this by querying
@@ -60,21 +33,24 @@
   do {
     var stack = await isolate.getStack();
     frameCount = stack['frames'].length;
-    print('frames: $frameCount');
+    print('Frames: $frameCount');
     sleep(const Duration(milliseconds:10));
   } while (frameCount > 0);
+  print('Isolate is idle.');
+  await isolate.reload();
+  expect(isolate.pauseEvent.kind, equals(ServiceEvent.kResume));
 
   // Make sure that the isolate receives an interrupt even when it is
   // idle. (https://github.com/dart-lang/sdk/issues/24349)
+  var interruptFuture = hasPausedFor(isolate, ServiceEvent.kPauseInterrupted);
+  print('Pausing...');
   await isolate.pause();
-  await completer.future;
-  expect(receivedInterrupt, isTrue);
+  await interruptFuture;
 },
 
 ];
 
 main(args) => runIsolateTests(args, tests,
                               testeeConcurrent: testMain,
-                              pause_on_start: true,
                               trace_service: true,
                               verbose_vm: true);
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index 0e3d8fd..5c71adc 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -17,6 +17,10 @@
 # Tests with known analyzer issues
 [ $compiler == dart2analyzer ]
 developer_extension_test: SkipByDesign
+*: StaticWarning # https://github.com/dart-lang/observe/issues/85
+address_mapper_test: Pass # https://github.com/dart-lang/observe/issues/85
+command_test: Pass # https://github.com/dart-lang/observe/issues/85
+read_stream_test: Pass # https://github.com/dart-lang/observe/issues/85
 
 [ $arch == arm ]
 process_service_test: Pass, Fail # Issue 24344
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 7435ee5..108316c 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -11,6 +11,22 @@
 typedef Future IsolateTest(Isolate isolate);
 typedef Future VMTest(VM vm);
 
+Map<String, StreamSubscription> streamSubscriptions = {};
+
+Future subscribeToStream(VM vm, String streamName, onEvent) async {
+  assert(streamSubscriptions[streamName] == null);
+
+  Stream stream = await vm.getEventStream(streamName);
+  StreamSubscription subscription = stream.listen(onEvent);
+  streamSubscriptions[streamName] = subscription;
+}
+
+Future cancelStreamSubscription(String streamName) async {
+  StreamSubscription subscription = streamSubscriptions[streamName];
+  subscription.cancel();
+  streamSubscriptions.remove(streamName);
+}
+
 Future asyncStepOver(Isolate isolate) async {
   final Completer pausedAtSyntheticBreakpoint = new Completer();
   StreamSubscription subscription;
@@ -88,10 +104,10 @@
     var subscription;
     subscription = stream.listen((ServiceEvent event) {
         if (event.kind == kind) {
-          print('Paused with $kind');
-          subscription.cancel();
           if (completer != null) {
             // Reload to update isolate.pauseEvent.
+            print('Paused with $kind');
+            subscription.cancel();
             completer.complete(isolate.reload());
             completer = null;
           }
@@ -103,9 +119,9 @@
       if ((isolate.pauseEvent != null) &&
          (isolate.pauseEvent.kind == kind)) {
         // Already waiting at a breakpoint.
-        print('Paused with $kind');
-        subscription.cancel();
         if (completer != null) {
+          print('Paused with $kind');
+          subscription.cancel();
           completer.complete(isolate);
           completer = null;
         }
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index 91cb11e..e22cbb2 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -19,6 +19,7 @@
   return e is NetworkRpcException;
 }
 
+
 const String _TESTEE_ENV_KEY = 'SERVICE_TEST_TESTEE';
 const Map<String, String> _TESTEE_SPAWN_ENV = const {
   _TESTEE_ENV_KEY: 'true'
@@ -27,6 +28,14 @@
   return Platform.environment.containsKey(_TESTEE_ENV_KEY);
 }
 
+const String _SKY_SHELL_ENV_KEY = 'SERVICE_TEST_SKY_SHELL';
+bool _shouldLaunchSkyShell() {
+  return Platform.environment.containsKey(_SKY_SHELL_ENV_KEY);
+}
+String _skyShellPath() {
+  return Platform.environment[_SKY_SHELL_ENV_KEY];
+}
+
 class _SerivceTesteeRunner {
   Future run({testeeBefore(): null,
               testeeConcurrent(): null,
@@ -79,10 +88,7 @@
   bool killedByTester = false;
 
   _ServiceTesteeLauncher() :
-      args = ['--enable-vm-service:0',
-              Platform.script.toFilePath()] {}
-
-  String get executablePath => Platform.executable;
+      args = [Platform.script.toFilePath()] {}
 
   // Spawn the testee process.
   Future<Process> _spawnProcess(bool pause_on_start,
@@ -92,11 +98,38 @@
                                 bool trace_compiler) {
     assert(pause_on_start != null);
     assert(pause_on_exit != null);
+    assert(pause_on_unhandled_exceptions != null);
     assert(trace_service != null);
+    assert(trace_compiler != null);
+
     // TODO(turnidge): I have temporarily turned on service tracing for
     // all tests to help diagnose flaky tests.
     trace_service = true;
+
+    if (_shouldLaunchSkyShell()) {
+      return _spawnSkyProcess(pause_on_start,
+                              pause_on_exit,
+                              pause_on_unhandled_exceptions,
+                              trace_service,
+                              trace_compiler);
+    } else {
+      return _spawnDartProcess(pause_on_start,
+                               pause_on_exit,
+                               pause_on_unhandled_exceptions,
+                               trace_service,
+                               trace_compiler);
+    }
+  }
+
+  Future<Process> _spawnDartProcess(bool pause_on_start,
+                                    bool pause_on_exit,
+                                    bool pause_on_unhandled_exceptions,
+                                    bool trace_service,
+                                    bool trace_compiler) {
+    assert(!_shouldLaunchSkyShell());
+
     String dartExecutable = Platform.executable;
+
     var fullArgs = [];
     if (trace_service) {
       fullArgs.add('--trace-service');
@@ -114,12 +147,56 @@
     if (pause_on_unhandled_exceptions) {
       fullArgs.add('--pause-isolates-on-unhandled-exceptions');
     }
+
     fullArgs.addAll(Platform.executableArguments);
+    fullArgs.add('--enable-vm-service:0');
     fullArgs.addAll(args);
-    print('** Launching $dartExecutable ${fullArgs.join(' ')}');
-    return Process.start(dartExecutable,
-                         fullArgs,
-                         environment: _TESTEE_SPAWN_ENV);
+
+    return _spawnCommon(dartExecutable, fullArgs);
+  }
+
+  Future<Process> _spawnSkyProcess(bool pause_on_start,
+                                   bool pause_on_exit,
+                                   bool pause_on_unhandled_exceptions,
+                                   bool trace_service,
+                                   bool trace_compiler) {
+    assert(_shouldLaunchSkyShell());
+
+    String dartExecutable = _skyShellPath();
+
+    var dartFlags = [];
+    var fullArgs = [];
+    if (trace_service) {
+      dartFlags.add('--trace_service');
+      dartFlags.add('--trace_service_verbose');
+    }
+    if (trace_compiler) {
+      dartFlags.add('--trace_compiler');
+    }
+    if (pause_on_start) {
+      dartFlags.add('--pause_isolates_on_start');
+      fullArgs.add('--start-paused');
+    }
+    if (pause_on_exit) {
+      dartFlags.add('--pause_isolates_on_exit');
+    }
+    if (pause_on_unhandled_exceptions) {
+      dartFlags.add('--pause_isolates_on_unhandled_exceptions');
+    }
+    // Override mirrors.
+    dartFlags.add('--enable_mirrors=true');
+
+    fullArgs.addAll(Platform.executableArguments);
+    fullArgs.add('--observatory-port=0');
+    fullArgs.add('--dart-flags=${dartFlags.join(' ')}');
+    fullArgs.addAll(args);
+
+    return _spawnCommon(dartExecutable, fullArgs);
+  }
+
+  Future<Process> _spawnCommon(String executable, List<String> arguments) {
+    print('** Launching $executable ${arguments.join(' ')}');
+    return Process.start(executable, arguments, environment: _TESTEE_SPAWN_ENV);
   }
 
   Future<int> launch(bool pause_on_start,
@@ -198,37 +275,39 @@
       serviceWebsocketAddress = 'ws://localhost:$port/ws';
       serviceHttpAddress = 'http://localhost:$port';
       var name = Platform.script.pathSegments.last;
-      runZoned(() {
-        new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress)).load()
-            .then((VM vm) async {
+      runZoned(() async {
+        var vm =
+            new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress));
+        print('Loading VM...');
+        await vm.load();
+        print('Done loading VM');
 
-              // Run vm tests.
-              if (vmTests != null) {
-                var testIndex = 1;
-                var totalTests = vmTests.length;
-                for (var test in vmTests) {
-                  vm.verbose = verbose_vm;
-                  print('Running $name [$testIndex/$totalTests]');
-                  testIndex++;
-                  await test(vm);
-                }
-              }
+        // Run vm tests.
+        if (vmTests != null) {
+          var testIndex = 1;
+          var totalTests = vmTests.length;
+          for (var test in vmTests) {
+            vm.verbose = verbose_vm;
+            print('Running $name [$testIndex/$totalTests]');
+            testIndex++;
+            await test(vm);
+          }
+        }
 
-              // Run isolate tests.
-              if (isolateTests != null) {
-                var isolate = await vm.isolates.first.load();
-                var testIndex = 1;
-                var totalTests = isolateTests.length;
-                for (var test in isolateTests) {
-                  vm.verbose = verbose_vm;
-                  print('Running $name [$testIndex/$totalTests]');
-                  testIndex++;
-                  await test(isolate);
-                }
-              }
+        // Run isolate tests.
+        if (isolateTests != null) {
+          var isolate = await vm.isolates.first.load();
+          var testIndex = 1;
+          var totalTests = isolateTests.length;
+          for (var test in isolateTests) {
+            vm.verbose = verbose_vm;
+            print('Running $name [$testIndex/$totalTests]');
+            testIndex++;
+            await test(isolate);
+          }
+        }
 
-              await process.requestExit();
-            });
+        await process.requestExit();
       }, onError: (e, st) {
         process.requestExit();
         if (!_isWebSocketDisconnect(e)) {
diff --git a/runtime/observatory/tests/service/vm_timeline_events_test.dart b/runtime/observatory/tests/service/vm_timeline_events_test.dart
new file mode 100644
index 0000000..c84411e
--- /dev/null
+++ b/runtime/observatory/tests/service/vm_timeline_events_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'dart:async';
+import 'dart:developer';
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+primeDartTimeline() {
+  while (true) {
+    Timeline.startSync('apple');
+    Timeline.finishSync();
+  }
+}
+
+bool isDart(Map event) => event['cat'] == 'Dart';
+
+List<Map> filterEvents(List<Map> events, filter) {
+  return events.where(filter).toList();
+}
+
+Completer completer = new Completer();
+int eventCount = 0;
+
+onTimelineEvent(ServiceEvent event) {
+  eventCount++;
+  expect(filterEvents(event.timelineEvents, isDart).length, greaterThan(0));
+  if (eventCount == 5) {
+    completer.complete(eventCount);
+  }
+}
+
+var tests = [
+  (Isolate isolate) async {
+    // Subscribe to the Timeline stream.
+    await subscribeToStream(isolate.vm, VM.kTimelineStream, onTimelineEvent);
+  },
+  (Isolate isolate) async {
+    // Ensure we don't get any events before enabling Dart.
+    await new Future.delayed(new Duration(seconds: 5));
+    expect(eventCount, 0);
+  },
+  (Isolate isolate) async {
+    // Get the flags.
+    Map flags = await isolate.vm.invokeRpcNoUpgrade('_getVMTimelineFlags', {});
+    expect(flags['type'], 'TimelineFlags');
+    // Confirm that 'Dart' is available.
+    expect(flags['availableStreams'].contains('Dart'), isTrue);
+    // Confirm that nothing is being recorded.
+    expect(flags['recordedStreams'].length, equals(0));
+  },
+  (Isolate isolate) async {
+    // Enable the Dart category.
+    await isolate.vm.invokeRpcNoUpgrade('_setVMTimelineFlags', {
+      "recordedStreams": ["Dart"]
+    });
+  },
+  (Isolate isolate) async {
+    // Wait to receive events.
+    await completer.future;
+    cancelStreamSubscription(VM.kTimelineStream);
+  },
+];
+
+main(args) async => runIsolateTests(args,
+                                    tests,
+                                    testeeConcurrent: primeDartTimeline);
diff --git a/runtime/tests/vm/dart/byte_array_optimized_test.dart b/runtime/tests/vm/dart/byte_array_optimized_test.dart
index 8492798..755c3b1 100644
--- a/runtime/tests/vm/dart/byte_array_optimized_test.dart
+++ b/runtime/tests/vm/dart/byte_array_optimized_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library byte_array_test;
diff --git a/runtime/tests/vm/dart/byte_array_test.dart b/runtime/tests/vm/dart/byte_array_test.dart
index f1ff69e..048e2e7 100644
--- a/runtime/tests/vm/dart/byte_array_test.dart
+++ b/runtime/tests/vm/dart/byte_array_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10 --disable_alloc_stubs_after_gc
+// VMOptions=--optimization_counter_threshold=10 --disable_alloc_stubs_after_gc --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library byte_array_test;
diff --git a/runtime/tests/vm/dart/inline_stack_frame_test.dart b/runtime/tests/vm/dart/inline_stack_frame_test.dart
index 62fa819..e553855 100644
--- a/runtime/tests/vm/dart/inline_stack_frame_test.dart
+++ b/runtime/tests/vm/dart/inline_stack_frame_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index da20917..a0c7a40 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -36,10 +36,6 @@
 [ $arch == simarm || $arch == simarmv6 || $arch == simarmv5te || $arch == simarm64 || $arch == simmips ]
 cc/Service_Profile: Skip
 
-[ $arch == arm ]
-cc/Int8ListLengthMaxElements: Skip # Issue 23314
-cc/ArrayLengthMaxElements: Skip # Issue 23314
-
 [ $compiler == dart2js ]
 dart/redirection_type_shuffling_test: Skip # Depends on lazy enforcement of type bounds
 dart/byte_array_test: Skip # compilers not aware of byte arrays
@@ -55,13 +51,14 @@
 # minifying they can be renamed, which is issue 7953.
 dart/inline_stack_frame_test: RuntimeError, Pass # Issue 7953
 
+[ $compiler == dart2js && $cps_ir && $checked ]
+dart/inline_stack_frame_test: Crash # Unable to compile ArgumentError.message
+
 [ $compiler == dart2js || $compiler == dart2analyzer ]
 # Data uri's not supported by dart2js or the analyzer.
 dart/data_uri*test: Skip
 
 [ $arch == mips ]
-cc/StaticNonNullSumCallCodegen: Crash, Pass # Issue 17440
-cc/ArrayLengthMaxElements: Crash  # Issue 23275
 cc/Int8ListLengthMaxElements: Skip # Issue 23536, uses 1 GB memory.
 
 [ $arch == mips && $mode == debug ]
@@ -84,7 +81,7 @@
 [ $noopt ]
 dart/byte_array_test: Crash # Incompatible flag --disable_alloc_stubs_after_gc
 
-[ $noopt || $compiler == precompiler || $compiler == dart2app ]
+[ $noopt || $compiler == precompiler || $mode == product ]
 dart/redirection_type_shuffling_test: CompileTimeError # Imports dart:mirrors
 
 [ $noopt || $runtime == dart_precompiled ]
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
index f813eb8..49f9f18 100644
--- a/runtime/vm/aot_optimizer.cc
+++ b/runtime/vm/aot_optimizer.cc
@@ -2406,8 +2406,11 @@
   return false;
 }
 
-// Special optimizations when running in --noopt mode.
-void AotOptimizer::InstanceCallNoopt(InstanceCallInstr* instr) {
+
+// Tries to optimize instance call by replacing it with a faster instruction
+// (e.g, binary op, field load, ..).
+void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
+  ASSERT(FLAG_precompiled_mode);
   // TODO(srdjan): Investigate other attempts, as they are not allowed to
   // deoptimize.
 
@@ -2484,6 +2487,33 @@
       return;
     }
   }
+  switch (instr->token_kind()) {
+    case Token::kEQ:
+    case Token::kLT:
+    case Token::kLTE:
+    case Token::kGT:
+    case Token::kGTE:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+    case Token::kBIT_AND:
+    case Token::kADD:
+    case Token::kSUB: {
+      if (HasOnlyTwoOf(*instr->ic_data(), kSmiCid)) {
+        Definition* left = instr->ArgumentAt(0);
+        Definition* right = instr->ArgumentAt(1);
+        CheckedSmiOpInstr* smi_op =
+            new(Z) CheckedSmiOpInstr(instr->token_kind(),
+                                     new(Z) Value(left),
+                                     new(Z) Value(right),
+                                     instr);
+
+        ReplaceCall(instr, smi_op);
+        return;
+      }
+    }
+    default:
+      break;
+  }
 
   // More than one targets. Generate generic polymorphic call without
   // deoptimization.
@@ -2539,19 +2569,10 @@
         new(Z) PolymorphicInstanceCallInstr(instr, ic_data,
                                             /* with_checks = */ false);
     instr->ReplaceWith(call, current_iterator());
-    return;
   }
 }
 
 
-// Tries to optimize instance call by replacing it with a faster instruction
-// (e.g, binary op, field load, ..).
-void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
-  ASSERT(FLAG_precompiled_mode);
-  InstanceCallNoopt(instr);
-}
-
-
 void AotOptimizer::VisitStaticCall(StaticCallInstr* call) {
   if (!CanUnboxDouble()) {
     return;
@@ -2712,41 +2733,6 @@
 }
 
 
-void AotOptimizer::VisitAllocateContext(AllocateContextInstr* instr) {
-  // Replace generic allocation with a sequence of inlined allocation and
-  // explicit initalizing stores.
-  AllocateUninitializedContextInstr* replacement =
-      new AllocateUninitializedContextInstr(instr->token_pos(),
-                                            instr->num_context_variables());
-  instr->ReplaceWith(replacement, current_iterator());
-
-  StoreInstanceFieldInstr* store =
-      new(Z) StoreInstanceFieldInstr(Context::parent_offset(),
-                                     new Value(replacement),
-                                     new Value(flow_graph_->constant_null()),
-                                     kNoStoreBarrier,
-                                     instr->token_pos());
-  // Storing into uninitialized memory; remember to prevent dead store
-  // elimination and ensure proper GC barrier.
-  store->set_is_object_reference_initialization(true);
-  flow_graph_->InsertAfter(replacement, store, NULL, FlowGraph::kEffect);
-  Definition* cursor = store;
-  for (intptr_t i = 0; i < instr->num_context_variables(); ++i) {
-    store =
-        new(Z) StoreInstanceFieldInstr(Context::variable_offset(i),
-                                       new Value(replacement),
-                                       new Value(flow_graph_->constant_null()),
-                                       kNoStoreBarrier,
-                                       instr->token_pos());
-    // Storing into uninitialized memory; remember to prevent dead store
-    // elimination and ensure proper GC barrier.
-    store->set_is_object_reference_initialization(true);
-    flow_graph_->InsertAfter(cursor, store, NULL, FlowGraph::kEffect);
-    cursor = store;
-  }
-}
-
-
 void AotOptimizer::VisitLoadCodeUnits(LoadCodeUnitsInstr* instr) {
   // TODO(zerny): Use kUnboxedUint32 once it is fully supported/optimized.
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
diff --git a/runtime/vm/aot_optimizer.h b/runtime/vm/aot_optimizer.h
index 3d1ed1b..97c996a 100644
--- a/runtime/vm/aot_optimizer.h
+++ b/runtime/vm/aot_optimizer.h
@@ -48,7 +48,6 @@
 
   virtual void VisitStaticCall(StaticCallInstr* instr);
   virtual void VisitInstanceCall(InstanceCallInstr* instr);
-  virtual void VisitAllocateContext(AllocateContextInstr* instr);
   virtual void VisitLoadCodeUnits(LoadCodeUnitsInstr* instr);
 
   void InsertBefore(Instruction* next,
@@ -67,7 +66,6 @@
 
   bool TryReplaceWithIndexedOp(InstanceCallInstr* call);
 
-
   bool TryReplaceWithBinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
   bool TryReplaceWithUnaryOp(InstanceCallInstr* call, Token::Kind op_kind);
 
@@ -159,8 +157,6 @@
                                        Representation rep, intptr_t cid);
   bool TryStringLengthOneEquality(InstanceCallInstr* call, Token::Kind op_kind);
 
-  void InstanceCallNoopt(InstanceCallInstr* instr);
-
   RawField* GetField(intptr_t class_id, const String& field_name);
 
   Thread* thread() const { return flow_graph_->thread(); }
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index 1654ac9..0ca7945 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -585,6 +585,12 @@
     EmitRType(SPECIAL2, rs, rd, rd, 0, CLZ);
   }
 
+  // Convert a double in ds to a 32-bit signed int in fd rounding towards 0.
+  void truncwd(FRegister fd, DRegister ds) {
+    FRegister fs = static_cast<FRegister>(ds * 2);
+    EmitFpuRType(COP1, FMT_D, F0, fs, fd, COP1_TRUNC_W);
+  }
+
   // Convert a 32-bit float in fs to a 64-bit double in dd.
   void cvtds(DRegister dd, FRegister fs) {
     FRegister fd = static_cast<FRegister>(dd * 2);
@@ -597,23 +603,12 @@
     EmitFpuRType(COP1, FMT_W, F0, fs, fd, COP1_CVT_D);
   }
 
-  // Converts a 64-bit signed int in fs to a double in fd.
-  void cvtdl(DRegister dd, DRegister ds) {
-    FRegister fs = static_cast<FRegister>(ds * 2);
-    FRegister fd = static_cast<FRegister>(dd * 2);
-    EmitFpuRType(COP1, FMT_L, F0, fs, fd, COP1_CVT_D);
-  }
-
+  // Convert a 64-bit double in ds to a 32-bit float in fd.
   void cvtsd(FRegister fd, DRegister ds) {
     FRegister fs = static_cast<FRegister>(ds * 2);
     EmitFpuRType(COP1, FMT_D, F0, fs, fd, COP1_CVT_S);
   }
 
-  void cvtwd(FRegister fd, DRegister ds) {
-    FRegister fs = static_cast<FRegister>(ds * 2);
-    EmitFpuRType(COP1, FMT_D, F0, fs, fd, COP1_CVT_W);
-  }
-
   void div(Register rs, Register rt) {
     EmitRType(SPECIAL, rs, rt, R0, 0, DIV);
   }
diff --git a/runtime/vm/assembler_mips_test.cc b/runtime/vm/assembler_mips_test.cc
index e3cad3d..2072751 100644
--- a/runtime/vm/assembler_mips_test.cc
+++ b/runtime/vm/assembler_mips_test.cc
@@ -1976,6 +1976,101 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD, assembler) {
+  __ LoadImmediate(D1, 42.9);
+  __ truncwd(F0, D1);
+  __ mfc1(V0, F0);
+  __ Ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Cop1TruncWD, test) {
+  typedef int (*SimpleCode)() DART_UNUSED;
+  EXPECT(test != NULL);
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_neg, assembler) {
+  __ LoadImmediate(D1, -42.9);
+  __ truncwd(F0, D1);
+  __ mfc1(V0, F0);
+  __ Ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Cop1TruncWD_neg, test) {
+  typedef int (*SimpleCode)() DART_UNUSED;
+  EXPECT(test != NULL);
+  EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_NaN, assembler) {
+  // Double non-signaling NaN is 0x7FF8000000000000.
+  __ LoadImmediate(T0, 0x7FF80000);
+  __ mtc1(ZR, F2);  // Load upper bits of NaN.
+  __ mtc1(T0, F3);  // Load lower bits of NaN.
+  __ truncwd(F0, D1);
+  __ mfc1(V0, F0);
+  __ Ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Cop1TruncWD_NaN, test) {
+  typedef int (*SimpleCode)() DART_UNUSED;
+  EXPECT(test != NULL);
+  EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Inf, assembler) {
+  __ LoadImmediate(T0, 0x7FF00000);  // +inf
+  __ mtc1(ZR, F2);
+  __ mtc1(T0, F3);
+  __ truncwd(F0, D1);
+  __ mfc1(V0, F0);
+  __ Ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Cop1TruncWD_Inf, test) {
+  typedef int (*SimpleCode)() DART_UNUSED;
+  EXPECT(test != NULL);
+  EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Overflow, assembler) {
+  __ LoadImmediate(D1, 2.0*kMaxInt32);
+  __ truncwd(F0, D1);
+  __ mfc1(V0, F0);
+  __ Ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Cop1TruncWD_Overflow, test) {
+  typedef int (*SimpleCode)() DART_UNUSED;
+  EXPECT(test != NULL);
+  EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Underflow, assembler) {
+  __ LoadImmediate(D1, 2.0*kMinInt32);
+  __ truncwd(F0, D1);
+  __ mfc1(V0, F0);
+  __ Ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Cop1TruncWD_Underflow, test) {
+  typedef int (*SimpleCode)() DART_UNUSED;
+  EXPECT(test != NULL);
+  EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
 ASSEMBLER_TEST_GENERATE(Cop1CvtDW, assembler) {
   __ LoadImmediate(T0, 42);
   __ mtc1(T0, F2);
@@ -2008,78 +2103,6 @@
 }
 
 
-ASSEMBLER_TEST_GENERATE(Cop1CvtDL, assembler) {
-  if (TargetCPUFeatures::mips_version() == MIPS32r2) {
-    __ LoadImmediate(T0, 0x1);
-    __ mtc1(ZR, F2);
-    __ mtc1(T0, F3);  // D0 <- 0x100000000 = 4294967296
-    __ cvtdl(D0, D1);
-  } else {
-    __ LoadImmediate(D0, 4294967296.0);
-  }
-  __ Ret();
-}
-
-
-ASSEMBLER_TEST_RUN(Cop1CvtDL, test) {
-  typedef double (*SimpleCode)() DART_UNUSED;
-  EXPECT(test != NULL);
-  double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry());
-  EXPECT_FLOAT_EQ(4294967296.0, res, 0.001);
-}
-
-
-ASSEMBLER_TEST_GENERATE(Cop1CvtDL_neg, assembler) {
-  if (TargetCPUFeatures::mips_version() == MIPS32r2) {
-    __ LoadImmediate(T0, 0xffffffff);
-    __ mtc1(T0, F2);
-    __ mtc1(T0, F3);  // D0 <- 0xffffffffffffffff = -1
-    __ cvtdl(D0, D1);
-  } else {
-    __ LoadImmediate(D0, -1.0);
-  }
-  __ Ret();
-}
-
-
-ASSEMBLER_TEST_RUN(Cop1CvtDL_neg, test) {
-  typedef double (*SimpleCode)() DART_UNUSED;
-  EXPECT(test != NULL);
-  double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry());
-  EXPECT_FLOAT_EQ(-1.0, res, 0.001);
-}
-
-
-ASSEMBLER_TEST_GENERATE(Cop1CvtWD, assembler) {
-  __ LoadImmediate(D1, 42.0);
-  __ cvtwd(F0, D1);
-  __ mfc1(V0, F0);
-  __ Ret();
-}
-
-
-ASSEMBLER_TEST_RUN(Cop1CvtWD, test) {
-  typedef int (*SimpleCode)() DART_UNUSED;
-  EXPECT(test != NULL);
-  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
-}
-
-
-ASSEMBLER_TEST_GENERATE(Cop1CvtWD_neg, assembler) {
-  __ LoadImmediate(D1, -42.0);
-  __ cvtwd(F0, D1);
-  __ mfc1(V0, F0);
-  __ Ret();
-}
-
-
-ASSEMBLER_TEST_RUN(Cop1CvtWD_neg, test) {
-  typedef int (*SimpleCode)() DART_UNUSED;
-  EXPECT(test != NULL);
-  EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
-}
-
-
 ASSEMBLER_TEST_GENERATE(Cop1CvtSD, assembler) {
   __ LoadImmediate(D2, -42.42);
   __ cvtsd(F2, D2);
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index bb1b624..7d7f3f4 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -13,14 +13,8 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, trace_ast_visitor, false,
-            "Trace AstVisitor.");
-
 #define DEFINE_VISIT_FUNCTION(BaseName)                                        \
 void BaseName##Node::Visit(AstNodeVisitor* visitor) {                          \
-  if (FLAG_trace_ast_visitor) {                                                \
-    THR_Print("Visiting %s\n", Name());                                        \
-  }                                                                            \
   visitor->Visit##BaseName##Node(this);                                        \
 }
 
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index 5b3d78d..bc9885d 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -12,7 +12,7 @@
 namespace dart {
 
 static intptr_t GetEdgeCount(const Array& edge_counters, intptr_t edge_id) {
-  if (!FLAG_emit_edge_counters) {
+  if (!FLAG_reorder_basic_blocks) {
     // Assume everything was visited once.
     return 1;
   }
@@ -53,7 +53,7 @@
 
 
 void BlockScheduler::AssignEdgeWeights() const {
-  if (!FLAG_emit_edge_counters) {
+  if (!FLAG_reorder_basic_blocks) {
     return;
   }
 
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 7129cf8..8cb9fa1 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "vm/atomic.h"
 #include "vm/class_table.h"
 #include "vm/flags.h"
 #include "vm/freelist.h"
@@ -106,11 +107,9 @@
     // Add the vtable for this predefined class into the static vtable registry
     // if it has not been setup yet.
     cpp_vtable cls_vtable = cls.handle_vtable();
-    cpp_vtable table_entry = Object::builtin_vtables_[index];
-    ASSERT((table_entry == 0) || (table_entry == cls_vtable));
-    if (table_entry == 0) {
-      Object::builtin_vtables_[index] = cls_vtable;
-    }
+    AtomicOperations::CompareAndSwapWord(
+        &(Object::builtin_vtables_[index]), 0, cls_vtable);
+    ASSERT(Object::builtin_vtables_[index] == cls_vtable);
   } else {
     if (top_ == capacity_) {
       // Grow the capacity of the class table.
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index dad76d9..b7b4326 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -124,7 +124,7 @@
                               list_[i].pc_offset,
                               list_[i].needs_stacktrace,
                               has_catch_all);
-      handlers.SetHandledTypes(i, Array::null_array());
+      handlers.SetHandledTypes(i, Array::empty_array());
     } else {
       const bool has_catch_all = ContainsDynamic(*list_[i].handler_types);
       handlers.SetHandlerInfo(i,
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 758c2e0..652cdc2 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -32,6 +32,10 @@
 DEFINE_FLAG(int, regexp_optimization_counter_threshold, 1000,
     "RegExp's usage-counter value before it is optimized, -1 means never");
 DEFINE_FLAG(charp, optimization_filter, NULL, "Optimize only named function");
+// TODO(srdjan): Remove this flag once background compilation of regular
+// expressions is possible.
+DEFINE_FLAG(bool, regexp_opt_in_background, false,
+    "Optimize reg-exp functions in background");
 DEFINE_FLAG(int, reoptimization_counter_threshold, 4000,
     "Counter threshold before a function gets reoptimized.");
 DEFINE_FLAG(bool, stop_on_excessive_deoptimization, false,
@@ -1349,7 +1353,7 @@
       ActivationFrame* frame = stack->FrameAt(i);
       // Variable locations and number are unknown when precompiling.
       const int num_vars =
-         FLAG_precompiled_mode ? 0 : frame->NumLocalVariables();
+         FLAG_precompiled_runtime ? 0 : frame->NumLocalVariables();
       TokenPosition unused = TokenPosition::kNoSource;
       for (intptr_t v = 0; v < num_vars; v++) {
         frame->VariableAt(v, &var_name, &unused, &unused, &var_value);
@@ -1461,7 +1465,8 @@
       }
     }
     // TODO(srdjan): Fix background compilation of regular expressions.
-    if (FLAG_background_compilation) {
+    if (FLAG_background_compilation &&
+        (!function.IsIrregexpFunction() || FLAG_regexp_opt_in_background)) {
       if (FLAG_enable_inlining_annotations) {
         FATAL("Cannot enable inlining annotations and background compilation");
       }
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index dd2ddee..6365b3c 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -61,7 +61,6 @@
     "Print the deopt-id to ICData map in optimizing compiler.");
 DEFINE_FLAG(bool, print_code_source_map, false, "Print code source map.");
 DEFINE_FLAG(bool, range_analysis, true, "Enable range analysis");
-DEFINE_FLAG(bool, reorder_basic_blocks, true, "Enable basic-block reordering.");
 DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations.");
 DEFINE_FLAG(bool, trace_optimizing_compiler, false,
     "Trace only optimizing compiler operations.");
@@ -107,6 +106,7 @@
   // Variables are allocated after compilation.
 }
 
+
 FlowGraph* IrregexpCompilationPipeline::BuildFlowGraph(
     Zone* zone,
     ParsedFunction* parsed_function,
@@ -133,10 +133,12 @@
                              result.num_blocks);
 }
 
+
 void IrregexpCompilationPipeline::FinalizeCompilation() {
   backtrack_goto_->ComputeOffsetTable();
 }
 
+
 CompilationPipeline* CompilationPipeline::New(Zone* zone,
                                               const Function& function) {
   if (function.IsIrregexpFunction()) {
@@ -701,8 +703,12 @@
                                                  compiler_timeline,
                                                  "OptimizationPasses"));
         inline_id_to_function.Add(&function);
-        inline_id_to_token_pos.Add(function.token_pos());
-        // Top scope function has no caller (-1).
+        // We do not add the token position now because we don't know the
+        // position of the inlined call until later. A side effect of this
+        // is that the length of |inline_id_to_function| is always larger
+        // than the length of |inline_id_to_token_pos| by one.
+        // Top scope function has no caller (-1). We do this because we expect
+        // all token positions to be at an inlined call.
         caller_inline_id.Add(-1);
         CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer);
 
@@ -1288,8 +1294,11 @@
 
   // Optimization must happen in non-mutator/Dart thread if background
   // compilation is on. OSR compilation still occurs in the main thread.
+  // TODO(Srdjan): Remove assert allowance for regular expression functions
+  // once they can be compiled in background.
   ASSERT((osr_id != kNoOSRDeoptId) || !FLAG_background_compilation ||
-         !thread->IsMutatorThread());
+         !thread->IsMutatorThread() ||
+         function.IsIrregexpFunction());
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
   return CompileFunctionHelper(pipeline,
diff --git a/runtime/vm/constant_propagator.cc b/runtime/vm/constant_propagator.cc
index fa21b0f..03ab8ae 100644
--- a/runtime/vm/constant_propagator.cc
+++ b/runtime/vm/constant_propagator.cc
@@ -937,6 +937,11 @@
 }
 
 
+void ConstantPropagator::VisitCheckedSmiOp(CheckedSmiOpInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitBinarySmiOp(BinarySmiOpInstr* instr) {
   VisitBinaryIntegerOp(instr);
 }
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index ccf437a..bcde75e 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -440,9 +440,9 @@
   COP1_SQRT = 0x04,
   COP1_MOV = 0x06,
   COP1_NEG = 0x07,
+  COP1_TRUNC_W = 0x0d,
   COP1_CVT_S = 0x20,
   COP1_CVT_D = 0x21,
-  COP1_CVT_W = 0x24,
   COP1_C_F = 0x30,
   COP1_C_UN = 0x31,
   COP1_C_EQ = 0x32,
diff --git a/runtime/vm/custom_isolate_test.cc b/runtime/vm/custom_isolate_test.cc
index d720f70..1995ee6 100644
--- a/runtime/vm/custom_isolate_test.cc
+++ b/runtime/vm/custom_isolate_test.cc
@@ -321,7 +321,9 @@
   bool saved_flag = FLAG_trace_shutdown;
   FLAG_trace_shutdown = true;
   FLAG_verify_handles = true;
+#ifdef DEBUG
   FLAG_verify_on_transition = true;
+#endif
   event_queue = new EventQueue();
 
   Dart_Isolate dart_isolate = TestCase::CreateTestIsolate();
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index bef0ebb..36ef3f0 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -472,7 +472,7 @@
     }
   }
 
-  I->heap()->EnableGrowthControl();
+  I->heap()->InitGrowthControl();
   I->set_init_callback_data(data);
   Api::SetupAcquiredError(I);
   if (FLAG_print_class_table) {
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 4c6fd00..3b94487 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1145,7 +1145,7 @@
     Dart_FileCloseCallback file_close,
     Dart_EntropySource entropy_source,
     Dart_GetVMServiceAssetsArchive get_service_assets) {
-  if ((instructions_snapshot != NULL) && !FLAG_precompiled_mode) {
+  if ((instructions_snapshot != NULL) && !FLAG_precompiled_runtime) {
     return strdup("Flag --precompilation was not specified.");
   }
   if (interrupt != NULL) {
@@ -6096,7 +6096,7 @@
 }
 
 
-// The precompiler is included in dart_no_snapshot and dart_noopt, and
+// The precompiler is included in dart_bootstrap and dart_noopt, and
 // excluded from dart and dart_precompiled_runtime.
 #if !defined(DART_PRECOMPILER)
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index dda7b34..2739006 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1519,7 +1519,7 @@
     }
     if (frame->IsDartFrame()) {
       code = frame->LookupDartCode();
-      if (code.is_optimized() && !FLAG_precompiled_mode) {
+      if (code.is_optimized() && !FLAG_precompiled_runtime) {
         deopt_frame = DeoptimizeToArray(thread, frame, code);
         for (InlinedFunctionsIterator it(code, frame->pc());
              !it.Done();
diff --git a/runtime/vm/disassembler.cc b/runtime/vm/disassembler.cc
index 1fe4215..5ba92d9 100644
--- a/runtime/vm/disassembler.cc
+++ b/runtime/vm/disassembler.cc
@@ -194,6 +194,7 @@
   code.Disassemble();
   THR_Print("}\n");
 
+#if defined(TARGET_ARCH_IA32)
   THR_Print("Pointer offsets for function: {\n");
   // Pointer offsets are stored in descending order.
   Object& obj = Object::Handle();
@@ -204,6 +205,12 @@
               code.GetPointerOffsetAt(i), addr, obj.ToCString());
   }
   THR_Print("}\n");
+#else
+  ASSERT(code.pointer_offsets_length() == 0);
+#endif
+
+  const ObjectPool& object_pool = ObjectPool::Handle(code.GetObjectPool());
+  object_pool.DebugPrint();
 
   THR_Print("PC Descriptors for function '%s' {\n", function_fullname);
   PcDescriptors::PrintHeaderString();
@@ -234,9 +241,6 @@
     THR_Print("}\n");
   }
 
-  const ObjectPool& object_pool = ObjectPool::Handle(code.GetObjectPool());
-  object_pool.DebugPrint();
-
   THR_Print("Stackmaps for function '%s' {\n", function_fullname);
   if (code.stackmaps() != Array::null()) {
     const Array& stackmap_table = Array::Handle(code.stackmaps());
diff --git a/runtime/vm/disassembler_mips.cc b/runtime/vm/disassembler_mips.cc
index b9e0987..22fe462 100644
--- a/runtime/vm/disassembler_mips.cc
+++ b/runtime/vm/disassembler_mips.cc
@@ -581,12 +581,16 @@
         Format(instr, "c.ule.'fmt 'fs, 'ft");
         break;
       }
-      case COP1_CVT_D: {
-        Format(instr, "cvt.d.'fmt 'fd, 'fs");
+      case COP1_TRUNC_W: {
+        Format(instr, "trunc.w.'fmt 'fd, 'fs");
         break;
       }
-      case COP1_CVT_W: {
-        Format(instr, "cvt.w.'fmt 'fd, 'fs");
+      case COP1_CVT_S: {
+        Format(instr, "cvt.s.'fmt 'fd, 'fs");
+        break;
+      }
+      case COP1_CVT_D: {
+        Format(instr, "cvt.d.'fmt 'fd, 'fs");
         break;
       }
       default: {
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 35a7756..a879dda 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -21,15 +21,15 @@
 //   R(name, product_value, type, default_value, comment)
 //   C(name, precompiled_value, product_value, type, default_value, comment)
 #define FLAG_LIST(P, R, D, C)                                                  \
-C(allow_absolute_addresses, false, true, bool, true,                           \
+P(allow_absolute_addresses, bool, true,                                        \
   "Allow embedding absolute addresses in generated code.")                     \
-C(always_megamorphic_calls, true, false, bool, false,                          \
+P(always_megamorphic_calls, bool, false,                                       \
   "Instance call always as megamorphic.")                                      \
 C(background_compilation, false, false, bool, false,                           \
   "Run optimizing compilation in background")                                  \
 C(collect_code, false, true, bool, true,                                       \
   "Attempt to GC infrequently used code.")                                     \
-C(collect_dynamic_function_names, true, false, bool, false,                    \
+P(collect_dynamic_function_names, bool, false,                                 \
   "Collects all dynamic function names to identify unique targets")            \
 R(dedup_instructions, true, bool, false,                                       \
   "Canonicalize instructions when precompiling.")                              \
@@ -45,8 +45,6 @@
   "Disassemble optimized code.")                                               \
 R(dump_symbol_stats, false, bool, false,                                       \
   "Dump symbol table statistics")                                              \
-C(emit_edge_counters, false, true, bool, true,                                 \
-  "Emit edge counters")                                                        \
 R(enable_asserts, false, bool, false,                                          \
   "Enable assert statements.")                                                 \
 C(enable_mirrors, false, false, bool, true,                                    \
@@ -57,7 +55,7 @@
   "Report error for bad overrides.")                                           \
 R(error_on_bad_type, false, bool, false,                                       \
   "Report error for malformed types.")                                         \
-C(fields_may_be_reset, true, false, bool, false,                               \
+P(fields_may_be_reset, bool, false,                                            \
   "Don't optimize away static field initialization")                           \
 C(force_clone_compiler_objects, false, false, bool, false,                     \
   "Force cloning of objects needed in compiler (ICData and Field).")           \
@@ -67,13 +65,13 @@
   "Ratio of getter/setter usage used for double field unboxing heuristics")    \
 P(guess_icdata_cid, bool, true,                                                \
   "Artificially create type feedback for arithmetic etc. operations")          \
-C(ic_range_profiling, false, true, bool, true,                                 \
+P(ic_range_profiling, bool, true,                                              \
   "Generate special IC stubs collecting range information ")                   \
-C(interpret_irregexp, true, false, bool, false,                                \
+P(interpret_irregexp, bool, false,                                             \
   "Use irregexp bytecode interpreter")                                         \
-C(lazy_dispatchers, false, true, bool, true,                                   \
+P(lazy_dispatchers, bool, true,                                                \
   "Generate dispatchers lazily")                                               \
-C(link_natives_lazily, true, false, bool, false,                               \
+P(link_natives_lazily, bool, false,                                            \
   "Link native calls lazily")                                                  \
 C(load_deferred_eagerly, true, true, bool, false,                              \
   "Load deferred libraries eagerly.")                                          \
@@ -85,22 +83,30 @@
   "Merge sin/cos into sincos")                                                 \
 P(new_gen_ext_limit, int, 64,                                                  \
   "maximum total external size (MB) in new gen before triggering GC")          \
-C(optimization_counter_threshold, -1, 30000, int, 30000,                       \
+P(optimization_counter_threshold, int, 30000,                                  \
   "Function's usage-counter value before it is optimized, -1 means never")     \
-C(polymorphic_with_deopt, false, true, bool, true,                             \
+P(polymorphic_with_deopt, bool, true,                                          \
   "Polymorphic calls with deoptimization / megamorphic call")                  \
-C(precompiled_mode, true, false, bool, false,                                  \
-  "Precompilation compiler/runtime mode")                                      \
+P(precompiled_mode, bool, false,                                               \
+  "Precompilation compiler mode")                                              \
+C(precompiled_runtime, true, false, bool, false,                               \
+  "Precompiled runtime mode")                                                  \
 R(pretenure_all, false, bool, false,                                           \
   "Global pretenuring (for testing).")                                         \
 P(pretenure_interval, int, 10,                                                 \
   "Back off pretenuring after this many cycles.")                              \
 P(pretenure_threshold, int, 98,                                                \
   "Trigger pretenuring when this many percent are promoted.")                  \
+R(print_ssa_liveness, false, bool, false,                                      \
+  "Print liveness for ssa variables.")                                         \
+R(print_ssa_liveranges, false, bool, false,                                    \
+  "Print live ranges after allocation.")                                       \
 C(print_stop_message, false, false, bool, false,                               \
   "Print stop message.")                                                       \
 R(profiler, false, bool, true,                                                 \
   "Enable the profiler.")                                                      \
+P(reorder_basic_blocks, bool, true,                                            \
+  "Reorder basic blocks")                                                      \
 R(support_ast_printer, false, bool, true,                                      \
   "Support the AST printer.")                                                  \
 R(support_compiler_stats, false, bool, true,                                   \
@@ -125,13 +131,15 @@
   "Traces allocation of handles.")                                             \
 D(trace_optimization, bool, false,                                             \
   "Print optimization details.");                                              \
+D(trace_ssa_allocator, bool, false,                                            \
+  "Trace register allocation over SSA.")                                       \
 D(trace_zones, bool, false,                                                    \
   "Traces allocation sizes in the zone.")                                      \
 P(truncating_left_shift, bool, true,                                           \
   "Optimize left shift to truncate if possible")                               \
-C(use_cha_deopt, false, true, bool, true,                                      \
+P(use_cha_deopt, bool, true,                                                   \
   "Use class hierarchy analysis even if it can cause deoptimization.")         \
-C(use_field_guards, false, true, bool, true,                                   \
+P(use_field_guards, bool, true,                                                \
   "Use field guards and track field types")                                    \
 C(use_osr, false, true, bool, true,                                            \
   "Use OSR")                                                                   \
@@ -143,5 +151,7 @@
   "Enables heap verification after GC.")                                       \
 R(verify_before_gc, false, bool, false,                                        \
   "Enables heap verification before GC.")                                      \
+D(verify_on_transition, bool, false,                                           \
+  "Verify on dart <==> VM.")                                                   \
 
 #endif  // VM_FLAG_LIST_H_
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 3296e09..a5cadf0 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -19,7 +19,6 @@
 DEFINE_FLAG(bool, trace_smi_widening, false, "Trace Smi->Int32 widening pass.");
 #endif
 DEFINE_FLAG(bool, prune_dead_locals, true, "optimize dead locals away");
-DECLARE_FLAG(bool, reorder_basic_blocks);
 DECLARE_FLAG(bool, verify_compiler);
 
 
@@ -105,8 +104,9 @@
 
 bool FlowGraph::ShouldReorderBlocks(const Function& function,
                                     bool is_optimized) {
-  return is_optimized && FLAG_reorder_basic_blocks &&
-      FLAG_emit_edge_counters && !function.is_intrinsic();
+  return is_optimized
+      && FLAG_reorder_basic_blocks
+      && !function.is_intrinsic();
 }
 
 
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index b9bb33c..e2ba4bf 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -14,13 +14,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, print_ssa_liveness, false,
-            "Print liveness for ssa variables.");
-DEFINE_FLAG(bool, trace_ssa_allocator, false,
-            "Trace register allocation over SSA.");
-DEFINE_FLAG(bool, print_ssa_liveranges, false,
-            "Print live ranges after allocation.");
-
 #if defined(DEBUG)
 #define TRACE_ALLOC(statement)                                                 \
   do {                                                                         \
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index c5460be..4bf3ec9 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -2176,8 +2176,13 @@
     }
     Goto(loop_entry);
     exit_ = loop_entry;
+    // Note: the stack overflow check happens on the back branch that jumps
+    // to the increment instruction. The token position for the overflow
+    // check must match the position of the increment expression, so that
+    // the context level (if any) matches the that of the increment
+    // expression.
     AddInstruction(
-        new(Z) CheckStackOverflowInstr(node->token_pos(),
+        new(Z) CheckStackOverflowInstr(node->increment()->token_pos(),
                                        owner()->loop_depth()));
   }
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 5bc26af..1ca6adc 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -59,18 +59,12 @@
 DECLARE_FLAG(int, inlining_constant_arguments_max_size_threshold);
 DECLARE_FLAG(int, inlining_constant_arguments_min_size_threshold);
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
 static void PrecompilationModeHandler(bool value) {
   if (value) {
 #if defined(TARGET_ARCH_IA32)
     FATAL("Precompilation not supported on IA32");
 #endif
 
-#if defined(PRODUCT)
-    FATAL("dart_noopt not supported in product mode");
-#else
-    FLAG_support_debugger = false;
-
     // Flags affecting compilation only:
     // There is no counter feedback in precompilation, so ignore the counter
     // when making inlining decisions.
@@ -87,27 +81,31 @@
 
     FLAG_allow_absolute_addresses = false;
     FLAG_always_megamorphic_calls = true;
-    FLAG_background_compilation = false;
-    FLAG_collect_code = false;
     FLAG_collect_dynamic_function_names = true;
-    FLAG_deoptimize_alot = false;  // Used in some tests.
-    FLAG_deoptimize_every = 0;     // Used in some tests.
-    FLAG_emit_edge_counters = false;
-    FLAG_enable_mirrors = false;
     FLAG_fields_may_be_reset = true;
     FLAG_ic_range_profiling = false;
     FLAG_interpret_irregexp = true;
     FLAG_lazy_dispatchers = false;
     FLAG_link_natives_lazily = true;
-    FLAG_load_deferred_eagerly = true;
     FLAG_optimization_counter_threshold = -1;
     FLAG_polymorphic_with_deopt = false;
     FLAG_precompiled_mode = true;
-    FLAG_print_stop_message = false;
-    FLAG_use_cha_deopt = false;
+    FLAG_reorder_basic_blocks = false;
     FLAG_use_field_guards = false;
+    FLAG_use_cha_deopt = false;
+
+#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
+    // Set flags affecting runtime accordingly for dart_noopt.
+    FLAG_background_compilation = false;
+    FLAG_collect_code = false;
+    FLAG_support_debugger = false;
+    FLAG_deoptimize_alot = false;  // Used in some tests.
+    FLAG_deoptimize_every = 0;     // Used in some tests.
+    FLAG_enable_mirrors = false;
+    FLAG_load_deferred_eagerly = true;
+    FLAG_print_stop_message = false;
     FLAG_use_osr = false;
-#endif  // PRODUCT
+#endif
   }
 }
 
@@ -115,30 +113,17 @@
                     precompilation,
                     "Precompilation mode");
 
-#else  // DART_PRECOMPILED_RUNTIME
+#ifdef DART_PRECOMPILED_RUNTIME
 
-COMPILE_ASSERT(!FLAG_allow_absolute_addresses);
 COMPILE_ASSERT(!FLAG_background_compilation);
 COMPILE_ASSERT(!FLAG_collect_code);
 COMPILE_ASSERT(!FLAG_deoptimize_alot);  // Used in some tests.
-COMPILE_ASSERT(!FLAG_emit_edge_counters);
 COMPILE_ASSERT(!FLAG_enable_mirrors);
-COMPILE_ASSERT(!FLAG_ic_range_profiling);
-COMPILE_ASSERT(!FLAG_lazy_dispatchers);
-COMPILE_ASSERT(!FLAG_polymorphic_with_deopt);
+COMPILE_ASSERT(FLAG_precompiled_runtime);
 COMPILE_ASSERT(!FLAG_print_stop_message);
-COMPILE_ASSERT(!FLAG_use_cha_deopt);
-COMPILE_ASSERT(!FLAG_use_field_guards);
 COMPILE_ASSERT(!FLAG_use_osr);
-COMPILE_ASSERT(FLAG_always_megamorphic_calls);
-COMPILE_ASSERT(FLAG_collect_dynamic_function_names);
 COMPILE_ASSERT(FLAG_deoptimize_every == 0);  // Used in some tests.
-COMPILE_ASSERT(FLAG_fields_may_be_reset);
-COMPILE_ASSERT(FLAG_interpret_irregexp);
-COMPILE_ASSERT(FLAG_link_natives_lazily);
 COMPILE_ASSERT(FLAG_load_deferred_eagerly);
-COMPILE_ASSERT(FLAG_optimization_counter_threshold == -1);
-COMPILE_ASSERT(FLAG_precompiled_mode);
 
 #endif  // DART_PRECOMPILED_RUNTIME
 
@@ -540,7 +525,13 @@
               IntervalStruct(prev_offset, prev_inlining_pos, prev_inlining_id));
           prev_offset = assembler()->CodeSize();
           prev_inlining_id = instr->inlining_id();
-          prev_inlining_pos = inline_id_to_token_pos_[prev_inlining_id];
+          if (prev_inlining_id < inline_id_to_token_pos_.length()) {
+            prev_inlining_pos = inline_id_to_token_pos_[prev_inlining_id];
+          } else {
+            // We will add this token position later when generating the
+            // profile.
+            prev_inlining_pos = TokenPosition::kNoSource;
+          }
           if (prev_inlining_id > max_inlining_id) {
             max_inlining_id = prev_inlining_id;
           }
@@ -817,7 +808,8 @@
 // and FlowGraphCompiler::SlowPathEnvironmentFor.
 // See StackFrame::VisitObjectPointers for the details of how stack map is
 // interpreted.
-void FlowGraphCompiler::RecordSafepoint(LocationSummary* locs) {
+void FlowGraphCompiler::RecordSafepoint(LocationSummary* locs,
+                                        intptr_t slow_path_argument_count) {
   if (is_optimizing() || locs->live_registers()->HasUntaggedValues()) {
     const intptr_t spill_area_size = is_optimizing() ?
         flow_graph_.graph_entry()->spill_slot_count() : 0;
@@ -877,10 +869,17 @@
       }
     }
 
-    intptr_t register_bit_count = bitmap->Length() - spill_area_size;
+    // Arguments pushed on top of live registers in the slow path are tagged.
+    for (intptr_t i = 0; i < slow_path_argument_count; ++i) {
+      bitmap->Set(bitmap->Length(), true);
+    }
+
+    // The slow path area Outside the spill area contains are live registers
+    // and pushed arguments for calls inside the slow path.
+    intptr_t slow_path_bit_count = bitmap->Length() - spill_area_size;
     stackmap_table_builder()->AddEntry(assembler()->CodeSize(),
                                        bitmap,
-                                       register_bit_count);
+                                       slow_path_bit_count);
   }
 }
 
@@ -1162,7 +1161,8 @@
   }
   if (FLAG_always_megamorphic_calls) {
     EmitMegamorphicInstanceCall(ic_data, argument_count,
-                                deopt_id, token_pos, locs);
+                                deopt_id, token_pos, locs,
+                                CatchClauseNode::kInvalidTryIndex);
     return;
   }
   ASSERT(!ic_data.IsNull());
@@ -1189,7 +1189,8 @@
 
   if (is_optimizing()) {
     EmitMegamorphicInstanceCall(ic_data, argument_count,
-                                deopt_id, token_pos, locs);
+                                deopt_id, token_pos, locs,
+                                CatchClauseNode::kInvalidTryIndex);
     return;
   }
 
@@ -1302,7 +1303,7 @@
 bool FlowGraphCompiler::NeedsEdgeCounter(TargetEntryInstr* block) {
   // Only emit an edge counter if there is not goto at the end of the block,
   // except for the entry block.
-  return (FLAG_emit_edge_counters
+  return (FLAG_reorder_basic_blocks
       && (!block->last_instruction()->IsGoto()
           || (block == flow_graph().graph_entry()->normal_entry())));
 }
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 60ce384..3dc31a0 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -460,7 +460,8 @@
       intptr_t deopt_id,
       TokenPosition token_pos,
       LocationSummary* locs,
-      intptr_t try_index = CatchClauseNode::kInvalidTryIndex);
+      intptr_t try_index,
+      intptr_t slow_path_argument_count = 0);
 
   void EmitSwitchableInstanceCall(const ICData& ic_data,
                                   intptr_t argument_count,
@@ -514,7 +515,8 @@
                             intptr_t deopt_id,
                             TokenPosition token_pos);
 
-  void RecordSafepoint(LocationSummary* locs);
+  void RecordSafepoint(LocationSummary* locs,
+                       intptr_t slow_path_argument_count = 0);
 
   Label* AddDeoptStub(intptr_t deopt_id,
                       ICData::DeoptReasonId reason,
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 8d6816a..247537a 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1309,7 +1309,8 @@
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
-    intptr_t try_index) {
+    intptr_t try_index,
+    intptr_t slow_path_argument_count) {
   const String& name = String::Handle(zone(), ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
@@ -1327,7 +1328,7 @@
   }
   __ blx(R1);
 
-  RecordSafepoint(locs);
+  RecordSafepoint(locs, slow_path_argument_count);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   if (FLAG_precompiled_mode) {
     // Megamorphic calls may occur in slow path stubs.
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 618e60d..4f6474c 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1290,7 +1290,8 @@
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
-    intptr_t try_index) {
+    intptr_t try_index,
+    intptr_t slow_path_argument_count) {
   const String& name = String::Handle(zone(), ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
@@ -1308,7 +1309,7 @@
   }
   __ blr(R1);
 
-  RecordSafepoint(locs);
+  RecordSafepoint(locs, slow_path_argument_count);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   if (FLAG_precompiled_mode) {
     // Megamorphic calls may occur in slow path stubs.
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 2ede9e0..7407ac9 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1290,7 +1290,8 @@
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
-    intptr_t try_index) {
+    intptr_t try_index,
+    intptr_t slow_path_argument_count) {
   const String& name = String::Handle(zone(), ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
@@ -1310,7 +1311,7 @@
 
   AddCurrentDescriptor(RawPcDescriptors::kOther,
       Thread::kNoDeoptId, token_pos);
-  RecordSafepoint(locs);
+  RecordSafepoint(locs, slow_path_argument_count);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   // Precompilation not implemented on ia32 platform.
   ASSERT(!FLAG_precompiled_mode);
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 8f51f86..18b629b 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1317,7 +1317,8 @@
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
-    intptr_t try_index) {
+    intptr_t try_index,
+    intptr_t slow_path_argument_count) {
   const String& name = String::Handle(zone(), ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
@@ -1335,7 +1336,7 @@
   }
   __ jalr(T1);
 
-  RecordSafepoint(locs);
+  RecordSafepoint(locs, slow_path_argument_count);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   if (FLAG_precompiled_mode) {
     // Megamorphic calls may occur in slow path stubs.
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 800e1dc..301de20 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1320,7 +1320,8 @@
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
-    intptr_t try_index) {
+    intptr_t try_index,
+    intptr_t slow_path_argument_count) {
   const String& name = String::Handle(zone(), ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
@@ -1338,7 +1339,7 @@
   }
   __ call(RCX);
 
-  RecordSafepoint(locs);
+  RecordSafepoint(locs, slow_path_argument_count);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   if (FLAG_precompiled_mode) {
     // Megamorphic calls may occur in slow path stubs.
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 95a1c9f..c15d63c 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -1960,8 +1960,10 @@
   ASSERT(tp.IsReal() || tp.IsSynthetic() || tp.IsNoSource());
   inline_id_to_function_->Add(&function);
   inline_id_to_token_pos_->Add(tp);
-  ASSERT(inline_id_to_token_pos_->length() == inline_id_to_function_->length());
   caller_inline_id_->Add(parent_id);
+  // We always have one less token position than functions.
+  ASSERT(inline_id_to_token_pos_->length() ==
+         (inline_id_to_function_->length() - 1));
   return id;
 }
 
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 8950958..c5b593e 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -491,6 +491,11 @@
 }
 
 
+void Heap::InitGrowthControl() {
+  old_space_.InitGrowthControl();
+}
+
+
 void Heap::SetGrowthControlState(bool state) {
   old_space_.SetGrowthControlState(state);
 }
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index f116af55..97e04a1 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -126,6 +126,7 @@
 
   // Enables growth control on the page space heaps.  This should be
   // called before any user code is executed.
+  void InitGrowthControl();
   void EnableGrowthControl() { SetGrowthControlState(true); }
   void DisableGrowthControl() { SetGrowthControlState(false); }
   void SetGrowthControlState(bool state);
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index b3e48f1..2287d0d 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -665,6 +665,15 @@
 }
 
 
+void CheckedSmiOpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s", Token::Str(op_kind()));
+  f->Print(", ");
+  left()->PrintTo(f);
+  f->Print(", ");
+  right()->PrintTo(f);
+}
+
+
 void BinaryIntegerOpInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%s", Token::Str(op_kind()));
   if (is_truncating()) {
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index f424c99..731feca 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -479,6 +479,7 @@
   M(AllocateUninitializedContext)                                              \
   M(CloneContext)                                                              \
   M(BinarySmiOp)                                                               \
+  M(CheckedSmiOp)                                                              \
   M(BinaryInt32Op)                                                             \
   M(UnarySmiOp)                                                                \
   M(UnaryDoubleOp)                                                             \
@@ -2067,7 +2068,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-
   virtual TokenPosition token_pos() const {
     return TokenPosition::kPushArgument;
   }
@@ -6868,6 +6868,39 @@
 };
 
 
+class CheckedSmiOpInstr : public TemplateDefinition<2, Throws> {
+ public:
+  CheckedSmiOpInstr(Token::Kind op_kind,
+                    Value* left,
+                    Value* right,
+                    InstanceCallInstr* call)
+      : TemplateDefinition(call->deopt_id()),
+        call_(call),
+        op_kind_(op_kind) {
+    SetInputAt(0, left);
+    SetInputAt(1, right);
+  }
+
+  InstanceCallInstr* call() const { return call_; }
+  Token::Kind op_kind() const { return op_kind_; }
+  Value* left() const { return inputs_[0]; }
+  Value* right() const { return inputs_[1]; }
+
+  virtual bool CanDeoptimize() const { return true; }
+
+  virtual EffectSet Effects() const { return EffectSet::All(); }
+
+  PRINT_OPERANDS_TO_SUPPORT
+
+  DECLARE_INSTRUCTION(CheckedSmiOp)
+
+ private:
+  InstanceCallInstr* call_;
+  const Token::Kind op_kind_;
+  DISALLOW_COPY_AND_ASSIGN(CheckedSmiOpInstr);
+};
+
+
 class BinaryIntegerOpInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   BinaryIntegerOpInstr(Token::Kind op_kind,
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index df31e31..269b1893 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -3050,6 +3050,109 @@
 }
 
 
+class CheckedSmiSlowPath : public SlowPathCode {
+ public:
+  CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
+      : instruction_(instruction), try_index_(try_index) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    if (Assembler::EmittingComments()) {
+      __ Comment("slow path smi operation");
+    }
+    __ Bind(entry_label());
+    LocationSummary* locs = instruction_->locs();
+    Register result = locs->out(0).reg();
+    locs->live_registers()->Remove(Location::RegisterLocation(result));
+
+    compiler->SaveLiveRegisters(locs);
+    __ Push(locs->in(0).reg());
+    __ Push(locs->in(1).reg());
+    compiler->EmitMegamorphicInstanceCall(
+        *instruction_->call()->ic_data(),
+        instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(),
+        instruction_->call()->token_pos(),
+        locs,
+        try_index_,
+        /* slow_path_argument_count = */ 2);
+    __ mov(result, Operand(R0));
+    compiler->RestoreLiveRegisters(locs);
+    __ b(exit_label());
+  }
+
+ private:
+  CheckedSmiOpInstr* instruction_;
+  intptr_t try_index_;
+};
+
+
+LocationSummary* CheckedSmiOpInstr::MakeLocationSummary(Zone* zone,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  CheckedSmiSlowPath* slow_path =
+      new CheckedSmiSlowPath(this, compiler->CurrentTryIndex());
+  compiler->AddSlowPathCode(slow_path);
+  // Test operands if necessary.
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  Register result = locs()->out(0).reg();
+  __ orr(result, left, Operand(right));
+  __ tst(result, Operand(kSmiTagMask));
+  __ b(slow_path->entry_label(), NE);
+  switch (op_kind()) {
+    case Token::kADD:
+      __ adds(result, left, Operand(right));
+      __ b(slow_path->entry_label(), VS);
+      break;
+    case Token::kSUB:
+      __ subs(result, left, Operand(right));
+      __ b(slow_path->entry_label(), VS);
+      break;
+    case Token::kBIT_OR:
+      // Operation part of combined smi check.
+      break;
+    case Token::kBIT_AND:
+      __ and_(result, left, Operand(right));
+      break;
+    case Token::kBIT_XOR:
+      __ eor(result, left, Operand(right));
+      break;
+    case Token::kEQ:
+    case Token::kLT:
+    case Token::kLTE:
+    case Token::kGT:
+    case Token::kGTE: {
+      Label true_label, false_label, done;
+      BranchLabels labels = { &true_label, &false_label, &false_label };
+      Condition true_condition =
+          EmitSmiComparisonOp(compiler, locs(), op_kind());
+      EmitBranchOnCondition(compiler, true_condition, labels);
+      __ Bind(&false_label);
+      __ LoadObject(result, Bool::False());
+      __ b(&done);
+      __ Bind(&true_label);
+      __ LoadObject(result, Bool::True());
+      __ Bind(&done);
+      break;
+    }
+    default:
+      UNIMPLEMENTED();
+  }
+  __ Bind(slow_path->exit_label());
+}
+
+
 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -6608,7 +6711,7 @@
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (FLAG_reorder_basic_blocks) {
       compiler->EmitEdgeCounter(block()->preorder_number());
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 79296b3..f43e2bb 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -2766,6 +2766,109 @@
 }
 
 
+class CheckedSmiSlowPath : public SlowPathCode {
+ public:
+  CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
+      : instruction_(instruction), try_index_(try_index) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    if (Assembler::EmittingComments()) {
+      __ Comment("slow path smi operation");
+    }
+    __ Bind(entry_label());
+    LocationSummary* locs = instruction_->locs();
+    Register result = locs->out(0).reg();
+    locs->live_registers()->Remove(Location::RegisterLocation(result));
+
+    compiler->SaveLiveRegisters(locs);
+    __ Push(locs->in(0).reg());
+    __ Push(locs->in(1).reg());
+    compiler->EmitMegamorphicInstanceCall(
+        *instruction_->call()->ic_data(),
+        instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(),
+        instruction_->call()->token_pos(),
+        locs,
+        try_index_,
+        /* slow_path_argument_count = */ 2);
+    __ mov(result, R0);
+    compiler->RestoreLiveRegisters(locs);
+    __ b(exit_label());
+  }
+
+ private:
+  CheckedSmiOpInstr* instruction_;
+  intptr_t try_index_;
+};
+
+
+LocationSummary* CheckedSmiOpInstr::MakeLocationSummary(Zone* zone,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  CheckedSmiSlowPath* slow_path =
+      new CheckedSmiSlowPath(this, compiler->CurrentTryIndex());
+  compiler->AddSlowPathCode(slow_path);
+  // Test operands if necessary.
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  Register result = locs()->out(0).reg();
+  __ orr(result, left, Operand(right));
+  __ tsti(result, Immediate(kSmiTagMask));
+  __ b(slow_path->entry_label(), NE);
+  switch (op_kind()) {
+    case Token::kADD:
+      __ adds(result, left, Operand(right));
+      __ b(slow_path->entry_label(), VS);
+      break;
+    case Token::kSUB:
+      __ subs(result, left, Operand(right));
+      __ b(slow_path->entry_label(), VS);
+      break;
+    case Token::kBIT_OR:
+      // Operation part of combined smi check.
+      break;
+    case Token::kBIT_AND:
+      __ and_(result, left, Operand(right));
+      break;
+    case Token::kBIT_XOR:
+      __ eor(result, left, Operand(right));
+      break;
+    case Token::kEQ:
+    case Token::kLT:
+    case Token::kLTE:
+    case Token::kGT:
+    case Token::kGTE: {
+      Label true_label, false_label, done;
+      BranchLabels labels = { &true_label, &false_label, &false_label };
+      Condition true_condition =
+          EmitSmiComparisonOp(compiler, locs(), op_kind());
+      EmitBranchOnCondition(compiler, true_condition, labels);
+      __ Bind(&false_label);
+      __ LoadObject(result, Bool::False());
+      __ b(&done);
+      __ Bind(&true_label);
+      __ LoadObject(result, Bool::True());
+      __ Bind(&done);
+      break;
+    }
+    default:
+      UNIMPLEMENTED();
+  }
+  __ Bind(slow_path->exit_label());
+}
+
+
 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -5367,7 +5470,7 @@
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (FLAG_reorder_basic_blocks) {
       compiler->EmitEdgeCounter(block()->preorder_number());
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index bebb561..e4fcd9d 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -2764,6 +2764,19 @@
 }
 
 
+LocationSummary* CheckedSmiOpInstr::MakeLocationSummary(Zone* zone,
+                                                        bool opt) const {
+  // Only for precompiled code, not on ia32 currently.
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // Only for precompiled code, not on ia32 currently.
+  UNIMPLEMENTED();
+}
+
 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -6507,7 +6520,7 @@
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (FLAG_reorder_basic_blocks) {
       compiler->EmitEdgeCounter(block()->preorder_number());
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index f4b8032..7799bd9 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -2885,6 +2885,109 @@
 }
 
 
+class CheckedSmiSlowPath : public SlowPathCode {
+ public:
+  CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
+      : instruction_(instruction), try_index_(try_index) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    if (Assembler::EmittingComments()) {
+      __ Comment("slow path smi operation");
+    }
+    __ Bind(entry_label());
+    LocationSummary* locs = instruction_->locs();
+    Register result = locs->out(0).reg();
+    locs->live_registers()->Remove(Location::RegisterLocation(result));
+
+    compiler->SaveLiveRegisters(locs);
+    __ Push(locs->in(0).reg());
+    __ Push(locs->in(1).reg());
+    compiler->EmitMegamorphicInstanceCall(
+        *instruction_->call()->ic_data(),
+        instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(),
+        instruction_->call()->token_pos(),
+        locs,
+        try_index_,
+        /* slow_path_argument_count = */ 2);
+    __ mov(result, V0);
+    compiler->RestoreLiveRegisters(locs);
+    __ b(exit_label());
+  }
+
+ private:
+  CheckedSmiOpInstr* instruction_;
+  intptr_t try_index_;
+};
+
+
+LocationSummary* CheckedSmiOpInstr::MakeLocationSummary(Zone* zone,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  CheckedSmiSlowPath* slow_path =
+      new CheckedSmiSlowPath(this, compiler->CurrentTryIndex());
+  compiler->AddSlowPathCode(slow_path);
+  // Test operands if necessary.
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  Register result = locs()->out(0).reg();
+  __ or_(result, left, right);
+  __ andi(CMPRES1, result, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, slow_path->entry_label());
+  switch (op_kind()) {
+    case Token::kADD:
+      __ AdduDetectOverflow(result, left, right, CMPRES1);
+      __ bltz(CMPRES1, slow_path->entry_label());
+      break;
+    case Token::kSUB:
+      __ SubuDetectOverflow(result, left, right, CMPRES1);
+      __ bltz(CMPRES1, slow_path->entry_label());
+      break;
+    case Token::kBIT_OR:
+      // Operation part of combined smi check.
+      break;
+    case Token::kBIT_AND:
+      __ and_(result, left, right);
+      break;
+    case Token::kBIT_XOR:
+      __ xor_(result, left, right);
+      break;
+    case Token::kEQ:
+    case Token::kLT:
+    case Token::kLTE:
+    case Token::kGT:
+    case Token::kGTE: {
+      Label true_label, false_label, done;
+      BranchLabels labels = { &true_label, &false_label, &false_label };
+      Condition true_condition =
+          EmitSmiComparisonOp(compiler, *locs(), op_kind());
+      EmitBranchOnCondition(compiler, true_condition, labels);
+      __ Bind(&false_label);
+      __ LoadObject(result, Bool::False());
+      __ b(&done);
+      __ Bind(&true_label);
+      __ LoadObject(result, Bool::True());
+      __ Bind(&done);
+      break;
+    }
+    default:
+      UNIMPLEMENTED();
+  }
+  __ Bind(slow_path->exit_label());
+}
+
+
 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -4206,7 +4309,7 @@
   ASSERT(result == V0);
   ASSERT(result != value_obj);
   __ LoadDFromOffset(DTMP, value_obj, Double::value_offset() - kHeapObjectTag);
-  __ cvtwd(STMP1, DTMP);
+  __ truncwd(STMP1, DTMP);
   __ mfc1(result, STMP1);
 
   // Overflow is signaled with minint.
@@ -4229,7 +4332,7 @@
                                instance_call()->token_pos(),
                                target,
                                kNumberOfArguments,
-                               Object::null_array(),  // No argument names.,
+                               Object::null_array(),  // No argument names.
                                locs(),
                                ICData::Handle());
   __ Bind(&done);
@@ -4252,7 +4355,7 @@
   Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   Register result = locs()->out(0).reg();
   DRegister value = locs()->in(0).fpu_reg();
-  __ cvtwd(STMP1, value);
+  __ truncwd(STMP1, value);
   __ mfc1(result, STMP1);
 
   // Check for overflow and that it fits into Smi.
@@ -5383,7 +5486,7 @@
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Comment("GotoInstr");
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (FLAG_reorder_basic_blocks) {
       compiler->EmitEdgeCounter(block()->preorder_number());
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index ec108a8..9623ec2 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -479,8 +479,7 @@
 
 static Condition EmitInt64ComparisonOp(FlowGraphCompiler* compiler,
                                        const LocationSummary& locs,
-                                       Token::Kind kind,
-                                       BranchLabels labels) {
+                                       Token::Kind kind) {
   Location left = locs.in(0);
   Location right = locs.in(1);
   ASSERT(!left.IsConstant() || !right.IsConstant());
@@ -536,7 +535,7 @@
 Condition EqualityCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                    BranchLabels labels) {
   if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) {
-    return EmitInt64ComparisonOp(compiler, *locs(), kind(), labels);
+    return EmitInt64ComparisonOp(compiler, *locs(), kind());
   } else {
     ASSERT(operation_cid() == kDoubleCid);
     return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
@@ -727,7 +726,7 @@
 Condition RelationalOpInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                 BranchLabels labels) {
   if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) {
-    return EmitInt64ComparisonOp(compiler, *locs(), kind(), labels);
+    return EmitInt64ComparisonOp(compiler, *locs(), kind());
   } else {
     ASSERT(operation_cid() == kDoubleCid);
     return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
@@ -2793,6 +2792,132 @@
 }
 
 
+class CheckedSmiSlowPath : public SlowPathCode {
+ public:
+  CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
+      : instruction_(instruction), try_index_(try_index) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    if (Assembler::EmittingComments()) {
+      __ Comment("slow path smi operation");
+    }
+    __ Bind(entry_label());
+    LocationSummary* locs = instruction_->locs();
+    Register result = locs->out(0).reg();
+    locs->live_registers()->Remove(Location::RegisterLocation(result));
+
+    compiler->SaveLiveRegisters(locs);
+    __ pushq(locs->in(0).reg());
+    __ pushq(locs->in(1).reg());
+    compiler->EmitMegamorphicInstanceCall(
+        *instruction_->call()->ic_data(),
+        instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(),
+        instruction_->call()->token_pos(),
+        locs,
+        try_index_,
+        /* slow_path_argument_count = */ 2);
+    __ MoveRegister(result, RAX);
+    compiler->RestoreLiveRegisters(locs);
+    __ jmp(exit_label());
+  }
+
+ private:
+  CheckedSmiOpInstr* instruction_;
+  intptr_t try_index_;
+};
+
+
+LocationSummary* CheckedSmiOpInstr::MakeLocationSummary(Zone* zone,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  switch (op_kind()) {
+    case Token::kEQ:
+    case Token::kLT:
+    case Token::kLTE:
+    case Token::kGT:
+    case Token::kGTE:
+    case Token::kADD:
+    case Token::kSUB:
+      summary->set_out(0, Location::RequiresRegister());
+      break;
+    case Token::kBIT_OR:
+    case Token::kBIT_AND:
+    case Token::kBIT_XOR:
+      summary->set_out(0, Location::SameAsFirstInput());
+      break;
+    default:
+      UNIMPLEMENTED();
+  }
+  return summary;
+}
+
+
+void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  CheckedSmiSlowPath* slow_path =
+      new CheckedSmiSlowPath(this, compiler->CurrentTryIndex());
+  compiler->AddSlowPathCode(slow_path);
+  // Test operands if necessary.
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  Register result = locs()->out(0).reg();
+  __ movq(TMP, left);
+  __ orq(TMP, right);
+  __ testq(TMP, Immediate(kSmiTagMask));
+  __ j(NOT_ZERO, slow_path->entry_label());
+  switch (op_kind()) {
+    case Token::kADD:
+      __ movq(result, left);
+      __ addq(result, right);
+      __ j(OVERFLOW, slow_path->entry_label());
+      break;
+    case Token::kSUB:
+      __ movq(result, left);
+      __ subq(result, right);
+      __ j(OVERFLOW, slow_path->entry_label());
+      break;
+    case Token::kBIT_OR:
+      ASSERT(left == result);
+      __ orq(result, right);
+      break;
+    case Token::kBIT_AND:
+      ASSERT(left == result);
+      __ andq(result, right);
+      break;
+    case Token::kBIT_XOR:
+      ASSERT(left == result);
+      __ xorq(result, right);
+      break;
+    case Token::kEQ:
+    case Token::kLT:
+    case Token::kLTE:
+    case Token::kGT:
+    case Token::kGTE: {
+      Label true_label, false_label, done;
+      BranchLabels labels = { &true_label, &false_label, &false_label };
+      Condition true_condition =
+          EmitInt64ComparisonOp(compiler, *locs(), op_kind());
+      EmitBranchOnCondition(compiler, true_condition, labels);
+      __ Bind(&false_label);
+      __ LoadObject(result, Bool::False());
+      __ jmp(&done);
+      __ Bind(&true_label);
+      __ LoadObject(result, Bool::True());
+      __ Bind(&done);
+      break;
+    }
+    default:
+      UNIMPLEMENTED();
+  }
+  __ Bind(slow_path->exit_label());
+}
+
+
 static bool CanBeImmediate(const Object& constant) {
   return constant.IsSmi() &&
     Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32();
@@ -6130,7 +6255,7 @@
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (FLAG_reorder_basic_blocks) {
       compiler->EmitEdgeCounter(block()->preorder_number());
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 57cb4d6..ddd9c52 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -1538,7 +1538,7 @@
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ LoadDFromOffset(D0, T0, Double::value_offset() - kHeapObjectTag);
 
-  __ cvtwd(F2, D0);
+  __ truncwd(F2, D0);
   __ mfc1(V0, F2);
 
   // Overflow is signaled with minint.
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3fc7780..4b11247 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -791,6 +791,7 @@
       mutex_(new Mutex()),
       symbols_mutex_(new Mutex()),
       type_canonicalization_mutex_(new Mutex()),
+      constant_canonicalization_mutex_(new Mutex()),
       saved_stack_limit_(0),
       deferred_interrupts_mask_(0),
       deferred_interrupts_(0),
@@ -856,6 +857,8 @@
   symbols_mutex_ = NULL;
   delete type_canonicalization_mutex_;
   type_canonicalization_mutex_ = NULL;
+  delete constant_canonicalization_mutex_;
+  constant_canonicalization_mutex_ = NULL;
   delete message_handler_;
   message_handler_ = NULL;  // Fail fast if we send messages to a dead isolate.
   ASSERT(deopt_context_ == NULL);  // No deopt in progress when isolate deleted.
@@ -1947,7 +1950,13 @@
   jsobj.AddProperty("pauseOnExit", message_handler()->should_pause_on_exit());
 
   if (debugger() != NULL) {
-    if (message_handler()->is_paused_on_start()) {
+    if (!is_runnable()) {
+      // Isolate is not yet runnable.
+      ASSERT(debugger()->PauseEvent() == NULL);
+      ServiceEvent pause_event(this, ServiceEvent::kNone);
+      jsobj.AddProperty("pauseEvent", &pause_event);
+    } else if (message_handler()->is_paused_on_start() ||
+               message_handler()->should_pause_on_start()) {
       ASSERT(debugger()->PauseEvent() == NULL);
       ServiceEvent pause_event(this, ServiceEvent::kPauseStart);
       jsobj.AddProperty("pauseEvent", &pause_event);
@@ -2600,6 +2609,7 @@
   thread->set_os_thread(NULL);
   thread->set_execution_state(Thread::kThreadInVM);
   thread->set_safepoint_state(0);
+  thread->clear_pending_functions();
   ASSERT(thread->no_safepoint_scope_depth() == 0);
   // Return thread structure.
   thread_registry()->ReturnThreadLocked(is_mutator, thread);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 9d6aa28..e40b3900 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -312,7 +312,12 @@
   void set_message_handler(MessageHandler* value) { message_handler_ = value; }
 
   bool is_runnable() const { return is_runnable_; }
-  void set_is_runnable(bool value) { is_runnable_ = value; }
+  void set_is_runnable(bool value) {
+    is_runnable_ = value;
+    if (is_runnable_) {
+      set_last_resume_timestamp();
+    }
+  }
 
   IsolateSpawnState* spawn_state() const { return spawn_state_; }
   void set_spawn_state(IsolateSpawnState* value) { spawn_state_ = value; }
@@ -322,6 +327,9 @@
   Mutex* type_canonicalization_mutex() const {
     return type_canonicalization_mutex_;
   }
+  Mutex* constant_canonicalization_mutex() const {
+    return constant_canonicalization_mutex_;
+  }
 
   Debugger* debugger() const {
     if (!FLAG_support_debugger) {
@@ -758,6 +766,7 @@
   Mutex* mutex_;  // Protects stack_limit_, saved_stack_limit_, compiler stats.
   Mutex* symbols_mutex_;  // Protects concurrent access to the symbol table.
   Mutex* type_canonicalization_mutex_;  // Protects type canonicalization.
+  Mutex* constant_canonicalization_mutex_;  // Protects const canonicalization.
   uword saved_stack_limit_;
   uword deferred_interrupts_mask_;
   uword deferred_interrupts_;
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 94928ab..a68d87d 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -475,12 +475,18 @@
 }
 
 
-void JSONStream::PrintValue(TimelineEvent* timeline_event) {
+void JSONStream::PrintValue(const TimelineEvent* timeline_event) {
   PrintCommaIfNeeded();
   timeline_event->PrintJSON(this);
 }
 
 
+void JSONStream::PrintValue(const TimelineEventBlock* timeline_event_block) {
+  PrintCommaIfNeeded();
+  timeline_event_block->PrintJSON(this);
+}
+
+
 void JSONStream::PrintValueVM(bool ref) {
   PrintCommaIfNeeded();
   Service::PrintJSONForVM(this, ref);
@@ -593,12 +599,19 @@
 
 
 void JSONStream::PrintProperty(const char* name,
-                               TimelineEvent* timeline_event) {
+                               const TimelineEvent* timeline_event) {
   PrintPropertyName(name);
   PrintValue(timeline_event);
 }
 
 
+void JSONStream::PrintProperty(const char* name,
+                               const TimelineEventBlock* timeline_event_block) {
+  PrintPropertyName(name);
+  PrintValue(timeline_event_block);
+}
+
+
 void JSONStream::PrintfProperty(const char* name, const char* format, ...) {
   PrintPropertyName(name);
   va_list args;
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 8c145681..6c4f23e 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -29,6 +29,7 @@
 class ServiceEvent;
 class String;
 class TimelineEvent;
+class TimelineEventBlock;
 class Zone;
 
 
@@ -162,7 +163,8 @@
   void PrintValue(MessageQueue* queue);
   void PrintValue(Isolate* isolate, bool ref = true);
   bool PrintValueStr(const String& s, intptr_t offset, intptr_t count);
-  void PrintValue(TimelineEvent* timeline_event);
+  void PrintValue(const TimelineEvent* timeline_event);
+  void PrintValue(const TimelineEventBlock* timeline_event_block);
   void PrintValueVM(bool ref = true);
 
   void PrintServiceId(const Object& o);
@@ -189,7 +191,9 @@
   void PrintProperty(const char* name, Metric* metric);
   void PrintProperty(const char* name, MessageQueue* queue);
   void PrintProperty(const char* name, Isolate* isolate);
-  void PrintProperty(const char* name, TimelineEvent* timeline_event);
+  void PrintProperty(const char* name, const TimelineEvent* timeline_event);
+  void PrintProperty(const char* name,
+                     const TimelineEventBlock* timeline_event_block);
   void PrintPropertyVM(const char* name, bool ref = true);
   void PrintPropertyName(const char* name);
   void PrintCommaIfNeeded();
@@ -309,9 +313,14 @@
   void AddProperty(const char* name, Isolate* isolate) const {
     stream_->PrintProperty(name, isolate);
   }
-  void AddProperty(const char* name, TimelineEvent* timeline_event) const {
+  void AddProperty(const char* name,
+                   const TimelineEvent* timeline_event) const {
     stream_->PrintProperty(name, timeline_event);
   }
+  void AddProperty(const char* name,
+                   const TimelineEventBlock* timeline_event_block) const {
+    stream_->PrintProperty(name, timeline_event_block);
+  }
   void AddPropertyVM(const char* name, bool ref = true) const {
     stream_->PrintPropertyVM(name, ref);
   }
@@ -376,9 +385,12 @@
   void AddValue(MessageQueue* queue) const {
     stream_->PrintValue(queue);
   }
-  void AddValue(TimelineEvent* timeline_event) const {
+  void AddValue(const TimelineEvent* timeline_event) const {
     stream_->PrintValue(timeline_event);
   }
+  void AddValue(const TimelineEventBlock* timeline_event_block) const {
+    stream_->PrintValue(timeline_event_block);
+  }
   void AddValueVM(bool ref = true) const {
     stream_->PrintValueVM(ref);
   }
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index c1a9980..eecd798 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -325,7 +325,7 @@
     MonitorLocker ml(&monitor_);
     if (ShouldPauseOnStart(kOK)) {
       if (!is_paused_on_start()) {
-        PausedOnStartLocked(true);
+        PausedOnStartLocked(&ml, true);
       }
       // More messages may have come in before we (re)acquired the monitor.
       status = HandleMessages(&ml, false, false);
@@ -335,7 +335,7 @@
         task_ = NULL;  // No task in queue.
         return;
       } else {
-        PausedOnStartLocked(false);
+        PausedOnStartLocked(&ml, false);
       }
     }
 
@@ -368,7 +368,7 @@
             OS::PrintErr("Isolate %s paused before exiting. "
                          "Use the Observatory to release it.\n", name());
           }
-          PausedOnExitLocked(true);
+          PausedOnExitLocked(&ml, true);
           // More messages may have come in while we released the monitor.
           status = HandleMessages(&ml, false, false);
         }
@@ -378,7 +378,7 @@
           task_ = NULL;  // No task in queue.
           return;
         } else {
-          PausedOnExitLocked(false);
+          PausedOnExitLocked(&ml, false);
         }
       }
       if (FLAG_trace_isolates) {
@@ -454,11 +454,11 @@
 
 void MessageHandler::PausedOnStart(bool paused) {
   MonitorLocker ml(&monitor_);
-  PausedOnStartLocked(paused);
+  PausedOnStartLocked(&ml, paused);
 }
 
 
-void MessageHandler::PausedOnStartLocked(bool paused) {
+void MessageHandler::PausedOnStartLocked(MonitorLocker* ml, bool paused) {
   if (paused) {
     ASSERT(!is_paused_on_start_);
     is_paused_on_start_ = true;
@@ -473,9 +473,9 @@
     // NotifyPauseOnStart.  This avoids a dead lock that can occur
     // when this message handler tries to post a message while a
     // message is being posted to it.
-    monitor_.Exit();
+    ml->Exit();
     NotifyPauseOnStart();
-    monitor_.Enter();
+    ml->Enter();
   } else {
     // Resumed. Clear the resume request of the owning isolate.
     Isolate* owning_isolate = isolate();
@@ -488,11 +488,11 @@
 
 void MessageHandler::PausedOnExit(bool paused) {
   MonitorLocker ml(&monitor_);
-  PausedOnExitLocked(paused);
+  PausedOnExitLocked(&ml, paused);
 }
 
 
-void MessageHandler::PausedOnExitLocked(bool paused) {
+void MessageHandler::PausedOnExitLocked(MonitorLocker* ml, bool paused) {
   if (paused) {
     ASSERT(!is_paused_on_exit_);
     is_paused_on_exit_ = true;
@@ -507,9 +507,9 @@
     // NotifyPauseOnExit.  This avoids a dead lock that can
     // occur when this message handler tries to post a message
     // while a message is being posted to it.
-    monitor_.Exit();
+    ml->Exit();
     NotifyPauseOnExit();
-    monitor_.Enter();
+    ml->Enter();
   } else {
     // Resumed. Clear the resume request of the owning isolate.
     Isolate* owning_isolate = isolate();
@@ -520,38 +520,16 @@
 }
 
 
-MessageHandler::AcquiredQueues::AcquiredQueues()
-    : handler_(NULL) {
+MessageHandler::AcquiredQueues::AcquiredQueues(MessageHandler* handler)
+    : handler_(handler), ml_(&handler->monitor_) {
+  ASSERT(handler != NULL);
+  handler_->oob_message_handling_allowed_ = false;
 }
 
 
 MessageHandler::AcquiredQueues::~AcquiredQueues() {
-  Reset(NULL);
-}
-
-
-void MessageHandler::AcquiredQueues::Reset(MessageHandler* handler) {
-  if (handler_ != NULL) {
-    // Release ownership. The OOB flag is set without holding the monitor.
-    handler_->monitor_.Exit();
-    handler_->oob_message_handling_allowed_ = true;
-  }
-  handler_ = handler;
-  if (handler_ == NULL) {
-    return;
-  }
   ASSERT(handler_ != NULL);
-  // Take ownership. The OOB flag is set without holding the monitor.
-  handler_->oob_message_handling_allowed_ = false;
-  handler_->monitor_.Enter();
-}
-
-
-void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) {
-  ASSERT(acquired_queues != NULL);
-  // No double dipping.
-  ASSERT(acquired_queues->handler_ == NULL);
-  acquired_queues->Reset(this);
+  handler_->oob_message_handling_allowed_ = true;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 6f01328..1d039c5 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -6,15 +6,13 @@
 #define VM_MESSAGE_HANDLER_H_
 
 #include "vm/isolate.h"
+#include "vm/lockers.h"
 #include "vm/message.h"
 #include "vm/os_thread.h"
 #include "vm/thread_pool.h"
 
 namespace dart {
 
-// Forward declarations.
-class MonitorLocker;
-
 // A MessageHandler is an entity capable of accepting messages.
 class MessageHandler {
  protected:
@@ -122,9 +120,12 @@
   void PausedOnStart(bool paused);
   void PausedOnExit(bool paused);
 
+  // Gives temporary ownership of |queue| and |oob_queue|. Using this object
+  // has the side effect that no OOB messages will be handled if a stack
+  // overflow interrupt is delivered.
   class AcquiredQueues : public ValueObject {
    public:
-    AcquiredQueues();
+    explicit AcquiredQueues(MessageHandler* handler);
 
     ~AcquiredQueues();
 
@@ -143,18 +144,12 @@
     }
 
    private:
-    void Reset(MessageHandler* handler);
-
     MessageHandler* handler_;
+    SafepointMonitorLocker ml_;
 
     friend class MessageHandler;
   };
 
-  // Gives temporary ownership of |queue| and |oob_queue|. Calling this
-  // has the side effect that no OOB messages will be handled if a stack
-  // overflow interrupt is delivered.
-  void AcquireQueues(AcquiredQueues* acquired_queue);
-
 #if defined(DEBUG)
   // Check that it is safe to access this message handler.
   //
@@ -218,8 +213,8 @@
 
   // NOTE: These two functions release and reacquire the monitor, you may
   // need to call HandleMessages to ensure all pending messages are handled.
-  void PausedOnStartLocked(bool paused);
-  void PausedOnExitLocked(bool paused);
+  void PausedOnStartLocked(MonitorLocker* ml, bool paused);
+  void PausedOnExitLocked(MonitorLocker* ml, bool paused);
 
   // Dequeue the next message.  Prefer messages from the oob_queue_ to
   // messages from the queue_.
diff --git a/runtime/vm/message_handler_test.cc b/runtime/vm/message_handler_test.cc
index 314eb7c..e6a39a6 100644
--- a/runtime/vm/message_handler_test.cc
+++ b/runtime/vm/message_handler_test.cc
@@ -165,8 +165,7 @@
   EXPECT(!handler.HasOOBMessages());
   {
     // Acquire ownership of message handler queues, verify one regular message.
-    MessageHandler::AcquiredQueues aq;
-    handler.AcquireQueues(&aq);
+    MessageHandler::AcquiredQueues aq(&handler);
     EXPECT(aq.queue()->Length() == 1);
   }
 
@@ -177,8 +176,7 @@
   {
     // Acquire ownership of message handler queues, verify one regular and one
     // OOB message.
-    MessageHandler::AcquiredQueues aq;
-    handler.AcquireQueues(&aq);
+    MessageHandler::AcquiredQueues aq(&handler);
     EXPECT(aq.queue()->Length() == 1);
     EXPECT(aq.oob_queue()->Length() == 1);
   }
@@ -308,8 +306,7 @@
   EXPECT_EQ(port3, ports[1]);  // oob_message2, shutdown
   {
     // The oob queue has been cleared.  oob_message3 is gone.
-    MessageHandler::AcquiredQueues aq;
-    handler.AcquireQueues(&aq);
+    MessageHandler::AcquiredQueues aq(&handler);
     EXPECT(aq.oob_queue()->Length() == 0);
   }
   handler_peer.CloseAllPorts();
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index af27a37..88bc411 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -15,7 +15,6 @@
 namespace dart {
 
 DECLARE_FLAG(bool, trace_natives);
-DECLARE_FLAG(bool, verify_on_transition);
 
 // Forward declarations.
 class BootstrapNatives;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 300070b..faeb61f 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -3345,7 +3345,7 @@
 
 TokenPosition Class::ComputeEndTokenPos() const {
   // Return the begin token for synthetic classes.
-  if (IsMixinApplication() || IsTopLevel()) {
+  if (is_synthesized_class() || IsMixinApplication() || IsTopLevel()) {
     return token_pos();
   }
   const Script& scr = Script::Handle(script());
@@ -4217,6 +4217,104 @@
 }
 
 
+// Returns an instance of Double or Double::null().
+// 'index' points to either:
+// - constants_list_ position of found element, or
+// - constants_list_ position where new canonical can be inserted.
+RawDouble* Class::LookupCanonicalDouble(
+    Zone* zone, double value, intptr_t* index) const {
+  ASSERT(this->raw() == Isolate::Current()->object_store()->double_class());
+  const Array& constants = Array::Handle(zone, this->constants());
+  const intptr_t constants_len = constants.Length();
+  // Linear search to see whether this value is already present in the
+  // list of canonicalized constants.
+  Double& canonical_value = Double::Handle(zone);
+  while (*index < constants_len) {
+    canonical_value ^= constants.At(*index);
+    if (canonical_value.IsNull()) {
+      break;
+    }
+    if (canonical_value.BitwiseEqualsToDouble(value)) {
+      ASSERT(canonical_value.IsCanonical());
+      return canonical_value.raw();
+    }
+    *index = *index + 1;
+  }
+  return Double::null();
+}
+
+
+RawMint* Class::LookupCanonicalMint(
+    Zone* zone, int64_t value, intptr_t* index) const {
+  ASSERT(this->raw() == Isolate::Current()->object_store()->mint_class());
+  const Array& constants = Array::Handle(zone, this->constants());
+  const intptr_t constants_len = constants.Length();
+  // Linear search to see whether this value is already present in the
+  // list of canonicalized constants.
+  Mint& canonical_value = Mint::Handle(zone);
+  while (*index < constants_len) {
+    canonical_value ^= constants.At(*index);
+    if (canonical_value.IsNull()) {
+      break;
+    }
+    if (canonical_value.value() == value) {
+      ASSERT(canonical_value.IsCanonical());
+      return canonical_value.raw();
+    }
+    *index = *index + 1;
+  }
+  return Mint::null();
+}
+
+
+RawBigint* Class::LookupCanonicalBigint(Zone* zone,
+                                        const Bigint& value,
+                                        intptr_t* index) const {
+  ASSERT(this->raw() == Isolate::Current()->object_store()->bigint_class());
+  const Array& constants = Array::Handle(zone, this->constants());
+  const intptr_t constants_len = constants.Length();
+  // Linear search to see whether this value is already present in the
+  // list of canonicalized constants.
+  Bigint& canonical_value = Bigint::Handle(zone);
+  while (*index < constants_len) {
+    canonical_value ^= constants.At(*index);
+    if (canonical_value.IsNull()) {
+      break;
+    }
+    if (canonical_value.Equals(value)) {
+      ASSERT(canonical_value.IsCanonical());
+      return canonical_value.raw();
+    }
+    *index = *index + 1;
+  }
+  return Bigint::null();
+}
+
+
+RawInstance* Class::LookupCanonicalInstance(Zone* zone,
+                                            const Instance& value,
+                                            intptr_t* index) const {
+  ASSERT(this->raw() == value.clazz());
+  const Array& constants = Array::Handle(zone, this->constants());
+  const intptr_t constants_len = constants.Length();
+  // Linear search to see whether this value is already present in the
+  // list of canonicalized constants.
+  Instance& canonical_value = Instance::Handle(zone);
+  while (*index < constants_len) {
+    canonical_value ^= constants.At(*index);
+    if (canonical_value.IsNull()) {
+      break;
+    }
+    if (value.CanonicalizeEquals(canonical_value)) {
+      ASSERT(canonical_value.IsCanonical());
+      return canonical_value.raw();
+    }
+    *index = *index + 1;
+  }
+  return Instance::null();
+}
+
+
 void Class::InsertCanonicalConstant(intptr_t index,
                                     const Instance& constant) const {
   // The constant needs to be added to the list. Grow the list if it is full.
@@ -9403,8 +9501,7 @@
 }
 
 
-// Lookup a name in the library's re-export namespace. The name is
-// unmangled, i.e. no getter or setter names should be looked up.
+// Lookup a name in the library's re-export namespace.
 RawObject* Library::LookupReExport(const String& name) const {
   if (HasExports()) {
     const Array& exports = Array::Handle(this->exports());
@@ -9416,7 +9513,13 @@
       ns ^= exports.At(i);
       obj = ns.Lookup(name);
       if (!obj.IsNull()) {
-        break;
+        // The Lookup call above may return a setter x= when we are looking
+        // for the name x. Make sure we only return when a matching name
+        // is found.
+        String& obj_name = String::Handle(obj.DictionaryName());
+        if (Field::IsSetterName(obj_name) == Field::IsSetterName(name)) {
+          break;
+        }
       }
     }
     StorePointer(&raw_ptr()->exports_, exports.raw());
@@ -9731,6 +9834,14 @@
           // The newly found object is exported from a Dart system
           // library. It is hidden by the previously found object.
           // We continue to search.
+        } else if (Field::IsSetterName(found_obj_name) &&
+                   !Field::IsSetterName(name)) {
+          // We are looking for an unmangled name or a getter, but
+          // the first object we found is a setter. Replace the first
+          // object with the one we just found.
+          first_import_lib_url = import_lib.url();
+          found_obj = obj.raw();
+          found_obj_name = found_obj.DictionaryName();
         } else {
           // We found two different objects with the same name.
           // Note that we need to compare the names again because
@@ -10341,6 +10452,7 @@
   String& import_lib_url = String::Handle();
   String& first_import_lib_url = String::Handle();
   Object& found_obj = Object::Handle();
+  String& found_obj_name = String::Handle();
   for (intptr_t i = 0; i < num_imports(); i++) {
     import ^= imports.At(i);
     obj = import.Lookup(name);
@@ -10356,13 +10468,36 @@
           // from the Dart library.
           first_import_lib_url = import_lib.url();
           found_obj = obj.raw();
+          found_obj_name = found_obj.DictionaryName();
         } else if (import_lib_url.StartsWith(Symbols::DartScheme())) {
           // The newly found object is exported from a Dart system
           // library. It is hidden by the previously found object.
           // We continue to search.
+        } else if (Field::IsSetterName(found_obj_name) &&
+                   !Field::IsSetterName(name)) {
+          // We are looking for an unmangled name or a getter, but
+          // the first object we found is a setter. Replace the first
+          // object with the one we just found.
+          first_import_lib_url = import_lib.url();
+          found_obj = obj.raw();
+          found_obj_name = found_obj.DictionaryName();
         } else {
           // We found two different objects with the same name.
-          return Object::null();
+          // Note that we need to compare the names again because
+          // looking up an unmangled name can return a getter or a
+          // setter. A getter name is the same as the unmangled name,
+          // but a setter name is different from an unmangled name or a
+          // getter name.
+          if (Field::IsGetterName(found_obj_name)) {
+            found_obj_name = Field::NameFromGetter(found_obj_name);
+          }
+          String& second_obj_name = String::Handle(obj.DictionaryName());
+          if (Field::IsGetterName(second_obj_name)) {
+            second_obj_name = Field::NameFromGetter(second_obj_name);
+          }
+          if (found_obj_name.Equals(second_obj_name)) {
+            return Object::null();
+          }
         }
       }
     }
@@ -11366,7 +11501,7 @@
 
 RawStackmap* Stackmap::New(intptr_t pc_offset,
                            BitmapBuilder* bmap,
-                           intptr_t register_bit_count) {
+                           intptr_t slow_path_bit_count) {
   ASSERT(Object::stackmap_class() != Class::null());
   ASSERT(bmap != NULL);
   Stackmap& result = Stackmap::Handle();
@@ -11398,13 +11533,13 @@
   for (intptr_t i = 0; i < length; ++i) {
     result.SetBit(i, bmap->Get(i));
   }
-  result.SetRegisterBitCount(register_bit_count);
+  result.SetSlowPathBitCount(slow_path_bit_count);
   return result.raw();
 }
 
 
 RawStackmap* Stackmap::New(intptr_t length,
-                           intptr_t register_bit_count,
+                           intptr_t slow_path_bit_count,
                            intptr_t pc_offset) {
   ASSERT(Object::stackmap_class() != Class::null());
   Stackmap& result = Stackmap::Handle();
@@ -11432,7 +11567,7 @@
   // address.
   ASSERT(pc_offset >= 0);
   result.SetPcOffset(pc_offset);
-  result.SetRegisterBitCount(register_bit_count);
+  result.SetSlowPathBitCount(slow_path_bit_count);
   return result.raw();
 }
 
@@ -11666,6 +11801,7 @@
 void ExceptionHandlers::SetHandledTypes(intptr_t try_index,
                                         const Array& handled_types) const {
   ASSERT((try_index >= 0) && (try_index < num_entries()));
+  ASSERT(!handled_types.IsNull());
   const Array& handled_types_data =
       Array::Handle(raw_ptr()->handled_types_data_);
   handled_types_data.SetAt(try_index, handled_types);
@@ -12795,6 +12931,15 @@
 }
 
 
+TokenPosition Code::GetTokenPositionAt(intptr_t offset) const {
+  const CodeSourceMap& map = CodeSourceMap::Handle(code_source_map());
+  if (map.IsNull()) {
+    return TokenPosition::kNoSource;
+  }
+  return map.TokenPositionForPCOffset(offset);
+}
+
+
 RawTypedData* Code::GetDeoptInfoAtPc(uword pc,
                                      ICData::DeoptReasonId* deopt_reason,
                                      uint32_t* deopt_flags) const {
@@ -13399,8 +13544,13 @@
 
 
 void Code::GetInlinedFunctionsAt(
-    intptr_t offset, GrowableArray<Function*>* fs) const {
+    intptr_t offset,
+    GrowableArray<Function*>* fs,
+    GrowableArray<TokenPosition>* token_positions) const {
   fs->Clear();
+  if (token_positions != NULL) {
+    token_positions->Clear();
+  }
   const Array& intervals = Array::Handle(GetInlinedIntervals());
   if (intervals.IsNull() || (intervals.Length() == 0)) {
     // E.g., for code stubs.
@@ -13425,6 +13575,7 @@
 
   // Find all functions.
   const Array& id_map = Array::Handle(GetInlinedIdToFunction());
+  const Array& token_pos_map = Array::Handle(GetInlinedIdToTokenPos());
   Smi& temp_smi = Smi::Handle();
   temp_smi ^= intervals.At(found_interval_ix + Code::kInlIntInliningId);
   intptr_t inlining_id = temp_smi.Value();
@@ -13432,8 +13583,12 @@
   intptr_t caller_id = GetCallerId(inlining_id);
   while (inlining_id >= 0) {
     Function& function = Function::ZoneHandle();
-    function  ^= id_map.At(inlining_id);
+    function ^= id_map.At(inlining_id);
     fs->Add(&function);
+    if ((token_positions != NULL) && (inlining_id < token_pos_map.Length())) {
+      temp_smi ^= token_pos_map.At(inlining_id);
+      token_positions->Add(TokenPosition(temp_smi.Value()));
+    }
     inlining_id = caller_id;
     caller_id = GetCallerId(inlining_id);
   }
@@ -13557,7 +13712,12 @@
   for (intptr_t i = 0; i < num_variables(); i++) {
     IndentN(indent + 2);
     obj = At(i);
-    THR_Print("[%" Pd "] = %s\n", i, obj.ToCString());
+    const char* s = obj.ToCString();
+    if (strlen(s) > 50) {
+      THR_Print("[%" Pd "] = [first 50 chars:] %.50s...\n", i, s);
+    } else {
+      THR_Print("[%" Pd "] = %s\n", i, s);
+    }
   }
 
   const Context& parent_ctx = Context::Handle(parent());
@@ -14355,49 +14515,51 @@
   Isolate* isolate = thread->isolate();
   Instance& result = Instance::Handle(zone);
   const Class& cls = Class::Handle(zone, this->clazz());
-  Array& constants = Array::Handle(zone, cls.constants());
-  const intptr_t constants_len = constants.Length();
-  // Linear search to see whether this value is already present in the
-  // list of canonicalized constants.
   intptr_t index = 0;
-  while (index < constants_len) {
-    result ^= constants.At(index);
-    if (result.IsNull()) {
-      break;
-    }
-    if (this->CanonicalizeEquals(result)) {
-      ASSERT(result.IsCanonical());
-      return result.raw();
-    }
-    index++;
+  result ^= cls.LookupCanonicalInstance(zone, *this, &index);
+  if (!result.IsNull()) {
+    return result.raw();
   }
-  // The value needs to be added to the list. Grow the list if
-  // it is full.
-  result ^= this->raw();
-  if (result.IsNew() ||
-      (result.InVMHeap() && (isolate != Dart::vm_isolate()))) {
-    /**
-     * When a snapshot is generated on a 64 bit architecture and then read
-     * into a 32 bit architecture, values which are Smi on the 64 bit
-     * architecture could potentially be converted to Mint objects, however
-     * since Smi values do not have any notion of canonical bits we lose
-     * that information when the object becomes a Mint.
-     * Some of these values could be literal values and end up in the
-     * VM isolate heap. Later when these values are referenced in a
-     * constant list we try to ensure that all the objects in the list
-     * are canonical and try to canonicalize them. When these Mint objects
-     * are encountered they do not have the canonical bit set and
-     * canonicalizing them won't work as the VM heap is read only now.
-     * In these cases we clone the object into the isolate and then
-     * canonicalize it.
-     */
-    // Create a canonical object in old space.
-    result ^= Object::Clone(result, Heap::kOld);
+  {
+    SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
+    // Retry lookup.
+    {
+      Instance& temp_result = Instance::Handle(zone,
+          cls.LookupCanonicalInstance(zone, *this, &index));
+      if (!temp_result.IsNull()) {
+        return temp_result.raw();
+      }
+    }
+
+    // The value needs to be added to the list. Grow the list if
+    // it is full.
+    result ^= this->raw();
+    if (result.IsNew() ||
+        (result.InVMHeap() && (isolate != Dart::vm_isolate()))) {
+      /**
+       * When a snapshot is generated on a 64 bit architecture and then read
+       * into a 32 bit architecture, values which are Smi on the 64 bit
+       * architecture could potentially be converted to Mint objects, however
+       * since Smi values do not have any notion of canonical bits we lose
+       * that information when the object becomes a Mint.
+       * Some of these values could be literal values and end up in the
+       * VM isolate heap. Later when these values are referenced in a
+       * constant list we try to ensure that all the objects in the list
+       * are canonical and try to canonicalize them. When these Mint objects
+       * are encountered they do not have the canonical bit set and
+       * canonicalizing them won't work as the VM heap is read only now.
+       * In these cases we clone the object into the isolate and then
+       * canonicalize it.
+       */
+      // Create a canonical object in old space.
+      result ^= Object::Clone(result, Heap::kOld);
+    }
+    ASSERT(result.IsOld());
+
+    result.SetCanonical();
+    cls.InsertCanonicalConstant(index, result);
+    return result.raw();
   }
-  ASSERT(result.IsOld());
-  cls.InsertCanonicalConstant(index, result);
-  result.SetCanonical();
-  return result.raw();
 }
 
 
@@ -17602,31 +17764,33 @@
 RawMint* Mint::NewCanonical(int64_t value) {
   // Do not allocate a Mint if Smi would do.
   ASSERT(!Smi::IsValid(value));
-  const Class& cls =
-      Class::Handle(Isolate::Current()->object_store()->mint_class());
-  const Array& constants = Array::Handle(cls.constants());
-  const intptr_t constants_len = constants.Length();
-  // Linear search to see whether this value is already present in the
-  // list of canonicalized constants.
-  Mint& canonical_value = Mint::Handle();
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Isolate* isolate = thread->isolate();
+  const Class& cls = Class::Handle(zone, isolate->object_store()->mint_class());
+  Mint& canonical_value = Mint::Handle(zone);
   intptr_t index = 0;
-  while (index < constants_len) {
-    canonical_value ^= constants.At(index);
-    if (canonical_value.IsNull()) {
-      break;
-    }
-    if (canonical_value.value() == value) {
-      ASSERT(canonical_value.IsCanonical());
-      return canonical_value.raw();
-    }
-    index++;
+  canonical_value ^= cls.LookupCanonicalMint(zone, value, &index);
+  if (!canonical_value.IsNull()) {
+    return canonical_value.raw();
   }
-  // The value needs to be added to the constants list. Grow the list if
-  // it is full.
-  canonical_value = Mint::New(value, Heap::kOld);
-  cls.InsertCanonicalConstant(index, canonical_value);
-  canonical_value.SetCanonical();
-  return canonical_value.raw();
+  {
+    SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
+    // Retry lookup.
+    {
+      const Mint& result =
+          Mint::Handle(zone, cls.LookupCanonicalMint(zone, value, &index));
+      if (!result.IsNull()) {
+        return result.raw();
+      }
+    }
+    canonical_value = Mint::New(value, Heap::kOld);
+    canonical_value.SetCanonical();
+    // The value needs to be added to the constants list. Grow the list if
+    // it is full.
+    cls.InsertCanonicalConstant(index, canonical_value);
+    return canonical_value.raw();
+  }
 }
 
 
@@ -17750,30 +17914,36 @@
 
 
 RawDouble* Double::NewCanonical(double value) {
-  const Class& cls =
-      Class::Handle(Isolate::Current()->object_store()->double_class());
-  const Array& constants = Array::Handle(cls.constants());
-  const intptr_t constants_len = constants.Length();
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Isolate* isolate = thread->isolate();
+  const Class& cls = Class::Handle(isolate->object_store()->double_class());
   // Linear search to see whether this value is already present in the
   // list of canonicalized constants.
-  Double& canonical_value = Double::Handle();
+  Double& canonical_value = Double::Handle(zone);
   intptr_t index = 0;
-  while (index < constants_len) {
-    canonical_value ^= constants.At(index);
-    if (canonical_value.IsNull()) {
-      break;
-    }
-    if (canonical_value.BitwiseEqualsToDouble(value)) {
-      return canonical_value.raw();
-    }
-    index++;
+
+  canonical_value ^= cls.LookupCanonicalDouble(zone, value, &index);
+  if (!canonical_value.IsNull()) {
+    return canonical_value.raw();
   }
-  // The value needs to be added to the constants list. Grow the list if
-  // it is full.
-  canonical_value = Double::New(value, Heap::kOld);
-  cls.InsertCanonicalConstant(index, canonical_value);
-  canonical_value.SetCanonical();
-  return canonical_value.raw();
+  {
+    SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
+    // Retry lookup.
+    {
+      const Double& result =
+          Double::Handle(zone, cls.LookupCanonicalDouble(zone, value, &index));
+      if (!result.IsNull()) {
+        return result.raw();
+      }
+    }
+    canonical_value = Double::New(value, Heap::kOld);
+    canonical_value.SetCanonical();
+    // The value needs to be added to the constants list. Grow the list if
+    // it is full.
+    cls.InsertCanonicalConstant(index, canonical_value);
+    return canonical_value.raw();
+  }
 }
 
 
@@ -18054,31 +18224,35 @@
 
 
 RawBigint* Bigint::NewCanonical(const String& str) {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Isolate* isolate = thread->isolate();
   const Bigint& value = Bigint::Handle(
-      Bigint::NewFromCString(str.ToCString(), Heap::kOld));
+      zone, Bigint::NewFromCString(str.ToCString(), Heap::kOld));
   const Class& cls =
-      Class::Handle(Isolate::Current()->object_store()->bigint_class());
-  const Array& constants = Array::Handle(cls.constants());
-  const intptr_t constants_len = constants.Length();
-  // Linear search to see whether this value is already present in the
-  // list of canonicalized constants.
-  Bigint& canonical_value = Bigint::Handle();
+      Class::Handle(zone, isolate->object_store()->bigint_class());
   intptr_t index = 0;
-  while (index < constants_len) {
-    canonical_value ^= constants.At(index);
-    if (canonical_value.IsNull()) {
-      break;
-    }
-    if (canonical_value.Equals(value)) {
-      return canonical_value.raw();
-    }
-    index++;
+  const Bigint& canonical_value =
+      Bigint::Handle(zone, cls.LookupCanonicalBigint(zone, value, &index));
+  if (!canonical_value.IsNull()) {
+    return canonical_value.raw();
   }
-  // The value needs to be added to the constants list. Grow the list if
-  // it is full.
-  cls.InsertCanonicalConstant(index, value);
-  value.SetCanonical();
-  return value.raw();
+  {
+    SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
+    // Retry lookup.
+    {
+      const Bigint& result =
+          Bigint::Handle(zone, cls.LookupCanonicalBigint(zone, value, &index));
+      if (!result.IsNull()) {
+        return result.raw();
+      }
+    }
+    value.SetCanonical();
+    // The value needs to be added to the constants list. Grow the list if
+    // it is full.
+    cls.InsertCanonicalConstant(index, value);
+    return value.raw();
+  }
 }
 
 
@@ -21354,7 +21528,9 @@
       code = CodeAtFrame(i);
       ASSERT(function.raw() == code.function());
       uword pc = code.EntryPoint() + Smi::Value(PcOffsetAtFrame(i));
-      if (code.is_optimized() && expand_inlined() && !FLAG_precompiled_mode) {
+      if (code.is_optimized() &&
+          expand_inlined() &&
+          !FLAG_precompiled_runtime) {
         // Traverse inlined frames.
         for (InlinedFunctionsIterator it(code, pc);
              !it.Done() && (*frame_index < max_frames); it.Advance()) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 8fafabc..78794a9 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -262,15 +262,12 @@
         &raw()->ptr()->tags_, old_tags, new_tags);
   }
   bool IsCanonical() const {
-    ASSERT(!IsNull());
     return raw()->IsCanonical();
   }
   void SetCanonical() const {
-    ASSERT(!IsNull());
     raw()->SetCanonical();
   }
   void ClearCanonical() const {
-    ASSERT(!IsNull());
     raw()->ClearCanonical();
   }
   intptr_t GetClassId() const {
@@ -1201,6 +1198,21 @@
 
   RawLibraryPrefix* LookupLibraryPrefix(const String& name) const;
 
+  // Returns an instance of Double or Double::null().
+  // 'index' points to either:
+  // - constants_list_ position of found element, or
+  // - constants_list_ position where new canonical can be inserted.
+  RawDouble* LookupCanonicalDouble(Zone* zone,
+                                   double value, intptr_t* index) const;
+  RawMint* LookupCanonicalMint(Zone* zone,
+                               int64_t value, intptr_t* index) const;
+  RawBigint* LookupCanonicalBigint(Zone* zone,
+                                   const Bigint& value, intptr_t* index) const;
+  // The methods above are more efficient than this generic one.
+  RawInstance* LookupCanonicalInstance(Zone* zone,
+                                       const Instance& value,
+                                       intptr_t* index) const;
+
   void InsertCanonicalConstant(intptr_t index, const Instance& constant) const;
 
   intptr_t FindCanonicalTypeIndex(const AbstractType& needle) const;
@@ -4149,10 +4161,10 @@
     StoreNonPointer(&raw_ptr()->pc_offset_, value);
   }
 
-  intptr_t RegisterBitCount() const { return raw_ptr()->register_bit_count_; }
-  void SetRegisterBitCount(intptr_t register_bit_count) const {
-    ASSERT(register_bit_count < kMaxInt32);
-    StoreNonPointer(&raw_ptr()->register_bit_count_, register_bit_count);
+  intptr_t SlowPathBitCount() const { return raw_ptr()->slow_path_bit_count_; }
+  void SetSlowPathBitCount(intptr_t bit_count) const {
+    ASSERT(bit_count < kMaxInt32);
+    StoreNonPointer(&raw_ptr()->slow_path_bit_count_, bit_count);
   }
 
   bool Equals(const Stackmap& other) const {
@@ -4370,6 +4382,8 @@
     StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw());
   }
 
+  TokenPosition GetTokenPositionAt(intptr_t offset) const;
+
   // Array of DeoptInfo objects.
   RawArray* deopt_info_array() const {
     return raw_ptr()->deopt_info_array_;
@@ -4468,8 +4482,12 @@
   RawArray* GetInlinedCallerIdMap() const;
   void SetInlinedCallerIdMap(const Array& value) const;
 
+  // If |token_positions| is not NULL it will be populated with the token
+  // positions of the inlined calls.
   void GetInlinedFunctionsAt(
-      intptr_t offset, GrowableArray<Function*>* fs) const;
+      intptr_t offset,
+      GrowableArray<Function*>* fs,
+      GrowableArray<TokenPosition>* token_positions = NULL) const;
 
   void DumpInlinedIntervals() const;
 
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
index 2ca6a7c..976a137 100644
--- a/runtime/vm/os_thread.h
+++ b/runtime/vm/os_thread.h
@@ -266,10 +266,6 @@
   Mutex();
   ~Mutex();
 
-  void Lock();
-  bool TryLock();  // Returns false if lock is busy and locking failed.
-  void Unlock();
-
 #if defined(DEBUG)
   bool IsOwnedByCurrentThread() const {
     return owner_ == OSThread::GetCurrentThreadId();
@@ -282,11 +278,22 @@
 #endif
 
  private:
+  void Lock();
+  bool TryLock();  // Returns false if lock is busy and locking failed.
+  void Unlock();
+
   MutexData data_;
 #if defined(DEBUG)
   ThreadId owner_;
 #endif  // defined(DEBUG)
 
+  friend class MutexLocker;
+  friend class SafepointMutexLocker;
+  friend class OSThreadIterator;
+  friend class TimelineEventBlockIterator;
+  friend class TimelineEventRecorder;
+  friend class PageSpace;
+  friend void Dart_TestMutex();
   DISALLOW_COPY_AND_ASSIGN(Mutex);
 };
 
@@ -303,18 +310,6 @@
   Monitor();
   ~Monitor();
 
-  bool TryEnter();  // Returns false if lock is busy and locking failed.
-  void Enter();
-  void Exit();
-
-  // Wait for notification or timeout.
-  WaitResult Wait(int64_t millis);
-  WaitResult WaitMicros(int64_t micros);
-
-  // Notify waiting threads.
-  void Notify();
-  void NotifyAll();
-
 #if defined(DEBUG)
   bool IsOwnedByCurrentThread() const {
     return owner_ == OSThread::GetCurrentThreadId();
@@ -327,11 +322,26 @@
 #endif
 
  private:
+  bool TryEnter();  // Returns false if lock is busy and locking failed.
+  void Enter();
+  void Exit();
+
+  // Wait for notification or timeout.
+  WaitResult Wait(int64_t millis);
+  WaitResult WaitMicros(int64_t micros);
+
+  // Notify waiting threads.
+  void Notify();
+  void NotifyAll();
+
   MonitorData data_;  // OS-specific data.
 #if defined(DEBUG)
   ThreadId owner_;
 #endif  // defined(DEBUG)
 
+  friend class MonitorLocker;
+  friend class SafepointMonitorLocker;
+  friend void Dart_TestMonitor();
   DISALLOW_COPY_AND_ASSIGN(Monitor);
 };
 
diff --git a/runtime/vm/os_thread_win.cc b/runtime/vm/os_thread_win.cc
index 3802a16..9d282bc 100644
--- a/runtime/vm/os_thread_win.cc
+++ b/runtime/vm/os_thread_win.cc
@@ -6,6 +6,7 @@
 #if defined(TARGET_OS_WINDOWS)
 
 #include "vm/growable_array.h"
+#include "vm/lockers.h"
 #include "vm/os_thread.h"
 
 #include <process.h>  // NOLINT
@@ -565,7 +566,7 @@
     // We only care about thread locals with destructors.
     return;
   }
-  mutex_->Lock();
+  MutexLocker ml(mutex_, false);
 #if defined(DEBUG)
   // Verify that we aren't added twice.
   for (intptr_t i = 0; i < thread_locals_->length(); i++) {
@@ -575,12 +576,12 @@
 #endif
   // Add to list.
   thread_locals_->Add(ThreadLocalEntry(key, destructor));
-  mutex_->Unlock();
 }
 
 
 void ThreadLocalData::RemoveThreadLocal(ThreadLocalKey key) {
-  ASSERT(thread_locals_ != NULL);  mutex_->Lock();
+  ASSERT(thread_locals_ != NULL);
+  MutexLocker ml(mutex_, false);
   intptr_t i = 0;
   for (; i < thread_locals_->length(); i++) {
     const ThreadLocalEntry& entry = thread_locals_->At(i);
@@ -590,11 +591,9 @@
   }
   if (i == thread_locals_->length()) {
     // Not found.
-    mutex_->Unlock();
     return;
   }
   thread_locals_->RemoveAt(i);
-  mutex_->Unlock();
 }
 
 
@@ -603,7 +602,7 @@
 void ThreadLocalData::RunDestructors() {
   ASSERT(thread_locals_ != NULL);
   ASSERT(mutex_ != NULL);
-  mutex_->Lock();
+  MutexLocker ml(mutex_, false);
   for (intptr_t i = 0; i < thread_locals_->length(); i++) {
     const ThreadLocalEntry& entry = thread_locals_->At(i);
     // We access the exiting thread's TLS variable here.
@@ -611,7 +610,6 @@
     // We invoke the constructor here.
     entry.destructor()(p);
   }
-  mutex_->Unlock();
 }
 
 
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index 12b193f..bd4ab5c 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -141,8 +141,11 @@
     last_code_collection_in_us_ = t;
   }
 
-  void Enable(SpaceUsage current) {
+  void set_last_usage(SpaceUsage current) {
     last_usage_ = current;
+  }
+
+  void Enable() {
     is_enabled_ = true;
   }
   void Disable() {
@@ -265,9 +268,14 @@
 
   void StartEndAddress(uword* start, uword* end) const;
 
+  void InitGrowthControl() {
+    page_space_controller_.set_last_usage(usage_);
+    page_space_controller_.Enable();
+  }
+
   void SetGrowthControlState(bool state) {
     if (state) {
-      page_space_controller_.Enable(usage_);
+      page_space_controller_.Enable();
     } else {
       page_space_controller_.Disable();
     }
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 78ca6a5..9cb7dd4 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -11632,7 +11632,14 @@
       // In the pathological case where a library imports itself with
       // a prefix, the name mangling does not help in hiding the private
       // name, so we explicitly prevent lookup of private names here.
-      obj = prefix.LookupObject(extractor_name);
+      if (is_setter_name) {
+        String& setter_name =
+            String::Handle(Z, Field::SetterName(extractor_name));
+        obj = prefix.LookupObject(setter_name);
+      }
+      if (obj.IsNull()) {
+        obj = prefix.LookupObject(extractor_name);
+      }
     }
     if (!prefix.is_loaded() && (parsed_function() != NULL)) {
       // Remember that this function depends on an import prefix of an
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
index 2f876e0..b8bfc18 100644
--- a/runtime/vm/precompiler.cc
+++ b/runtime/vm/precompiler.cc
@@ -148,6 +148,7 @@
     classes_to_retain_(),
     typeargs_to_retain_(),
     types_to_retain_(),
+    consts_to_retain_(),
     error_(Error::Handle()) {
 }
 
@@ -409,6 +410,9 @@
     }
 
     CheckForNewDynamicFunctions();
+    if (!changed_) {
+      TraceConstFunctions();
+    }
   }
 }
 
@@ -581,11 +585,9 @@
       Array& types = Array::Handle(Z);
       for (intptr_t i = 0; i < handlers.num_entries(); i++) {
         types = handlers.GetHandledTypes(i);
-        if (!types.IsNull()) {
-          for (intptr_t j = 0; j < types.Length(); j++) {
-            type ^= types.At(j);
-            AddType(type);
-          }
+        for (intptr_t j = 0; j < types.Length(); j++) {
+          type ^= types.At(j);
+          AddType(type);
         }
       }
     }
@@ -678,6 +680,8 @@
   // argument descriptors.
   if (!instance.IsCanonical()) return;
 
+  consts_to_retain_.Insert(&Instance::ZoneHandle(Z, instance.raw()));
+
   if (cls.NumTypeArguments() > 0) {
     AddTypeArguments(TypeArguments::Handle(Z, instance.GetTypeArguments()));
   }
@@ -1162,6 +1166,36 @@
 }
 
 
+void Precompiler::TraceConstFunctions() {
+  // Compilation of const accessors happens outside of the treeshakers
+  // queue, so we haven't previously scanned its literal pool.
+
+  Library& lib = Library::Handle(Z);
+  Class& cls = Class::Handle(Z);
+  Array& functions = Array::Handle(Z);
+  Function& function = Function::Handle(Z);
+
+  for (intptr_t i = 0; i < libraries_.Length(); i++) {
+    lib ^= libraries_.At(i);
+    ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
+    while (it.HasNext()) {
+      cls = it.GetNextClass();
+      if (cls.IsDynamicClass()) {
+        continue;  // class 'dynamic' is in the read-only VM isolate.
+      }
+
+      functions = cls.functions();
+      for (intptr_t j = 0; j < functions.Length(); j++) {
+        function ^= functions.At(j);
+        if (function.is_const() && function.HasCode()) {
+          AddCalleesOf(function);
+        }
+      }
+    }
+  }
+}
+
+
 void Precompiler::DropFunctions() {
   Library& lib = Library::Handle(Z);
   Class& cls = Class::Handle(Z);
@@ -1210,7 +1244,7 @@
           }
           dropped_function_count_++;
           if (FLAG_trace_precompiler) {
-            THR_Print("Precompilation dropping %s\n",
+            THR_Print("Dropping function %s\n",
                       function.ToLibNamePrefixedQualifiedCString());
           }
         }
@@ -1236,7 +1270,7 @@
     } else {
       dropped_function_count_++;
       if (FLAG_trace_precompiler) {
-        THR_Print("Precompilation dropping %s\n",
+        THR_Print("Dropping function %s\n",
                   function.ToLibNamePrefixedQualifiedCString());
       }
     }
@@ -1281,7 +1315,7 @@
           }
           dropped_field_count_++;
           if (FLAG_trace_precompiler) {
-            THR_Print("Precompilation dropping %s\n",
+            THR_Print("Dropping field %s\n",
                       field.ToCString());
           }
         }
@@ -1392,6 +1426,9 @@
   Library& lib = Library::Handle(Z);
   Class& cls = Class::Handle(Z);
   Array& members = Array::Handle(Z);
+  Array& constants = Array::Handle(Z);
+  GrowableObjectArray& retained_constants = GrowableObjectArray::Handle(Z);
+  Instance& constant = Instance::Handle(Z);
 
   for (intptr_t i = 0; i < libraries_.Length(); i++) {
     lib ^= libraries_.At(i);
@@ -1422,9 +1459,25 @@
         // them.
         retain = true;
       }
-      members = cls.constants();
-      if (members.Length() > 0) {
-        // --compile_all?
+
+      constants = cls.constants();
+      retained_constants = GrowableObjectArray::New();
+      for (intptr_t j = 0; j < constants.Length(); j++) {
+        constant ^= constants.At(j);
+        bool retain = consts_to_retain_.Lookup(&constant) != NULL;
+        if (retain) {
+          retained_constants.Add(constant);
+        }
+      }
+      if (retained_constants.Length() > 0) {
+        constants = Array::MakeArray(retained_constants);
+        cls.set_constants(constants);
+      } else {
+        cls.set_constants(Object::empty_array());
+      }
+
+      if (constants.Length() > 0) {
+        ASSERT(retain);  // This shouldn't be the reason we keep a class.
         retain = true;
       }
 
@@ -1494,7 +1547,7 @@
 
     dropped_class_count_++;
     if (FLAG_trace_precompiler) {
-      THR_Print("Precompilation dropping %" Pd " %s\n", cid, cls.ToCString());
+      THR_Print("Dropping class %" Pd " %s\n", cid, cls.ToCString());
     }
 
 #if defined(DEBUG)
@@ -1531,7 +1584,7 @@
       dropped_library_count_++;
       lib.set_index(-1);
       if (FLAG_trace_precompiler) {
-        THR_Print("Precompilation dropping %s\n", lib.ToCString());
+        THR_Print("Dropping library %s\n", lib.ToCString());
       }
     }
   }
@@ -2015,7 +2068,12 @@
                                   "OptimizationPasses");
 #endif  // !PRODUCT
         inline_id_to_function.Add(&function);
-        inline_id_to_token_pos.Add(function.token_pos());
+        // We do not add the token position now because we don't know the
+        // position of the inlined call until later. A side effect of this
+        // is that the length of |inline_id_to_function| is always larger
+        // than the length of |inline_id_to_token_pos| by one.
+        // Top scope function has no caller (-1). We do this because we expect
+        // all token positions to be at an inlined call.
         // Top scope function has no caller (-1).
         caller_inline_id.Add(-1);
         CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer);
diff --git a/runtime/vm/precompiler.h b/runtime/vm/precompiler.h
index 43b7b96..31465f2 100644
--- a/runtime/vm/precompiler.h
+++ b/runtime/vm/precompiler.h
@@ -236,6 +236,29 @@
 typedef DirectChainedHashMap<TypeArgumentsKeyValueTrait> TypeArgumentsSet;
 
 
+class InstanceKeyValueTrait {
+ public:
+  // Typedefs needed for the DirectChainedHashMap template.
+  typedef const Instance* Key;
+  typedef const Instance* Value;
+  typedef const Instance* Pair;
+
+  static Key KeyOf(Pair kv) { return kv; }
+
+  static Value ValueOf(Pair kv) { return kv; }
+
+  static inline intptr_t Hashcode(Key key) {
+    return key->GetClassId();
+  }
+
+  static inline bool IsKeyEqual(Pair pair, Key key) {
+    return pair->raw() == key->raw();
+  }
+};
+
+typedef DirectChainedHashMap<InstanceKeyValueTrait> InstanceSet;
+
+
 class Precompiler : public ValueObject {
  public:
   static RawError* CompileAll(
@@ -284,6 +307,7 @@
 
   void ProcessFunction(const Function& function);
   void CheckForNewDynamicFunctions();
+  void TraceConstFunctions();
 
   void DropFunctions();
   void DropFields();
@@ -340,6 +364,7 @@
   ClassSet classes_to_retain_;
   TypeArgumentsSet typeargs_to_retain_;
   AbstractTypeSet types_to_retain_;
+  InstanceSet consts_to_retain_;
   Error& error_;
 };
 
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 3de17c8..8eaf6c1 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -5,6 +5,7 @@
 #include "vm/profiler_service.h"
 
 #include "vm/growable_array.h"
+#include "vm/log.h"
 #include "vm/native_symbol.h"
 #include "vm/object.h"
 #include "vm/os.h"
@@ -89,6 +90,23 @@
 };
 
 
+ProfileFunctionSourcePosition::ProfileFunctionSourcePosition(
+    TokenPosition token_pos)
+    : token_pos_(token_pos),
+      exclusive_ticks_(0),
+      inclusive_ticks_(0) {
+}
+
+
+void ProfileFunctionSourcePosition::Tick(bool exclusive) {
+  if (exclusive) {
+    exclusive_ticks_++;
+  } else {
+    inclusive_ticks_++;
+  }
+}
+
+
 ProfileFunction::ProfileFunction(Kind kind,
                   const char* name,
                   const Function& function,
@@ -98,6 +116,7 @@
       function_(Function::ZoneHandle(function.raw())),
       table_index_(table_index),
       profile_codes_(0),
+      source_position_ticks_(0),
       exclusive_ticks_(0),
       inclusive_ticks_(0),
       inclusive_serial_(-1) {
@@ -117,9 +136,13 @@
   return func_name.ToCString();
 }
 
-void ProfileFunction::Tick(bool exclusive, intptr_t inclusive_serial) {
+
+void ProfileFunction::Tick(bool exclusive,
+                           intptr_t inclusive_serial,
+                           TokenPosition token_position) {
   if (exclusive) {
     exclusive_ticks_++;
+    TickSourcePosition(token_position, exclusive);
   }
   // Fall through and tick inclusive count too.
   if (inclusive_serial_ == inclusive_serial) {
@@ -128,6 +151,24 @@
   }
   inclusive_serial_ = inclusive_serial;
   inclusive_ticks_++;
+  TickSourcePosition(token_position, false);
+}
+
+
+void ProfileFunction::TickSourcePosition(TokenPosition token_position,
+                                         bool exclusive) {
+  for (intptr_t i = 0; i < source_position_ticks_.length(); i++) {
+    ProfileFunctionSourcePosition& position = source_position_ticks_[i];
+    if (position.token_pos() == token_position) {
+      // Found existing position, tick it.
+      position.Tick(exclusive);
+      return;
+    }
+  }
+  // Add new one.
+  ProfileFunctionSourcePosition pfsp(token_position);
+  pfsp.Tick(exclusive);
+  source_position_ticks_.Add(pfsp);
 }
 
 
@@ -189,6 +230,18 @@
 }
 
 
+bool ProfileFunction::GetSinglePosition(ProfileFunctionSourcePosition* pfsp) {
+  if (pfsp == NULL) {
+    return false;
+  }
+  if (source_position_ticks_.length() != 1) {
+    return false;
+  }
+  *pfsp = source_position_ticks_[0];
+  return true;
+}
+
+
 ProfileCodeAddress::ProfileCodeAddress(uword pc)
     : pc_(pc),
       exclusive_ticks_(0),
@@ -1388,14 +1441,45 @@
     ASSERT(profile_code != NULL);
     const Code& code = Code::ZoneHandle(profile_code->code());
     GrowableArray<Function*> inlined_functions;
+    GrowableArray<TokenPosition> inlined_token_positions;
+    TokenPosition token_position = TokenPosition::kNoSource;
     if (!code.IsNull()) {
       intptr_t offset = pc - code.EntryPoint();
       if (frame_index != 0) {
         // The PC of frames below the top frame is a call's return address,
         // which can belong to a different inlining interval than the call.
         offset--;
+      } else if (sample->IsAllocationSample()) {
+        // Allocation samples skip the top frame, so the top frame's pc is
+        // also a call's return address.
+        offset--;
+      } else if (!sample->first_frame_executing()) {
+        // If the first frame wasn't executing code (i.e. we started to collect
+        // the stack trace at an exit frame), the top frame's pc is also a
+        // call's return address.
+        offset--;
       }
-      code.GetInlinedFunctionsAt(offset, &inlined_functions);
+      code.GetInlinedFunctionsAt(offset,
+                                 &inlined_functions,
+                                 &inlined_token_positions);
+      token_position = code.GetTokenPositionAt(offset);
+      if (inlined_functions.length() > 0) {
+        // The inlined token position table does not include the token position
+        // of the final call. Insert it at the beginning because the table.
+        // is reversed.
+        inlined_token_positions.InsertAt(0, token_position);
+      }
+      ASSERT(inlined_functions.length() <= inlined_token_positions.length());
+      if (FLAG_trace_profiler) {
+        for (intptr_t i = 0; i < inlined_functions.length(); i++) {
+          const String& name =
+              String::Handle(inlined_functions[i]->QualifiedScrubbedName());
+          THR_Print("InlinedFunction[%" Pd "] = {%s, %s}\n",
+                    i,
+                    name.ToCString(),
+                    inlined_token_positions[i].ToCString());
+        }
+      }
     }
     if (code.IsNull() || (inlined_functions.length() == 0)) {
       // No inlined functions.
@@ -1407,6 +1491,7 @@
                                 sample,
                                 frame_index,
                                 function,
+                                token_position,
                                 code_index);
       if (!inclusive_tree_) {
         current = AppendKind(code, current);
@@ -1421,6 +1506,7 @@
         Function* inlined_function = inlined_functions[i];
         ASSERT(inlined_function != NULL);
         ASSERT(!inlined_function->IsNull());
+        TokenPosition inlined_token_position = inlined_token_positions[i];
         const bool inliner = i == (inlined_functions.length() - 1);
         if (inliner) {
           current = AppendKind(code, current);
@@ -1430,6 +1516,7 @@
                                          sample,
                                          frame_index,
                                          inlined_function,
+                                         inlined_token_position,
                                          code_index);
         if (inliner) {
           current = AppendKind(kInlineStart, current);
@@ -1443,6 +1530,7 @@
         Function* inlined_function = inlined_functions[i];
         ASSERT(inlined_function != NULL);
         ASSERT(!inlined_function->IsNull());
+        TokenPosition inlined_token_position = inlined_token_positions[i];
         const bool inliner = i == (inlined_functions.length() - 1);
         if (inliner) {
           current = AppendKind(kInlineStart, current);
@@ -1452,6 +1540,7 @@
                                          sample,
                                          frame_index + i,
                                          inlined_function,
+                                         inlined_token_position,
                                          code_index);
         if (inliner) {
           current = AppendKind(code, current);
@@ -1468,6 +1557,7 @@
       ProcessedSample* sample,
       intptr_t frame_index,
       Function* inlined_function,
+      TokenPosition inlined_token_position,
       intptr_t code_index) {
     ProfileFunctionTable* function_table = profile_->functions_;
     ProfileFunction* function = function_table->LookupOrAdd(*inlined_function);
@@ -1477,6 +1567,7 @@
                            sample,
                            frame_index,
                            function,
+                           inlined_token_position,
                            code_index);
   }
 
@@ -1494,9 +1585,18 @@
                                            ProcessedSample* sample,
                                            intptr_t frame_index,
                                            ProfileFunction* function,
+                                           TokenPosition token_position,
                                            intptr_t code_index) {
+    if (FLAG_trace_profiler) {
+      THR_Print("S[%" Pd "]F[%" Pd "] %s %s\n",
+                sample_index,
+                frame_index,
+                function->Name(), token_position.ToCString());
+    }
     if (tick_functions_) {
-      function->Tick(IsExecutingFrame(sample, frame_index), sample_index);
+      function->Tick(IsExecutingFrame(sample, frame_index),
+                     sample_index,
+                     token_position);
     }
     function->AddProfileCode(code_index);
     current = current->GetChild(function->table_index());
@@ -2244,6 +2344,50 @@
 }
 
 
+const char* ProfileTrieWalker::CurrentToken() {
+  if (current_ == NULL) {
+    return NULL;
+  }
+  if (code_trie_) {
+    return NULL;
+  }
+  ProfileFunction* func = profile_->GetFunction(current_->table_index());
+  const Function& function = Function::Handle(func->function());
+  if (function.IsNull()) {
+    // No function.
+    return NULL;
+  }
+  const Script& script = Script::Handle(function.script());
+  if (script.IsNull()) {
+    // No script.
+    return NULL;
+  }
+  const TokenStream& token_stream = TokenStream::Handle(script.tokens());
+  if (token_stream.IsNull()) {
+    // No token position.
+    return NULL;
+  }
+  ProfileFunctionSourcePosition pfsp(TokenPosition::kNoSource);
+  if (!func->GetSinglePosition(&pfsp)) {
+    // Not exactly one source position.
+    return NULL;
+  }
+  TokenPosition token_pos = pfsp.token_pos();
+  if (!token_pos.IsReal() && !token_pos.IsSynthetic()) {
+    // Not a location in a script.
+    return NULL;
+  }
+  if (token_pos.IsSynthetic()) {
+    token_pos = token_pos.FromSynthetic();
+  }
+  TokenStream::Iterator iterator(token_stream, token_pos);
+  const String& str = String::Handle(iterator.CurrentLiteral());
+  if (str.IsNull()) {
+    return NULL;
+  }
+  return str.ToCString();
+}
+
 bool ProfileTrieWalker::Down() {
   if ((current_ == NULL) || (current_->NumChildren() == 0)) {
     return false;
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h
index 15f3f7d..218bcb9 100644
--- a/runtime/vm/profiler_service.h
+++ b/runtime/vm/profiler_service.h
@@ -12,6 +12,7 @@
 #include "vm/object.h"
 #include "vm/tags.h"
 #include "vm/thread_interrupter.h"
+#include "vm/token_position.h"
 
 // CPU Profile model and service protocol bits.
 // NOTE: For sampling and stack walking related code, see profiler.h.
@@ -30,6 +31,25 @@
 class SampleFilter;
 class ProcessedSampleBuffer;
 
+class ProfileFunctionSourcePosition {
+ public:
+  explicit ProfileFunctionSourcePosition(TokenPosition token_pos);
+
+  void Tick(bool exclusive);
+
+  TokenPosition token_pos() const { return token_pos_; }
+  intptr_t exclusive_ticks() const { return exclusive_ticks_; }
+  intptr_t inclusive_ticks() const { return inclusive_ticks_; }
+
+ private:
+  TokenPosition token_pos_;
+  intptr_t exclusive_ticks_;
+  intptr_t inclusive_ticks_;
+
+  DISALLOW_ALLOCATION();
+};
+
+
 // Profile data related to a |Function|.
 class ProfileFunction : public ZoneAllocated {
  public:
@@ -72,18 +92,26 @@
     inclusive_ticks_++;
   }
 
-  void Tick(bool exclusive, intptr_t inclusive_serial);
+  void Tick(bool exclusive,
+            intptr_t inclusive_serial,
+            TokenPosition token_position);
 
   static const char* KindToCString(Kind kind);
 
   void PrintToJSONArray(JSONArray* functions);
 
+  // Returns true if the call was successful and |pfsp| is set.
+  bool GetSinglePosition(ProfileFunctionSourcePosition* pfsp);
+
+  void TickSourcePosition(TokenPosition token_position, bool exclusive);
+
  private:
   const Kind kind_;
   const char* name_;
   const Function& function_;
   const intptr_t table_index_;
   ZoneGrowableArray<intptr_t> profile_codes_;
+  ZoneGrowableArray<ProfileFunctionSourcePosition> source_position_ticks_;
 
   intptr_t exclusive_ticks_;
   intptr_t inclusive_ticks_;
@@ -376,6 +404,12 @@
   // Return the number siblings (including yourself).
   intptr_t SiblingCount();
 
+  // If the following conditions are met returns the current token:
+  // 1) This is a function trie.
+  // 2) There is only one token position for a given function.
+  // Will return NULL otherwise.
+  const char* CurrentToken();
+
   bool Down();
   bool NextSibling();
 
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index f9ae241..f0354fe 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -17,6 +17,26 @@
 
 DECLARE_FLAG(bool, profile_vm);
 DECLARE_FLAG(int, max_profile_depth);
+DECLARE_FLAG(bool, enable_inlining_annotations);
+DECLARE_FLAG(int, optimization_counter_threshold);
+
+template<typename T>
+class SetFlagScope : public ValueObject {
+ public:
+  SetFlagScope(T* flag, T value)
+      : flag_(flag),
+        original_value_(*flag) {
+    *flag_ = value;
+  }
+
+  ~SetFlagScope() {
+    *flag_ = original_value_;
+  }
+
+ private:
+  T* flag_;
+  T original_value_;
+};
 
 // Some tests are written assuming native stack trace profiling is disabled.
 class DisableNativeProfileScope : public ValueObject {
@@ -1658,6 +1678,629 @@
   }
 }
 
+
+TEST_CASE(Profiler_BasicSourcePosition) {
+  DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
+  const char* kScript =
+      "const AlwaysInline = 'AlwaysInline';\n"
+      "const NeverInline = 'NeverInline';\n"
+      "class A {\n"
+      "  var a;\n"
+      "  var b;\n"
+      "  @NeverInline A() { }\n"
+      "}\n"
+      "class B {\n"
+      "  @AlwaysInline\n"
+      "  static boo() {\n"
+      "    return new A();\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  B.boo();\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& root_library = Library::Handle();
+  root_library ^= Api::UnwrapHandle(lib);
+
+  const Class& class_a = Class::Handle(GetClass(root_library, "A"));
+  EXPECT(!class_a.IsNull());
+
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Turn on allocation tracing for A.
+  class_a.SetTraceAllocation(true);
+
+  // Allocate one time.
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  {
+    Thread* thread = Thread::Current();
+    Isolate* isolate = thread->isolate();
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+    Profile profile(isolate);
+    AllocationFilter filter(isolate, class_a.id());
+    profile.Build(thread, &filter, Profile::kNoTags);
+    // We should have one allocation samples.
+    EXPECT_EQ(1, profile.sample_count());
+    ProfileTrieWalker walker(&profile);
+
+    // Exclusive function: B.boo -> main.
+    walker.Reset(Profile::kExclusiveFunction);
+    // Move down from the root.
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("A", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("boo", walker.CurrentToken());
+    EXPECT(!walker.Down());
+  }
+}
+
+
+TEST_CASE(Profiler_BasicSourcePositionOptimized) {
+  DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
+  // We use the AlwaysInline and NeverInline annotations in this test.
+  SetFlagScope<bool> sfs(&FLAG_enable_inlining_annotations, true);
+  // Optimize quickly.
+  SetFlagScope<int> sfs2(&FLAG_optimization_counter_threshold, 5);
+  const char* kScript =
+      "const AlwaysInline = 'AlwaysInline';\n"
+      "const NeverInline = 'NeverInline';\n"
+      "class A {\n"
+      "  var a;\n"
+      "  var b;\n"
+      "  @NeverInline A() { }\n"
+      "}\n"
+      "class B {\n"
+      "  @AlwaysInline\n"
+      "  static boo() {\n"
+      "    return new A();\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  B.boo();\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& root_library = Library::Handle();
+  root_library ^= Api::UnwrapHandle(lib);
+
+  const Class& class_a = Class::Handle(GetClass(root_library, "A"));
+  EXPECT(!class_a.IsNull());
+
+  const Function& main = Function::Handle(GetFunction(root_library, "main"));
+  EXPECT(!main.IsNull());
+
+  // Warm up function.
+  while (true) {
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+    const Code& code = Code::Handle(main.CurrentCode());
+    if (code.is_optimized()) {
+      // Warmed up.
+      break;
+    }
+  }
+
+  // Turn on allocation tracing for A.
+  class_a.SetTraceAllocation(true);
+
+  // Allocate one time.
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Still optimized.
+  const Code& code = Code::Handle(main.CurrentCode());
+  EXPECT(code.is_optimized());
+
+  {
+    Thread* thread = Thread::Current();
+    Isolate* isolate = thread->isolate();
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+    Profile profile(isolate);
+    AllocationFilter filter(isolate, class_a.id());
+    profile.Build(thread, &filter, Profile::kNoTags);
+    // We should have one allocation samples.
+    EXPECT_EQ(1, profile.sample_count());
+    ProfileTrieWalker walker(&profile);
+
+    // Exclusive function: B.boo -> main.
+    walker.Reset(Profile::kExclusiveFunction);
+    // Move down from the root.
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("A", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("boo", walker.CurrentToken());
+    EXPECT(!walker.Down());
+  }
+}
+
+
+TEST_CASE(Profiler_SourcePosition) {
+  DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
+  const char* kScript =
+      "const AlwaysInline = 'AlwaysInline';\n"
+      "const NeverInline = 'NeverInline';\n"
+      "class A {\n"
+      "  var a;\n"
+      "  var b;\n"
+      "  @NeverInline A() { }\n"
+      "}\n"
+      "class B {\n"
+      "  @NeverInline\n"
+      "  static oats() {\n"
+      "    return boo();\n"
+      "  }\n"
+      "  @AlwaysInline\n"
+      "  static boo() {\n"
+      "    return new A();\n"
+      "  }\n"
+      "}\n"
+      "class C {\n"
+      "  @NeverInline bacon() {\n"
+      "    return fox();\n"
+      "  }\n"
+      "  @AlwaysInline fox() {\n"
+      "    return B.oats();\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  new C()..bacon();\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& root_library = Library::Handle();
+  root_library ^= Api::UnwrapHandle(lib);
+
+  const Class& class_a = Class::Handle(GetClass(root_library, "A"));
+  EXPECT(!class_a.IsNull());
+
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Turn on allocation tracing for A.
+  class_a.SetTraceAllocation(true);
+
+  // Allocate one time.
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  {
+    Thread* thread = Thread::Current();
+    Isolate* isolate = thread->isolate();
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+    Profile profile(isolate);
+    AllocationFilter filter(isolate, class_a.id());
+    profile.Build(thread, &filter, Profile::kNoTags);
+    // We should have one allocation samples.
+    EXPECT_EQ(1, profile.sample_count());
+    ProfileTrieWalker walker(&profile);
+
+    // Exclusive function: B.boo -> main.
+    walker.Reset(Profile::kExclusiveFunction);
+    // Move down from the root.
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("A", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.oats", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("boo", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.fox", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("oats", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.bacon", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("fox", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("bacon", walker.CurrentToken());
+    EXPECT(!walker.Down());
+  }
+}
+
+
+TEST_CASE(Profiler_SourcePositionOptimized) {
+  DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
+  // We use the AlwaysInline and NeverInline annotations in this test.
+  SetFlagScope<bool> sfs(&FLAG_enable_inlining_annotations, true);
+  // Optimize quickly.
+  SetFlagScope<int> sfs2(&FLAG_optimization_counter_threshold, 5);
+
+  const char* kScript =
+      "const AlwaysInline = 'AlwaysInline';\n"
+      "const NeverInline = 'NeverInline';\n"
+      "class A {\n"
+      "  var a;\n"
+      "  var b;\n"
+      "  @NeverInline A() { }\n"
+      "}\n"
+      "class B {\n"
+      "  @NeverInline\n"
+      "  static oats() {\n"
+      "    return boo();\n"
+      "  }\n"
+      "  @AlwaysInline\n"
+      "  static boo() {\n"
+      "    return new A();\n"
+      "  }\n"
+      "}\n"
+      "class C {\n"
+      "  @NeverInline bacon() {\n"
+      "    return fox();\n"
+      "  }\n"
+      "  @AlwaysInline fox() {\n"
+      "    return B.oats();\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  new C()..bacon();\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& root_library = Library::Handle();
+  root_library ^= Api::UnwrapHandle(lib);
+
+  const Class& class_a = Class::Handle(GetClass(root_library, "A"));
+  EXPECT(!class_a.IsNull());
+
+  const Function& main = Function::Handle(GetFunction(root_library, "main"));
+  EXPECT(!main.IsNull());
+
+  // Warm up function.
+  while (true) {
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+    const Code& code = Code::Handle(main.CurrentCode());
+    if (code.is_optimized()) {
+      // Warmed up.
+      break;
+    }
+  }
+
+  // Turn on allocation tracing for A.
+  class_a.SetTraceAllocation(true);
+
+  // Allocate one time.
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Still optimized.
+  const Code& code = Code::Handle(main.CurrentCode());
+  EXPECT(code.is_optimized());
+
+  {
+    Thread* thread = Thread::Current();
+    Isolate* isolate = thread->isolate();
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+    Profile profile(isolate);
+    AllocationFilter filter(isolate, class_a.id());
+    profile.Build(thread, &filter, Profile::kNoTags);
+    // We should have one allocation samples.
+    EXPECT_EQ(1, profile.sample_count());
+    ProfileTrieWalker walker(&profile);
+
+    // Exclusive function: B.boo -> main.
+    walker.Reset(Profile::kExclusiveFunction);
+    // Move down from the root.
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("A", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.oats", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("boo", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.fox", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("oats", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.bacon", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("fox", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("bacon", walker.CurrentToken());
+    EXPECT(!walker.Down());
+  }
+}
+
+
+TEST_CASE(Profiler_BinaryOperatorSourcePosition) {
+  DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
+  const char* kScript =
+      "const AlwaysInline = 'AlwaysInline';\n"
+      "const NeverInline = 'NeverInline';\n"
+      "class A {\n"
+      "  var a;\n"
+      "  var b;\n"
+      "  @NeverInline A() { }\n"
+      "}\n"
+      "class B {\n"
+      "  @NeverInline\n"
+      "  static oats() {\n"
+      "    return boo();\n"
+      "  }\n"
+      "  @AlwaysInline\n"
+      "  static boo() {\n"
+      "    return new A();\n"
+      "  }\n"
+      "}\n"
+      "class C {\n"
+      "  @NeverInline bacon() {\n"
+      "    return this + this;\n"
+      "  }\n"
+      "  @AlwaysInline operator+(C other) {\n"
+      "    return fox();\n"
+      "  }\n"
+      "  @AlwaysInline fox() {\n"
+      "    return B.oats();\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  new C()..bacon();\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& root_library = Library::Handle();
+  root_library ^= Api::UnwrapHandle(lib);
+
+  const Class& class_a = Class::Handle(GetClass(root_library, "A"));
+  EXPECT(!class_a.IsNull());
+
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Turn on allocation tracing for A.
+  class_a.SetTraceAllocation(true);
+
+  // Allocate one time.
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  {
+    Thread* thread = Thread::Current();
+    Isolate* isolate = thread->isolate();
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+    Profile profile(isolate);
+    AllocationFilter filter(isolate, class_a.id());
+    profile.Build(thread, &filter, Profile::kNoTags);
+    // We should have one allocation samples.
+    EXPECT_EQ(1, profile.sample_count());
+    ProfileTrieWalker walker(&profile);
+
+    // Exclusive function: B.boo -> main.
+    walker.Reset(Profile::kExclusiveFunction);
+    // Move down from the root.
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("A", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.oats", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("boo", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.fox", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("oats", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.+", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("fox", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.bacon", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("+", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("bacon", walker.CurrentToken());
+    EXPECT(!walker.Down());
+  }
+}
+
+
+TEST_CASE(Profiler_BinaryOperatorSourcePositionOptimized) {
+  DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
+  // We use the AlwaysInline and NeverInline annotations in this test.
+  SetFlagScope<bool> sfs(&FLAG_enable_inlining_annotations, true);
+  // Optimize quickly.
+  SetFlagScope<int> sfs2(&FLAG_optimization_counter_threshold, 5);
+
+  const char* kScript =
+      "const AlwaysInline = 'AlwaysInline';\n"
+      "const NeverInline = 'NeverInline';\n"
+      "class A {\n"
+      "  var a;\n"
+      "  var b;\n"
+      "  @NeverInline A() { }\n"
+      "}\n"
+      "class B {\n"
+      "  @NeverInline\n"
+      "  static oats() {\n"
+      "    return boo();\n"
+      "  }\n"
+      "  @AlwaysInline\n"
+      "  static boo() {\n"
+      "    return new A();\n"
+      "  }\n"
+      "}\n"
+      "class C {\n"
+      "  @NeverInline bacon() {\n"
+      "    return this + this;\n"
+      "  }\n"
+      "  @AlwaysInline operator+(C other) {\n"
+      "    return fox();\n"
+      "  }\n"
+      "  @AlwaysInline fox() {\n"
+      "    return B.oats();\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  new C()..bacon();\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& root_library = Library::Handle();
+  root_library ^= Api::UnwrapHandle(lib);
+
+  const Class& class_a = Class::Handle(GetClass(root_library, "A"));
+  EXPECT(!class_a.IsNull());
+
+  const Function& main = Function::Handle(GetFunction(root_library, "main"));
+  EXPECT(!main.IsNull());
+
+  // Warm up function.
+  while (true) {
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+    const Code& code = Code::Handle(main.CurrentCode());
+    if (code.is_optimized()) {
+      // Warmed up.
+      break;
+    }
+  }
+
+  // Turn on allocation tracing for A.
+  class_a.SetTraceAllocation(true);
+
+  // Allocate one time.
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Still optimized.
+  const Code& code = Code::Handle(main.CurrentCode());
+  EXPECT(code.is_optimized());
+
+  {
+    Thread* thread = Thread::Current();
+    Isolate* isolate = thread->isolate();
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+    Profile profile(isolate);
+    AllocationFilter filter(isolate, class_a.id());
+    profile.Build(thread, &filter, Profile::kNoTags);
+    // We should have one allocation samples.
+    EXPECT_EQ(1, profile.sample_count());
+    ProfileTrieWalker walker(&profile);
+
+    // Exclusive function: B.boo -> main.
+    walker.Reset(Profile::kExclusiveFunction);
+    // Move down from the root.
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("A", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("B.oats", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("boo", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.fox", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("oats", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.+", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("fox", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("C.bacon", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("+", walker.CurrentToken());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_EQ(1, walker.CurrentNodeTickCount());
+    EXPECT_EQ(1, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT_STREQ("bacon", walker.CurrentToken());
+    EXPECT(!walker.Down());
+  }
+}
+
 #endif  // !PRODUCT
 
 }  // namespace dart
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index c30823f..f438fc9 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1254,7 +1254,7 @@
   // as large as ~33 million entries. If that is sufficient, then these two
   // fields can be merged into a BitField.
   int32_t length_;  // Length of payload, in bits.
-  int32_t register_bit_count_;  // Live register bits, included in length_.
+  int32_t slow_path_bit_count_;  // Slow path live values, included in length_.
 
   // Offset from code entry point corresponding to this stack map
   // representation.
@@ -1455,7 +1455,7 @@
   }
   int32_t deopt_id_;     // Deoptimization id corresponding to this IC.
   uint32_t state_bits_;  // Number of arguments tested in IC, deopt reasons,
-                         // is closure call, JS warning issued, range feedback.
+                         // range feedback.
 };
 
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index ed22fa2..d02909c 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -732,9 +732,8 @@
   // Signature type.
   writer->WriteObjectImpl(ptr()->signature_type_, kAsInlinedObject);
 
-  // Static closure/Closure allocation stub.
-  // We don't write the closure or allocation stub in the snapshot.
-  writer->WriteVMIsolateObject(kNullObject);
+  // Canonical static closure.
+  writer->WriteObjectImpl(ptr()->closure_, kAsInlinedObject);
 }
 
 
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 1d6de6c..bd04d7f 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -435,6 +435,7 @@
   ASSERT(!word_character_field.IsNull());
 
   if (word_character_field.IsUninitialized()) {
+    ASSERT(!Compiler::IsBackgroundCompilation());
     word_character_field.EvaluateInitializer();
   }
   ASSERT(!word_character_field.IsUninitialized());
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index b7ac721..aca3a5b 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -122,6 +122,7 @@
 StreamInfo Service::graph_stream("_Graph");
 StreamInfo Service::logging_stream("_Logging");
 StreamInfo Service::extension_stream("Extension");
+StreamInfo Service::timeline_stream("Timeline");
 
 static StreamInfo* streams_[] = {
   &Service::vm_stream,
@@ -132,6 +133,7 @@
   &Service::graph_stream,
   &Service::logging_stream,
   &Service::extension_stream,
+  &Service::timeline_stream,
 };
 
 
@@ -1030,11 +1032,12 @@
     params.AddProperty("streamId", stream_id);
     params.AddProperty("event", event);
   }
-  PostEvent(stream_id, event->KindAsCString(), &js);
+  PostEvent(event->isolate(), stream_id, event->KindAsCString(), &js);
 }
 
 
-void Service::PostEvent(const char* stream_id,
+void Service::PostEvent(Isolate* isolate,
+                        const char* stream_id,
                         const char* kind,
                         JSONStream* event) {
   ASSERT(stream_id != NULL);
@@ -1063,7 +1066,6 @@
   list_values[1] = &json_cobj;
 
   if (FLAG_trace_service) {
-    Isolate* isolate = Isolate::Current();
     const char* isolate_name = "<no current isolate>";
     if (isolate != NULL) {
       isolate_name = isolate->name();
@@ -1291,8 +1293,7 @@
   }
 
   {
-    MessageHandler::AcquiredQueues aq;
-    isolate->message_handler()->AcquireQueues(&aq);
+    MessageHandler::AcquiredQueues aq(isolate->message_handler());
     jsobj.AddProperty("messages", aq.queue());
   }
 
@@ -1679,8 +1680,7 @@
   if (!GetUnsignedIntegerId(parts[1], &message_id, 16)) {
     return Object::sentinel().raw();
   }
-  MessageHandler::AcquiredQueues aq;
-  thread->isolate()->message_handler()->AcquireQueues(&aq);
+  MessageHandler::AcquiredQueues aq(thread->isolate()->message_handler());
   Message* message = aq.queue()->FindMessageById(message_id);
   if (message == NULL) {
     // The user may try to load an expired message.
@@ -3016,6 +3016,16 @@
     PrintSuccess(js);
     return true;
   }
+  if (isolate->message_handler()->should_pause_on_start()) {
+    isolate->message_handler()->set_should_pause_on_start(false);
+    isolate->SetResumeRequest();
+    if (Service::debug_stream.enabled()) {
+      ServiceEvent event(isolate, ServiceEvent::kResume);
+      Service::HandleEvent(&event);
+    }
+    PrintSuccess(js);
+    return true;
+  }
   if (isolate->message_handler()->is_paused_on_exit()) {
     isolate->message_handler()->set_should_pause_on_exit(false);
     isolate->SetResumeRequest();
@@ -4043,7 +4053,7 @@
     get_retained_size_params },
   { "_getRetainingPath", GetRetainingPath,
     get_retaining_path_params },
-  { "_getSourceReport", GetSourceReport,
+  { "getSourceReport", GetSourceReport,
     get_source_report_params },
   { "getStack", GetStack,
     get_stack_params },
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 164a94f..b7917ec 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -144,6 +144,7 @@
   static StreamInfo graph_stream;
   static StreamInfo logging_stream;
   static StreamInfo extension_stream;
+  static StreamInfo timeline_stream;
 
   static bool ListenStream(const char* stream_id);
   static void CancelStream(const char* stream_id);
@@ -184,7 +185,8 @@
                                 const uint8_t* data,
                                 intptr_t size);
 
-  static void PostEvent(const char* stream_id,
+  static void PostEvent(Isolate* isolate,
+                        const char* stream_id,
                         const char* kind,
                         JSONStream* event);
 
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 3153563..7e6c7f0 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -769,9 +769,10 @@
 -------- | -----------
 VM | VMUpdate
 Isolate | IsolateStart, IsolateRunnable, IsolateExit, IsolateUpdate, ServiceExtensionAdded
-Debug | PauseStart, PauseExit, PauseBreakpoint, PauseInterrupted, PauseException, Resume, BreakpointAdded, BreakpointResolved, BreakpointRemoved, Inspect
+Debug | PauseStart, PauseExit, PauseBreakpoint, PauseInterrupted, PauseException, Resume, BreakpointAdded, BreakpointResolved, BreakpointRemoved, Inspect, None
 GC | GC
 Extension | Extension
+Timeline | TimelineEvents
 
 Additionally, some embedders provide the _Stdout_ and _Stderr_
 streams.  These streams allow the client to subscribe to writes to
@@ -1213,6 +1214,11 @@
   // This is provided for the Extension event.
   ExtensionData extensionData [optional];
 
+  // An array of TimelineEvents
+  //
+  // This is provided for the TimelineEvents event.
+  TimelineEvent[] timelineEvents [optional];
+
   // Is the isolate paused at an await, yield, or yield* statement?
   //
   // This is provided for the event kinds:
@@ -1271,6 +1277,10 @@
   // An isolate has started or resumed execution.
   Resume,
 
+  // Indicates an isolate is not yet runnable. Only appears in an Isolate's
+  // pauseEvent. Never sent over a stream.
+  None,
+
   // A breakpoint has been added for an isolate.
   BreakpointAdded,
 
@@ -2361,6 +2371,15 @@
 
 The _Success_ type is used to indicate that an operation completed successfully.
 
+### TimelineEvent
+
+```
+class TimelineEvent {
+}
+```
+
+An _TimelineEvent_ is an arbitrary map that contains a [Trace Event Format](https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview) event.
+
 ### TypeArguments
 
 ```
diff --git a/runtime/vm/service_event.cc b/runtime/vm/service_event.cc
index 2e64c66..502a38b 100644
--- a/runtime/vm/service_event.cc
+++ b/runtime/vm/service_event.cc
@@ -42,6 +42,7 @@
       embedder_stream_id_(NULL),
       breakpoint_(NULL),
       top_frame_(NULL),
+      timeline_event_block_(NULL),
       extension_rpc_(NULL),
       exception_(NULL),
       at_async_jump_(false),
@@ -64,6 +65,7 @@
       kind_(TranslateEventKind(debugger_event->type())),
       breakpoint_(NULL),
       top_frame_(NULL),
+      timeline_event_block_(NULL),
       extension_rpc_(NULL),
       exception_(NULL),
       at_async_jump_(false),
@@ -115,6 +117,8 @@
       return "PauseInterrupted";
     case kPauseException:
       return "PauseException";
+    case kNone:
+      return "None";
     case kResume:
       return "Resume";
     case kBreakpointAdded:
@@ -137,6 +141,8 @@
       return "Illegal";
     case kExtension:
       return "Extension";
+    case kTimelineEvents:
+      return "TimelineEvents";
     default:
       UNREACHABLE();
       return "Unknown";
@@ -161,6 +167,7 @@
     case kPauseBreakpoint:
     case kPauseInterrupted:
     case kPauseException:
+    case kNone:
     case kResume:
     case kBreakpointAdded:
     case kBreakpointResolved:
@@ -181,6 +188,9 @@
     case kExtension:
       return Service::extension_stream.id();
 
+    case kTimelineEvents:
+      return Service::timeline_stream.id();
+
     default:
       UNREACHABLE();
       return NULL;
@@ -207,6 +217,9 @@
       jsobj.AddProperty("breakpoint", breakpoint());
     }
   }
+  if (kind() == kTimelineEvents) {
+    jsobj.AddProperty("timelineEvents", timeline_event_block_);
+  }
   if (kind() == kDebuggerSettingsUpdate) {
     JSONObject jssettings(&jsobj, "_debuggerSettings");
     isolate()->debugger()->PrintSettingsToJSONObject(&jssettings);
@@ -261,7 +274,7 @@
     jsobj->AddProperty("extensionKind",
                        extension_event_.event_kind->ToCString());
   }
-  if (kind() == kVMUpdate) {
+  if (isolate() == NULL) {
     jsobj->AddPropertyVM("vm");
   } else {
     jsobj->AddProperty("isolate", isolate());
diff --git a/runtime/vm/service_event.h b/runtime/vm/service_event.h
index e5afb6d..3ca26e4 100644
--- a/runtime/vm/service_event.h
+++ b/runtime/vm/service_event.h
@@ -8,6 +8,7 @@
 #include "vm/debugger.h"
 
 class DebuggerEvent;
+class TimelineEventBlock;
 
 namespace dart {
 
@@ -28,6 +29,7 @@
     kPauseBreakpoint,
     kPauseInterrupted,
     kPauseException,
+    kNone,               // isolate has not been made runnable yet.
     kResume,
     kBreakpointAdded,
     kBreakpointResolved,
@@ -43,6 +45,8 @@
 
     kExtension,
 
+    kTimelineEvents,
+
     kIllegal,
   };
 
@@ -182,6 +186,15 @@
     return timestamp_;
   }
 
+  const TimelineEventBlock* timeline_event_block() const {
+    return timeline_event_block_;
+  }
+
+  void set_timeline_event_block(const TimelineEventBlock* block) {
+    ASSERT(kind() == kTimelineEvents);
+    timeline_event_block_ = block;
+  }
+
   void PrintJSON(JSONStream* js) const;
 
   void PrintJSONHeader(JSONObject* jsobj) const;
@@ -193,6 +206,7 @@
   const char* embedder_stream_id_;
   Breakpoint* breakpoint_;
   ActivationFrame* top_frame_;
+  const TimelineEventBlock* timeline_event_block_;
   const String* extension_rpc_;
   const Object* exception_;
   bool at_async_jump_;
diff --git a/runtime/vm/signal_handler_android.cc b/runtime/vm/signal_handler_android.cc
index a85dbb7..d41eb59 100644
--- a/runtime/vm/signal_handler_android.cc
+++ b/runtime/vm/signal_handler_android.cc
@@ -14,6 +14,8 @@
 
 #if defined(HOST_ARCH_IA32)
   pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]);
+#elif defined(HOST_ARCH_X64)
+  pc = static_cast<uintptr_t>(mcontext.gregs[REG_RIP]);
 #elif defined(HOST_ARCH_ARM)
   pc = static_cast<uintptr_t>(mcontext.arm_pc);
 #elif defined(HOST_ARCH_ARM64)
@@ -30,6 +32,8 @@
 
 #if defined(HOST_ARCH_IA32)
   fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]);
+#elif defined(HOST_ARCH_X64)
+  fp = static_cast<uintptr_t>(mcontext.gregs[REG_RBP]);
 #elif defined(HOST_ARCH_ARM)
   fp = static_cast<uintptr_t>(mcontext.arm_fp);
 #elif defined(HOST_ARCH_ARM64)
@@ -47,6 +51,8 @@
 
 #if defined(HOST_ARCH_IA32)
   sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]);
+#elif defined(HOST_ARCH_X64)
+  sp = static_cast<uintptr_t>(mcontext.gregs[REG_RSP]);
 #elif defined(HOST_ARCH_ARM)
   sp = static_cast<uintptr_t>(mcontext.arm_sp);
 #elif defined(HOST_ARCH_ARM64)
@@ -63,6 +69,8 @@
 
 #if defined(HOST_ARCH_IA32)
   sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]);
+#elif defined(HOST_ARCH_X64)
+  sp = static_cast<uintptr_t>(mcontext.gregs[REG_RSP]);
 #elif defined(HOST_ARCH_ARM)
   sp = static_cast<uintptr_t>(mcontext.arm_sp);
 #elif defined(HOST_ARCH_ARM64)
@@ -79,6 +87,8 @@
 
 #if defined(HOST_ARCH_IA32)
   lr = 0;
+#elif defined(HOST_ARCH_X64)
+  lr = 0;
 #elif defined(HOST_ARCH_ARM)
   lr = static_cast<uintptr_t>(mcontext.arm_lr);
 #elif defined(HOST_ARCH_ARM64)
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 074fc8c..a828752 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -1888,6 +1888,28 @@
             (fs_val <= ft_val) || isnan(fs_val) || isnan(ft_val));
         break;
       }
+      case COP1_TRUNC_W: {
+        switch (instr->FormatField()) {
+          case FMT_D: {
+            double fs_dbl = get_fregister_double(instr->FsField());
+            int32_t fs_int;
+            if (isnan(fs_dbl) || isinf(fs_dbl) || (fs_dbl > kMaxInt32) ||
+                (fs_dbl < kMinInt32)) {
+              fs_int = kMaxInt32;
+            } else {
+              fs_int = static_cast<int32_t>(fs_dbl);
+            }
+            set_fregister(instr->FdField(), fs_int);
+            break;
+          }
+          default: {
+            OS::PrintErr("DecodeCop1: 0x%x\n", instr->InstructionBits());
+            UnimplementedInstruction(instr);
+            break;
+          }
+        }
+        break;
+      }
       case COP1_CVT_D: {
         switch (instr->FormatField()) {
           case FMT_W: {
@@ -1902,34 +1924,6 @@
             set_fregister_double(instr->FdField(), fs_dbl);
             break;
           }
-          case FMT_L: {
-            int64_t fs_int = get_fregister_long(instr->FsField());
-            double fs_dbl = static_cast<double>(fs_int);
-            set_fregister_double(instr->FdField(), fs_dbl);
-            break;
-          }
-          default: {
-            OS::PrintErr("DecodeCop1: 0x%x\n", instr->InstructionBits());
-            UnimplementedInstruction(instr);
-            break;
-          }
-        }
-        break;
-      }
-      case COP1_CVT_W: {
-        switch (instr->FormatField()) {
-          case FMT_D: {
-            double fs_dbl = get_fregister_double(instr->FsField());
-            int32_t fs_int;
-            if (isnan(fs_dbl) || isinf(fs_dbl) || (fs_dbl > INT_MAX) ||
-                (fs_dbl < INT_MIN)) {
-              fs_int = INT_MIN;
-            } else {
-              fs_int = static_cast<int32_t>(fs_dbl);
-            }
-            set_fregister(instr->FdField(), fs_int);
-            break;
-          }
           default: {
             OS::PrintErr("DecodeCop1: 0x%x\n", instr->InstructionBits());
             UnimplementedInstruction(instr);
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index fb3d8d8..4eb3da7 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -112,19 +112,15 @@
       // visit frame slots which are marked as having objects.
       //
       // The layout of the frame is (lower addresses to the right):
-      // | spill slots | outgoing arguments | saved registers |
-      // |XXXXXXXXXXXXX|--------------------|XXXXXXXXXXXXXXXXX|
+      // | spill slots | outgoing arguments | saved registers | slow-path args |
+      // |XXXXXXXXXXXXX|--------------------|XXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXX|
       //
       // The spill slots and any saved registers are described in the stack
       // map.  The outgoing arguments are assumed to be tagged; the number
       // of outgoing arguments is not explicitly tracked.
-      //
-      // TODO(kmillikin): This does not handle slow path calls with
-      // arguments, where the arguments are pushed after the live registers.
-      // Enable such calls.
       intptr_t length = map.Length();
       // Spill slots are at the 'bottom' of the frame.
-      intptr_t spill_slot_count = length - map.RegisterBitCount();
+      intptr_t spill_slot_count = length - map.SlowPathBitCount();
       for (intptr_t bit = 0; bit < spill_slot_count; ++bit) {
         if (map.IsObject(bit)) {
           visitor->VisitPointer(last);
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index e117703..1e0d8cf 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -98,7 +98,7 @@
     }
     shutdown_ = true;
     // Notify.
-    monitor_->Notify();
+    shutdown_ml.Notify();
     ASSERT(initialized_);
     if (FLAG_trace_thread_interrupter) {
       OS::Print("ThreadInterrupter shutting down.\n");
@@ -163,8 +163,8 @@
   }
   {
     intptr_t interrupted_thread_count = 0;
-    current_wait_time_ = interrupt_period_;
     MonitorLocker wait_ml(monitor_);
+    current_wait_time_ = interrupt_period_;
     while (!shutdown_) {
       intptr_t r = wait_ml.WaitMicros(current_wait_time_);
 
@@ -183,7 +183,7 @@
       interrupted_thread_count = 0;
 
       // Temporarily drop the monitor while we interrupt threads.
-      monitor_->Exit();
+      wait_ml.Exit();
 
       {
         OSThreadIterator it;
@@ -197,7 +197,7 @@
       }
 
       // Take the monitor lock again.
-      monitor_->Enter();
+      wait_ml.Enter();
 
       // Now that we have the lock, check if we were signaled to wake up while
       // interrupting threads.
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index be86154..2fa59ef 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -10,6 +10,7 @@
 #include "vm/lockers.h"
 #include "vm/log.h"
 #include "vm/object.h"
+#include "vm/service_event.h"
 #include "vm/thread.h"
 #include "vm/timeline.h"
 
@@ -1218,15 +1219,15 @@
 }
 
 
-TimelineEventStreamingRecorder::TimelineEventStreamingRecorder() {
+TimelineEventCallbackRecorder::TimelineEventCallbackRecorder() {
 }
 
 
-TimelineEventStreamingRecorder::~TimelineEventStreamingRecorder() {
+TimelineEventCallbackRecorder::~TimelineEventCallbackRecorder() {
 }
 
 
-void TimelineEventStreamingRecorder::PrintJSON(JSONStream* js,
+void TimelineEventCallbackRecorder::PrintJSON(JSONStream* js,
                                                TimelineEventFilter* filter) {
   if (!FLAG_support_service) {
     return;
@@ -1240,7 +1241,7 @@
 }
 
 
-void TimelineEventStreamingRecorder::PrintTraceEvent(
+void TimelineEventCallbackRecorder::PrintTraceEvent(
     JSONStream* js,
     TimelineEventFilter* filter) {
   if (!FLAG_support_service) {
@@ -1250,14 +1251,14 @@
 }
 
 
-TimelineEvent* TimelineEventStreamingRecorder::StartEvent() {
+TimelineEvent* TimelineEventCallbackRecorder::StartEvent() {
   TimelineEvent* event = new TimelineEvent();
   return event;
 }
 
 
-void TimelineEventStreamingRecorder::CompleteEvent(TimelineEvent* event) {
-  StreamEvent(event);
+void TimelineEventCallbackRecorder::CompleteEvent(TimelineEvent* event) {
+  OnEvent(event);
   delete event;
 }
 
@@ -1396,6 +1397,16 @@
 }
 
 
+void TimelineEventBlock::PrintJSON(JSONStream* js) const {
+  ASSERT(!in_use());
+  JSONArray events(js);
+  for (intptr_t i = 0; i < length(); i++) {
+    const TimelineEvent* event = At(i);
+    events.AddValue(event);
+  }
+}
+
+
 TimelineEvent* TimelineEventBlock::StartEvent() {
   ASSERT(!IsFull());
   if (FLAG_trace_timeline) {
@@ -1465,6 +1476,11 @@
     OS::Print("Finish block %p\n", this);
   }
   in_use_ = false;
+  if (Service::timeline_stream.enabled()) {
+    ServiceEvent service_event(NULL, ServiceEvent::kTimelineEvents);
+    service_event.set_timeline_event_block(this);
+    Service::HandleEvent(&service_event);
+  }
 }
 
 
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 6dfc8d2..002f8c9 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -526,6 +526,8 @@
   }
 
  protected:
+  void PrintJSON(JSONStream* stream) const;
+
   TimelineEvent* StartEvent();
 
   TimelineEvent events_[kBlockSize];
@@ -545,6 +547,7 @@
   friend class TimelineEventRingRecorder;
   friend class TimelineEventEndlessRecorder;
   friend class TimelineTestHelper;
+  friend class JSONStream;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TimelineEventBlock);
@@ -687,21 +690,22 @@
 };
 
 
-// An abstract recorder that calls |StreamEvent| whenever an event is complete.
-class TimelineEventStreamingRecorder : public TimelineEventRecorder {
+// An abstract recorder that calls |OnEvent| whenever an event is complete.
+// This should only be used for testing.
+class TimelineEventCallbackRecorder : public TimelineEventRecorder {
  public:
-  TimelineEventStreamingRecorder();
-  ~TimelineEventStreamingRecorder();
+  TimelineEventCallbackRecorder();
+  ~TimelineEventCallbackRecorder();
 
   void PrintJSON(JSONStream* js, TimelineEventFilter* filter);
   void PrintTraceEvent(JSONStream* js, TimelineEventFilter* filter);
 
-  // Called when |event| is ready to be streamed. It is unsafe to keep a
-  // reference to |event| as it may be freed as soon as this function returns.
-  virtual void StreamEvent(TimelineEvent* event) = 0;
+  // Called when |event| is completed. It is unsafe to keep a reference to
+  // |event| as it may be freed as soon as this function returns.
+  virtual void OnEvent(TimelineEvent* event) = 0;
 
   const char* name() const {
-    return "streaming";
+    return "callback";
   }
 
  protected:
diff --git a/runtime/vm/timeline_test.cc b/runtime/vm/timeline_test.cc
index 01d0c6a..db764ee 100644
--- a/runtime/vm/timeline_test.cc
+++ b/runtime/vm/timeline_test.cc
@@ -237,7 +237,7 @@
 
 
 // Count the number of each event type seen.
-class EventCounterRecorder : public TimelineEventStreamingRecorder {
+class EventCounterRecorder : public TimelineEventCallbackRecorder {
  public:
   EventCounterRecorder() {
     for (intptr_t i = 0; i < TimelineEvent::kNumEventTypes; i++) {
@@ -245,7 +245,7 @@
     }
   }
 
-  void StreamEvent(TimelineEvent* event) {
+  void OnEvent(TimelineEvent* event) {
     counts_[event->event_type()]++;
   }
 
@@ -258,7 +258,7 @@
 };
 
 
-TEST_CASE(TimelineEventStreamingRecorderBasic) {
+TEST_CASE(TimelineEventCallbackRecorderBasic) {
   EventCounterRecorder* recorder = new EventCounterRecorder();
   TimelineRecorderOverride override(recorder);
 
diff --git a/runtime/vm/verifier.cc b/runtime/vm/verifier.cc
index 18ad438..a9bbf01 100644
--- a/runtime/vm/verifier.cc
+++ b/runtime/vm/verifier.cc
@@ -17,9 +17,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, verify_on_transition, false, "Verify on dart <==> VM.");
-
-
 void VerifyObjectVisitor::VisitObject(RawObject* raw_obj) {
   if (raw_obj->IsHeapObject()) {
     uword raw_addr = RawObject::ToAddr(raw_obj);
diff --git a/runtime/vm/weak_code.cc b/runtime/vm/weak_code.cc
index eb04d1f..d68cfff 100644
--- a/runtime/vm/weak_code.cc
+++ b/runtime/vm/weak_code.cc
@@ -66,7 +66,7 @@
   if (code_objects.IsNull()) {
     return;
   }
-  ASSERT(!FLAG_precompiled_mode);
+  ASSERT(!FLAG_precompiled_runtime);
   UpdateArrayTo(Object::null_array());
   // Disable all code on stack.
   Code& code = Code::Handle();
diff --git a/samples/samples.status b/samples/samples.status
index d9739f4..ac35013 100644
--- a/samples/samples.status
+++ b/samples/samples.status
@@ -11,6 +11,10 @@
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
+[ $compiler == dart2js && $cps_ir && $checked ]
+sample_extension: Crash # Unable to compile UnsupportedError.message.
+
+
 [ $compiler == dart2analyzer ]
 build_dart: Skip
 
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 4f88a3d..37471b9 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -1,8 +1,10 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
+/* Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ *
+ * DO NOT EDIT
+ * Auto-generated _blink library.
+ */
 library dart.dom._blink;
 
 import 'dart:js' as js;
@@ -14,17 +16,22 @@
 
 dynamic resolver(String s) {
   if (s == "ANGLEInstancedArrays") return BlinkANGLEInstancedArrays.instance;
+  if (s == "AbstractWorker") return BlinkAbstractWorker.instance;
   if (s == "AnalyserNode") return BlinkAnalyserNode.instance;
   if (s == "Animation") return BlinkAnimation.instance;
-  if (s == "AnimationEffect") return BlinkAnimationEffect.instance;
-  if (s == "AnimationNode") return BlinkAnimationNode.instance;
-  if (s == "AnimationPlayer") return BlinkAnimationPlayer.instance;
+  if (s == "AnimationEffectReadOnly") return BlinkAnimationEffectReadOnly.instance;
+  if (s == "AnimationEffectTiming") return BlinkAnimationEffectTiming.instance;
+  if (s == "AnimationEvent") return BlinkAnimationEvent.instance;
   if (s == "AnimationPlayerEvent") return BlinkAnimationPlayerEvent.instance;
   if (s == "AnimationTimeline") return BlinkAnimationTimeline.instance;
+  if (s == "AppBannerPromptResult") return BlinkAppBannerPromptResult.instance;
   if (s == "ApplicationCache") return BlinkApplicationCache.instance;
   if (s == "ApplicationCacheErrorEvent") return BlinkApplicationCacheErrorEvent.instance;
+  if (s == "ArrayBuffer") return BlinkArrayBuffer.instance;
+  if (s == "ArrayBufferView") return BlinkArrayBufferView.instance;
   if (s == "Attr") return BlinkAttr.instance;
   if (s == "AudioBuffer") return BlinkAudioBuffer.instance;
+  if (s == "AudioBufferCallback") return BlinkAudioBufferCallback.instance;
   if (s == "AudioBufferSourceNode") return BlinkAudioBufferSourceNode.instance;
   if (s == "AudioContext") return BlinkAudioContext.instance;
   if (s == "AudioDestinationNode") return BlinkAudioDestinationNode.instance;
@@ -38,52 +45,66 @@
   if (s == "AutocompleteErrorEvent") return BlinkAutocompleteErrorEvent.instance;
   if (s == "BarProp") return BlinkBarProp.instance;
   if (s == "BatteryManager") return BlinkBatteryManager.instance;
+  if (s == "BeforeInstallPromptEvent") return BlinkBeforeInstallPromptEvent.instance;
   if (s == "BeforeUnloadEvent") return BlinkBeforeUnloadEvent.instance;
   if (s == "BiquadFilterNode") return BlinkBiquadFilterNode.instance;
   if (s == "Blob") return BlinkBlob.instance;
+  if (s == "Bluetooth") return BlinkBluetooth.instance;
+  if (s == "BluetoothDevice") return BlinkBluetoothDevice.instance;
+  if (s == "BluetoothGATTCharacteristic") return BlinkBluetoothGATTCharacteristic.instance;
+  if (s == "BluetoothGATTRemoteServer") return BlinkBluetoothGATTRemoteServer.instance;
+  if (s == "BluetoothGATTService") return BlinkBluetoothGATTService.instance;
+  if (s == "BluetoothUUID") return BlinkBluetoothUUID.instance;
   if (s == "Body") return BlinkBody.instance;
   if (s == "CDATASection") return BlinkCDATASection.instance;
+  if (s == "CHROMIUMSubscribeUniform") return BlinkCHROMIUMSubscribeUniform.instance;
+  if (s == "CHROMIUMValuebuffer") return BlinkCHROMIUMValuebuffer.instance;
   if (s == "CSS") return BlinkCSS.instance;
   if (s == "CSSCharsetRule") return BlinkCSSCharsetRule.instance;
   if (s == "CSSFontFaceRule") return BlinkCSSFontFaceRule.instance;
+  if (s == "CSSGroupingRule") return BlinkCSSGroupingRule.instance;
   if (s == "CSSImportRule") return BlinkCSSImportRule.instance;
   if (s == "CSSKeyframeRule") return BlinkCSSKeyframeRule.instance;
   if (s == "CSSKeyframesRule") return BlinkCSSKeyframesRule.instance;
   if (s == "CSSMediaRule") return BlinkCSSMediaRule.instance;
   if (s == "CSSPageRule") return BlinkCSSPageRule.instance;
-  if (s == "CSSPrimitiveValue") return BlinkCSSPrimitiveValue.instance;
   if (s == "CSSRule") return BlinkCSSRule.instance;
   if (s == "CSSRuleList") return BlinkCSSRuleList.instance;
   if (s == "CSSStyleDeclaration") return BlinkCSSStyleDeclaration.instance;
   if (s == "CSSStyleRule") return BlinkCSSStyleRule.instance;
   if (s == "CSSStyleSheet") return BlinkCSSStyleSheet.instance;
   if (s == "CSSSupportsRule") return BlinkCSSSupportsRule.instance;
-  if (s == "CSSUnknownRule") return BlinkCSSUnknownRule.instance;
-  if (s == "CSSValue") return BlinkCSSValue.instance;
-  if (s == "CSSValueList") return BlinkCSSValueList.instance;
   if (s == "CSSViewportRule") return BlinkCSSViewportRule.instance;
   if (s == "Cache") return BlinkCache.instance;
   if (s == "CacheStorage") return BlinkCacheStorage.instance;
-  if (s == "Canvas2DContextAttributes") return BlinkCanvas2DContextAttributes.instance;
   if (s == "CanvasGradient") return BlinkCanvasGradient.instance;
+  if (s == "CanvasPathMethods") return BlinkCanvasPathMethods.instance;
   if (s == "CanvasPattern") return BlinkCanvasPattern.instance;
   if (s == "CanvasRenderingContext2D") return BlinkCanvasRenderingContext2D.instance;
   if (s == "ChannelMergerNode") return BlinkChannelMergerNode.instance;
   if (s == "ChannelSplitterNode") return BlinkChannelSplitterNode.instance;
   if (s == "CharacterData") return BlinkCharacterData.instance;
+  if (s == "ChildNode") return BlinkChildNode.instance;
   if (s == "CircularGeofencingRegion") return BlinkCircularGeofencingRegion.instance;
+  if (s == "Client") return BlinkClient.instance;
   if (s == "ClientRect") return BlinkClientRect.instance;
   if (s == "ClientRectList") return BlinkClientRectList.instance;
+  if (s == "Clients") return BlinkClients.instance;
+  if (s == "ClipboardEvent") return BlinkClipboardEvent.instance;
   if (s == "CloseEvent") return BlinkCloseEvent.instance;
   if (s == "Comment") return BlinkComment.instance;
   if (s == "CompositionEvent") return BlinkCompositionEvent.instance;
+  if (s == "CompositorProxy") return BlinkCompositorProxy.instance;
+  if (s == "CompositorWorker") return BlinkCompositorWorker.instance;
+  if (s == "CompositorWorkerGlobalScope") return BlinkCompositorWorkerGlobalScope.instance;
   if (s == "Console") return BlinkConsole.instance;
   if (s == "ConsoleBase") return BlinkConsoleBase.instance;
   if (s == "ConvolverNode") return BlinkConvolverNode.instance;
   if (s == "Coordinates") return BlinkCoordinates.instance;
-  if (s == "Counter") return BlinkCounter.instance;
   if (s == "Credential") return BlinkCredential.instance;
   if (s == "CredentialsContainer") return BlinkCredentialsContainer.instance;
+  if (s == "CrossOriginConnectEvent") return BlinkCrossOriginConnectEvent.instance;
+  if (s == "CrossOriginServiceWorkerClient") return BlinkCrossOriginServiceWorkerClient.instance;
   if (s == "Crypto") return BlinkCrypto.instance;
   if (s == "CryptoKey") return BlinkCryptoKey.instance;
   if (s == "CustomEvent") return BlinkCustomEvent.instance;
@@ -106,8 +127,11 @@
   if (s == "DataTransfer") return BlinkDataTransfer.instance;
   if (s == "DataTransferItem") return BlinkDataTransferItem.instance;
   if (s == "DataTransferItemList") return BlinkDataTransferItemList.instance;
+  if (s == "DataView") return BlinkDataView.instance;
   if (s == "Database") return BlinkDatabase.instance;
+  if (s == "DatabaseCallback") return BlinkDatabaseCallback.instance;
   if (s == "DedicatedWorkerGlobalScope") return BlinkDedicatedWorkerGlobalScope.instance;
+  if (s == "DefaultSessionStartEvent") return BlinkDefaultSessionStartEvent.instance;
   if (s == "DelayNode") return BlinkDelayNode.instance;
   if (s == "DeprecatedStorageInfo") return BlinkDeprecatedStorageInfo.instance;
   if (s == "DeprecatedStorageQuota") return BlinkDeprecatedStorageQuota.instance;
@@ -128,39 +152,55 @@
   if (s == "EXTFragDepth") return BlinkEXTFragDepth.instance;
   if (s == "EXTShaderTextureLOD") return BlinkEXTShaderTextureLOD.instance;
   if (s == "EXTTextureFilterAnisotropic") return BlinkEXTTextureFilterAnisotropic.instance;
+  if (s == "EXTsRGB") return BlinkEXTsRGB.instance;
+  if (s == "EffectModel") return BlinkEffectModel.instance;
   if (s == "Element") return BlinkElement.instance;
+  if (s == "EntriesCallback") return BlinkEntriesCallback.instance;
   if (s == "Entry") return BlinkEntry.instance;
+  if (s == "EntryCallback") return BlinkEntryCallback.instance;
   if (s == "EntrySync") return BlinkEntrySync.instance;
+  if (s == "ErrorCallback") return BlinkErrorCallback.instance;
   if (s == "ErrorEvent") return BlinkErrorEvent.instance;
   if (s == "Event") return BlinkEvent.instance;
+  if (s == "EventListener") return BlinkEventListener.instance;
   if (s == "EventSource") return BlinkEventSource.instance;
   if (s == "EventTarget") return BlinkEventTarget.instance;
   if (s == "ExtendableEvent") return BlinkExtendableEvent.instance;
   if (s == "FederatedCredential") return BlinkFederatedCredential.instance;
   if (s == "FetchEvent") return BlinkFetchEvent.instance;
   if (s == "File") return BlinkFile.instance;
+  if (s == "FileCallback") return BlinkFileCallback.instance;
   if (s == "FileEntry") return BlinkFileEntry.instance;
   if (s == "FileEntrySync") return BlinkFileEntrySync.instance;
   if (s == "FileError") return BlinkFileError.instance;
   if (s == "FileList") return BlinkFileList.instance;
   if (s == "FileReader") return BlinkFileReader.instance;
   if (s == "FileReaderSync") return BlinkFileReaderSync.instance;
+  if (s == "FileSystemCallback") return BlinkFileSystemCallback.instance;
   if (s == "FileWriter") return BlinkFileWriter.instance;
+  if (s == "FileWriterCallback") return BlinkFileWriterCallback.instance;
   if (s == "FileWriterSync") return BlinkFileWriterSync.instance;
+  if (s == "Float32Array") return BlinkFloat32Array.instance;
+  if (s == "Float64Array") return BlinkFloat64Array.instance;
   if (s == "FocusEvent") return BlinkFocusEvent.instance;
   if (s == "FontFace") return BlinkFontFace.instance;
   if (s == "FontFaceSet") return BlinkFontFaceSet.instance;
+  if (s == "FontFaceSetForEachCallback") return BlinkFontFaceSetForEachCallback.instance;
   if (s == "FontFaceSetLoadEvent") return BlinkFontFaceSetLoadEvent.instance;
   if (s == "FormData") return BlinkFormData.instance;
+  if (s == "FrameRequestCallback") return BlinkFrameRequestCallback.instance;
   if (s == "GainNode") return BlinkGainNode.instance;
   if (s == "Gamepad") return BlinkGamepad.instance;
   if (s == "GamepadButton") return BlinkGamepadButton.instance;
   if (s == "GamepadEvent") return BlinkGamepadEvent.instance;
   if (s == "GamepadList") return BlinkGamepadList.instance;
   if (s == "Geofencing") return BlinkGeofencing.instance;
+  if (s == "GeofencingEvent") return BlinkGeofencingEvent.instance;
   if (s == "GeofencingRegion") return BlinkGeofencingRegion.instance;
   if (s == "Geolocation") return BlinkGeolocation.instance;
   if (s == "Geoposition") return BlinkGeoposition.instance;
+  if (s == "GlobalEventHandlers") return BlinkGlobalEventHandlers.instance;
+  if (s == "HMDVRDevice") return BlinkHMDVRDevice.instance;
   if (s == "HTMLAllCollection") return BlinkHTMLAllCollection.instance;
   if (s == "HTMLAnchorElement") return BlinkHTMLAnchorElement.instance;
   if (s == "HTMLAppletElement") return BlinkHTMLAppletElement.instance;
@@ -256,14 +296,13 @@
   if (s == "ImageBitmap") return BlinkImageBitmap.instance;
   if (s == "ImageData") return BlinkImageData.instance;
   if (s == "InjectedScriptHost") return BlinkInjectedScriptHost.instance;
-  if (s == "InputMethodContext") return BlinkInputMethodContext.instance;
-  if (s == "InspectorFrontendHost") return BlinkInspectorFrontendHost.instance;
-  if (s == "InspectorOverlayHost") return BlinkInspectorOverlayHost.instance;
-  if (s == "InstallEvent") return BlinkInstallEvent.instance;
+  if (s == "InputDevice") return BlinkInputDevice.instance;
+  if (s == "Int16Array") return BlinkInt16Array.instance;
+  if (s == "Int32Array") return BlinkInt32Array.instance;
+  if (s == "Int8Array") return BlinkInt8Array.instance;
   if (s == "Iterator") return BlinkIterator.instance;
-  if (s == "JavaScriptCallFrame") return BlinkJavaScriptCallFrame.instance;
   if (s == "KeyboardEvent") return BlinkKeyboardEvent.instance;
-  if (s == "LocalCredential") return BlinkLocalCredential.instance;
+  if (s == "KeyframeEffect") return BlinkKeyframeEffect.instance;
   if (s == "Location") return BlinkLocation.instance;
   if (s == "MIDIAccess") return BlinkMIDIAccess.instance;
   if (s == "MIDIConnectionEvent") return BlinkMIDIConnectionEvent.instance;
@@ -275,17 +314,21 @@
   if (s == "MIDIPort") return BlinkMIDIPort.instance;
   if (s == "MediaController") return BlinkMediaController.instance;
   if (s == "MediaDeviceInfo") return BlinkMediaDeviceInfo.instance;
+  if (s == "MediaDevices") return BlinkMediaDevices.instance;
   if (s == "MediaElementAudioSourceNode") return BlinkMediaElementAudioSourceNode.instance;
+  if (s == "MediaEncryptedEvent") return BlinkMediaEncryptedEvent.instance;
   if (s == "MediaError") return BlinkMediaError.instance;
   if (s == "MediaKeyError") return BlinkMediaKeyError.instance;
   if (s == "MediaKeyEvent") return BlinkMediaKeyEvent.instance;
   if (s == "MediaKeyMessageEvent") return BlinkMediaKeyMessageEvent.instance;
-  if (s == "MediaKeyNeededEvent") return BlinkMediaKeyNeededEvent.instance;
   if (s == "MediaKeySession") return BlinkMediaKeySession.instance;
+  if (s == "MediaKeyStatusMap") return BlinkMediaKeyStatusMap.instance;
+  if (s == "MediaKeySystemAccess") return BlinkMediaKeySystemAccess.instance;
   if (s == "MediaKeys") return BlinkMediaKeys.instance;
   if (s == "MediaList") return BlinkMediaList.instance;
   if (s == "MediaQueryList") return BlinkMediaQueryList.instance;
   if (s == "MediaQueryListEvent") return BlinkMediaQueryListEvent.instance;
+  if (s == "MediaSession") return BlinkMediaSession.instance;
   if (s == "MediaSource") return BlinkMediaSource.instance;
   if (s == "MediaStream") return BlinkMediaStream.instance;
   if (s == "MediaStreamAudioDestinationNode") return BlinkMediaStreamAudioDestinationNode.instance;
@@ -293,26 +336,40 @@
   if (s == "MediaStreamEvent") return BlinkMediaStreamEvent.instance;
   if (s == "MediaStreamTrack") return BlinkMediaStreamTrack.instance;
   if (s == "MediaStreamTrackEvent") return BlinkMediaStreamTrackEvent.instance;
+  if (s == "MediaStreamTrackSourcesCallback") return BlinkMediaStreamTrackSourcesCallback.instance;
   if (s == "MemoryInfo") return BlinkMemoryInfo.instance;
   if (s == "MessageChannel") return BlinkMessageChannel.instance;
   if (s == "MessageEvent") return BlinkMessageEvent.instance;
   if (s == "MessagePort") return BlinkMessagePort.instance;
   if (s == "Metadata") return BlinkMetadata.instance;
+  if (s == "MetadataCallback") return BlinkMetadataCallback.instance;
   if (s == "MimeType") return BlinkMimeType.instance;
   if (s == "MimeTypeArray") return BlinkMimeTypeArray.instance;
   if (s == "MouseEvent") return BlinkMouseEvent.instance;
+  if (s == "MutationCallback") return BlinkMutationCallback.instance;
   if (s == "MutationEvent") return BlinkMutationEvent.instance;
   if (s == "MutationObserver") return BlinkMutationObserver.instance;
   if (s == "MutationRecord") return BlinkMutationRecord.instance;
   if (s == "NamedNodeMap") return BlinkNamedNodeMap.instance;
   if (s == "Navigator") return BlinkNavigator.instance;
+  if (s == "NavigatorCPU") return BlinkNavigatorCPU.instance;
+  if (s == "NavigatorID") return BlinkNavigatorID.instance;
+  if (s == "NavigatorLanguage") return BlinkNavigatorLanguage.instance;
+  if (s == "NavigatorOnLine") return BlinkNavigatorOnLine.instance;
+  if (s == "NavigatorStorageUtils") return BlinkNavigatorStorageUtils.instance;
   if (s == "NavigatorUserMediaError") return BlinkNavigatorUserMediaError.instance;
+  if (s == "NavigatorUserMediaErrorCallback") return BlinkNavigatorUserMediaErrorCallback.instance;
+  if (s == "NavigatorUserMediaSuccessCallback") return BlinkNavigatorUserMediaSuccessCallback.instance;
   if (s == "NetworkInformation") return BlinkNetworkInformation.instance;
   if (s == "Node") return BlinkNode.instance;
   if (s == "NodeFilter") return BlinkNodeFilter.instance;
   if (s == "NodeIterator") return BlinkNodeIterator.instance;
   if (s == "NodeList") return BlinkNodeList.instance;
+  if (s == "NonDocumentTypeChildNode") return BlinkNonDocumentTypeChildNode.instance;
+  if (s == "NonElementParentNode") return BlinkNonElementParentNode.instance;
   if (s == "Notification") return BlinkNotification.instance;
+  if (s == "NotificationEvent") return BlinkNotificationEvent.instance;
+  if (s == "NotificationPermissionCallback") return BlinkNotificationPermissionCallback.instance;
   if (s == "OESElementIndexUint") return BlinkOESElementIndexUint.instance;
   if (s == "OESStandardDerivatives") return BlinkOESStandardDerivatives.instance;
   if (s == "OESTextureFloat") return BlinkOESTextureFloat.instance;
@@ -323,57 +380,79 @@
   if (s == "OfflineAudioCompletionEvent") return BlinkOfflineAudioCompletionEvent.instance;
   if (s == "OfflineAudioContext") return BlinkOfflineAudioContext.instance;
   if (s == "OscillatorNode") return BlinkOscillatorNode.instance;
-  if (s == "OverflowEvent") return BlinkOverflowEvent.instance;
   if (s == "PagePopupController") return BlinkPagePopupController.instance;
   if (s == "PageTransitionEvent") return BlinkPageTransitionEvent.instance;
   if (s == "PannerNode") return BlinkPannerNode.instance;
+  if (s == "ParentNode") return BlinkParentNode.instance;
+  if (s == "PasswordCredential") return BlinkPasswordCredential.instance;
   if (s == "Path2D") return BlinkPath2D.instance;
   if (s == "Performance") return BlinkPerformance.instance;
+  if (s == "PerformanceCompositeTiming") return BlinkPerformanceCompositeTiming.instance;
   if (s == "PerformanceEntry") return BlinkPerformanceEntry.instance;
   if (s == "PerformanceMark") return BlinkPerformanceMark.instance;
   if (s == "PerformanceMeasure") return BlinkPerformanceMeasure.instance;
   if (s == "PerformanceNavigation") return BlinkPerformanceNavigation.instance;
+  if (s == "PerformanceRenderTiming") return BlinkPerformanceRenderTiming.instance;
   if (s == "PerformanceResourceTiming") return BlinkPerformanceResourceTiming.instance;
   if (s == "PerformanceTiming") return BlinkPerformanceTiming.instance;
+  if (s == "PeriodicSyncEvent") return BlinkPeriodicSyncEvent.instance;
+  if (s == "PeriodicSyncManager") return BlinkPeriodicSyncManager.instance;
+  if (s == "PeriodicSyncRegistration") return BlinkPeriodicSyncRegistration.instance;
   if (s == "PeriodicWave") return BlinkPeriodicWave.instance;
+  if (s == "PermissionStatus") return BlinkPermissionStatus.instance;
+  if (s == "Permissions") return BlinkPermissions.instance;
   if (s == "Plugin") return BlinkPlugin.instance;
   if (s == "PluginArray") return BlinkPluginArray.instance;
   if (s == "PluginPlaceholderElement") return BlinkPluginPlaceholderElement.instance;
+  if (s == "PointerEvent") return BlinkPointerEvent.instance;
   if (s == "PopStateEvent") return BlinkPopStateEvent.instance;
+  if (s == "PositionCallback") return BlinkPositionCallback.instance;
   if (s == "PositionError") return BlinkPositionError.instance;
+  if (s == "PositionErrorCallback") return BlinkPositionErrorCallback.instance;
+  if (s == "PositionSensorVRDevice") return BlinkPositionSensorVRDevice.instance;
   if (s == "Presentation") return BlinkPresentation.instance;
+  if (s == "PresentationAvailability") return BlinkPresentationAvailability.instance;
+  if (s == "PresentationSession") return BlinkPresentationSession.instance;
   if (s == "ProcessingInstruction") return BlinkProcessingInstruction.instance;
   if (s == "ProgressEvent") return BlinkProgressEvent.instance;
+  if (s == "PromiseRejectionEvent") return BlinkPromiseRejectionEvent.instance;
   if (s == "PushEvent") return BlinkPushEvent.instance;
   if (s == "PushManager") return BlinkPushManager.instance;
-  if (s == "PushRegistration") return BlinkPushRegistration.instance;
-  if (s == "RGBColor") return BlinkRGBColor.instance;
+  if (s == "PushMessageData") return BlinkPushMessageData.instance;
+  if (s == "PushSubscription") return BlinkPushSubscription.instance;
   if (s == "RTCDTMFSender") return BlinkRTCDTMFSender.instance;
   if (s == "RTCDTMFToneChangeEvent") return BlinkRTCDTMFToneChangeEvent.instance;
   if (s == "RTCDataChannel") return BlinkRTCDataChannel.instance;
   if (s == "RTCDataChannelEvent") return BlinkRTCDataChannelEvent.instance;
+  if (s == "RTCErrorCallback") return BlinkRTCErrorCallback.instance;
   if (s == "RTCIceCandidate") return BlinkRTCIceCandidate.instance;
   if (s == "RTCIceCandidateEvent") return BlinkRTCIceCandidateEvent.instance;
   if (s == "RTCPeerConnection") return BlinkRTCPeerConnection.instance;
   if (s == "RTCSessionDescription") return BlinkRTCSessionDescription.instance;
+  if (s == "RTCSessionDescriptionCallback") return BlinkRTCSessionDescriptionCallback.instance;
+  if (s == "RTCStatsCallback") return BlinkRTCStatsCallback.instance;
   if (s == "RTCStatsReport") return BlinkRTCStatsReport.instance;
   if (s == "RTCStatsResponse") return BlinkRTCStatsResponse.instance;
   if (s == "RadioNodeList") return BlinkRadioNodeList.instance;
   if (s == "Range") return BlinkRange.instance;
+  if (s == "ReadableByteStream") return BlinkReadableByteStream.instance;
+  if (s == "ReadableByteStreamReader") return BlinkReadableByteStreamReader.instance;
   if (s == "ReadableStream") return BlinkReadableStream.instance;
-  if (s == "Rect") return BlinkRect.instance;
+  if (s == "ReadableStreamReader") return BlinkReadableStreamReader.instance;
   if (s == "RelatedEvent") return BlinkRelatedEvent.instance;
   if (s == "Request") return BlinkRequest.instance;
+  if (s == "RequestAnimationFrameCallback") return BlinkRequestAnimationFrameCallback.instance;
   if (s == "ResourceProgressEvent") return BlinkResourceProgressEvent.instance;
   if (s == "Response") return BlinkResponse.instance;
   if (s == "SQLError") return BlinkSQLError.instance;
   if (s == "SQLResultSet") return BlinkSQLResultSet.instance;
   if (s == "SQLResultSetRowList") return BlinkSQLResultSetRowList.instance;
+  if (s == "SQLStatementCallback") return BlinkSQLStatementCallback.instance;
+  if (s == "SQLStatementErrorCallback") return BlinkSQLStatementErrorCallback.instance;
   if (s == "SQLTransaction") return BlinkSQLTransaction.instance;
+  if (s == "SQLTransactionCallback") return BlinkSQLTransactionCallback.instance;
+  if (s == "SQLTransactionErrorCallback") return BlinkSQLTransactionErrorCallback.instance;
   if (s == "SVGAElement") return BlinkSVGAElement.instance;
-  if (s == "SVGAltGlyphDefElement") return BlinkSVGAltGlyphDefElement.instance;
-  if (s == "SVGAltGlyphElement") return BlinkSVGAltGlyphElement.instance;
-  if (s == "SVGAltGlyphItemElement") return BlinkSVGAltGlyphItemElement.instance;
   if (s == "SVGAngle") return BlinkSVGAngle.instance;
   if (s == "SVGAnimateElement") return BlinkSVGAnimateElement.instance;
   if (s == "SVGAnimateMotionElement") return BlinkSVGAnimateMotionElement.instance;
@@ -426,20 +505,13 @@
   if (s == "SVGFETileElement") return BlinkSVGFETileElement.instance;
   if (s == "SVGFETurbulenceElement") return BlinkSVGFETurbulenceElement.instance;
   if (s == "SVGFilterElement") return BlinkSVGFilterElement.instance;
-  if (s == "SVGFontElement") return BlinkSVGFontElement.instance;
-  if (s == "SVGFontFaceElement") return BlinkSVGFontFaceElement.instance;
-  if (s == "SVGFontFaceFormatElement") return BlinkSVGFontFaceFormatElement.instance;
-  if (s == "SVGFontFaceNameElement") return BlinkSVGFontFaceNameElement.instance;
-  if (s == "SVGFontFaceSrcElement") return BlinkSVGFontFaceSrcElement.instance;
-  if (s == "SVGFontFaceUriElement") return BlinkSVGFontFaceUriElement.instance;
+  if (s == "SVGFilterPrimitiveStandardAttributes") return BlinkSVGFilterPrimitiveStandardAttributes.instance;
+  if (s == "SVGFitToViewBox") return BlinkSVGFitToViewBox.instance;
   if (s == "SVGForeignObjectElement") return BlinkSVGForeignObjectElement.instance;
   if (s == "SVGGElement") return BlinkSVGGElement.instance;
   if (s == "SVGGeometryElement") return BlinkSVGGeometryElement.instance;
-  if (s == "SVGGlyphElement") return BlinkSVGGlyphElement.instance;
-  if (s == "SVGGlyphRefElement") return BlinkSVGGlyphRefElement.instance;
   if (s == "SVGGradientElement") return BlinkSVGGradientElement.instance;
   if (s == "SVGGraphicsElement") return BlinkSVGGraphicsElement.instance;
-  if (s == "SVGHKernElement") return BlinkSVGHKernElement.instance;
   if (s == "SVGImageElement") return BlinkSVGImageElement.instance;
   if (s == "SVGLength") return BlinkSVGLength.instance;
   if (s == "SVGLengthList") return BlinkSVGLengthList.instance;
@@ -450,7 +522,6 @@
   if (s == "SVGMaskElement") return BlinkSVGMaskElement.instance;
   if (s == "SVGMatrix") return BlinkSVGMatrix.instance;
   if (s == "SVGMetadataElement") return BlinkSVGMetadataElement.instance;
-  if (s == "SVGMissingGlyphElement") return BlinkSVGMissingGlyphElement.instance;
   if (s == "SVGNumber") return BlinkSVGNumber.instance;
   if (s == "SVGNumberList") return BlinkSVGNumberList.instance;
   if (s == "SVGPathElement") return BlinkSVGPathElement.instance;
@@ -484,7 +555,6 @@
   if (s == "SVGRadialGradientElement") return BlinkSVGRadialGradientElement.instance;
   if (s == "SVGRect") return BlinkSVGRect.instance;
   if (s == "SVGRectElement") return BlinkSVGRectElement.instance;
-  if (s == "SVGRenderingIntent") return BlinkSVGRenderingIntent.instance;
   if (s == "SVGSVGElement") return BlinkSVGSVGElement.instance;
   if (s == "SVGScriptElement") return BlinkSVGScriptElement.instance;
   if (s == "SVGSetElement") return BlinkSVGSetElement.instance;
@@ -494,6 +564,7 @@
   if (s == "SVGSwitchElement") return BlinkSVGSwitchElement.instance;
   if (s == "SVGSymbolElement") return BlinkSVGSymbolElement.instance;
   if (s == "SVGTSpanElement") return BlinkSVGTSpanElement.instance;
+  if (s == "SVGTests") return BlinkSVGTests.instance;
   if (s == "SVGTextContentElement") return BlinkSVGTextContentElement.instance;
   if (s == "SVGTextElement") return BlinkSVGTextElement.instance;
   if (s == "SVGTextPathElement") return BlinkSVGTextPathElement.instance;
@@ -501,24 +572,29 @@
   if (s == "SVGTitleElement") return BlinkSVGTitleElement.instance;
   if (s == "SVGTransform") return BlinkSVGTransform.instance;
   if (s == "SVGTransformList") return BlinkSVGTransformList.instance;
+  if (s == "SVGURIReference") return BlinkSVGURIReference.instance;
   if (s == "SVGUnitTypes") return BlinkSVGUnitTypes.instance;
   if (s == "SVGUseElement") return BlinkSVGUseElement.instance;
-  if (s == "SVGVKernElement") return BlinkSVGVKernElement.instance;
   if (s == "SVGViewElement") return BlinkSVGViewElement.instance;
   if (s == "SVGViewSpec") return BlinkSVGViewSpec.instance;
+  if (s == "SVGZoomAndPan") return BlinkSVGZoomAndPan.instance;
   if (s == "SVGZoomEvent") return BlinkSVGZoomEvent.instance;
   if (s == "Screen") return BlinkScreen.instance;
   if (s == "ScreenOrientation") return BlinkScreenOrientation.instance;
   if (s == "ScriptProcessorNode") return BlinkScriptProcessorNode.instance;
+  if (s == "ScrollState") return BlinkScrollState.instance;
   if (s == "SecurityPolicyViolationEvent") return BlinkSecurityPolicyViolationEvent.instance;
   if (s == "Selection") return BlinkSelection.instance;
+  if (s == "ServicePort") return BlinkServicePort.instance;
+  if (s == "ServicePortCollection") return BlinkServicePortCollection.instance;
+  if (s == "ServicePortConnectEvent") return BlinkServicePortConnectEvent.instance;
   if (s == "ServiceWorker") return BlinkServiceWorker.instance;
-  if (s == "ServiceWorkerClient") return BlinkServiceWorkerClient.instance;
-  if (s == "ServiceWorkerClients") return BlinkServiceWorkerClients.instance;
   if (s == "ServiceWorkerContainer") return BlinkServiceWorkerContainer.instance;
   if (s == "ServiceWorkerGlobalScope") return BlinkServiceWorkerGlobalScope.instance;
+  if (s == "ServiceWorkerMessageEvent") return BlinkServiceWorkerMessageEvent.instance;
   if (s == "ServiceWorkerRegistration") return BlinkServiceWorkerRegistration.instance;
   if (s == "ShadowRoot") return BlinkShadowRoot.instance;
+  if (s == "SharedArrayBuffer") return BlinkSharedArrayBuffer.instance;
   if (s == "SharedWorker") return BlinkSharedWorker.instance;
   if (s == "SharedWorkerGlobalScope") return BlinkSharedWorkerGlobalScope.instance;
   if (s == "SourceBuffer") return BlinkSourceBuffer.instance;
@@ -536,18 +612,26 @@
   if (s == "SpeechSynthesisEvent") return BlinkSpeechSynthesisEvent.instance;
   if (s == "SpeechSynthesisUtterance") return BlinkSpeechSynthesisUtterance.instance;
   if (s == "SpeechSynthesisVoice") return BlinkSpeechSynthesisVoice.instance;
+  if (s == "StashedMessagePort") return BlinkStashedMessagePort.instance;
+  if (s == "StashedPortCollection") return BlinkStashedPortCollection.instance;
+  if (s == "StereoPannerNode") return BlinkStereoPannerNode.instance;
   if (s == "Storage") return BlinkStorage.instance;
+  if (s == "StorageErrorCallback") return BlinkStorageErrorCallback.instance;
   if (s == "StorageEvent") return BlinkStorageEvent.instance;
   if (s == "StorageInfo") return BlinkStorageInfo.instance;
   if (s == "StorageQuota") return BlinkStorageQuota.instance;
+  if (s == "StorageQuotaCallback") return BlinkStorageQuotaCallback.instance;
+  if (s == "StorageUsageCallback") return BlinkStorageUsageCallback.instance;
   if (s == "Stream") return BlinkStream.instance;
+  if (s == "StringCallback") return BlinkStringCallback.instance;
   if (s == "StyleMedia") return BlinkStyleMedia.instance;
   if (s == "StyleSheet") return BlinkStyleSheet.instance;
   if (s == "StyleSheetList") return BlinkStyleSheetList.instance;
   if (s == "SubtleCrypto") return BlinkSubtleCrypto.instance;
+  if (s == "SyncEvent") return BlinkSyncEvent.instance;
+  if (s == "SyncManager") return BlinkSyncManager.instance;
+  if (s == "SyncRegistration") return BlinkSyncRegistration.instance;
   if (s == "Text") return BlinkText.instance;
-  if (s == "TextDecoder") return BlinkTextDecoder.instance;
-  if (s == "TextEncoder") return BlinkTextEncoder.instance;
   if (s == "TextEvent") return BlinkTextEvent.instance;
   if (s == "TextMetrics") return BlinkTextMetrics.instance;
   if (s == "TextTrack") return BlinkTextTrack.instance;
@@ -555,15 +639,27 @@
   if (s == "TextTrackCueList") return BlinkTextTrackCueList.instance;
   if (s == "TextTrackList") return BlinkTextTrackList.instance;
   if (s == "TimeRanges") return BlinkTimeRanges.instance;
-  if (s == "Timing") return BlinkTiming.instance;
+  if (s == "TimeoutHandler") return BlinkTimeoutHandler.instance;
   if (s == "Touch") return BlinkTouch.instance;
   if (s == "TouchEvent") return BlinkTouchEvent.instance;
   if (s == "TouchList") return BlinkTouchList.instance;
+  if (s == "TrackDefault") return BlinkTrackDefault.instance;
+  if (s == "TrackDefaultList") return BlinkTrackDefaultList.instance;
   if (s == "TrackEvent") return BlinkTrackEvent.instance;
   if (s == "TransitionEvent") return BlinkTransitionEvent.instance;
   if (s == "TreeWalker") return BlinkTreeWalker.instance;
   if (s == "UIEvent") return BlinkUIEvent.instance;
   if (s == "URL") return BlinkURL.instance;
+  if (s == "URLUtils") return BlinkURLUtils.instance;
+  if (s == "URLUtilsReadOnly") return BlinkURLUtilsReadOnly.instance;
+  if (s == "Uint16Array") return BlinkUint16Array.instance;
+  if (s == "Uint32Array") return BlinkUint32Array.instance;
+  if (s == "Uint8Array") return BlinkUint8Array.instance;
+  if (s == "Uint8ClampedArray") return BlinkUint8ClampedArray.instance;
+  if (s == "VRDevice") return BlinkVRDevice.instance;
+  if (s == "VREyeParameters") return BlinkVREyeParameters.instance;
+  if (s == "VRFieldOfView") return BlinkVRFieldOfView.instance;
+  if (s == "VRPositionState") return BlinkVRPositionState.instance;
   if (s == "VTTCue") return BlinkVTTCue.instance;
   if (s == "VTTRegion") return BlinkVTTRegion.instance;
   if (s == "VTTRegionList") return BlinkVTTRegionList.instance;
@@ -571,14 +667,16 @@
   if (s == "VideoPlaybackQuality") return BlinkVideoPlaybackQuality.instance;
   if (s == "VideoTrack") return BlinkVideoTrack.instance;
   if (s == "VideoTrackList") return BlinkVideoTrackList.instance;
+  if (s == "VoidCallback") return BlinkVoidCallback.instance;
   if (s == "WaveShaperNode") return BlinkWaveShaperNode.instance;
+  if (s == "WebGL2RenderingContext") return BlinkWebGL2RenderingContext.instance;
+  if (s == "WebGL2RenderingContextBase") return BlinkWebGL2RenderingContextBase.instance;
   if (s == "WebGLActiveInfo") return BlinkWebGLActiveInfo.instance;
   if (s == "WebGLBuffer") return BlinkWebGLBuffer.instance;
   if (s == "WebGLCompressedTextureATC") return BlinkWebGLCompressedTextureATC.instance;
   if (s == "WebGLCompressedTextureETC1") return BlinkWebGLCompressedTextureETC1.instance;
   if (s == "WebGLCompressedTexturePVRTC") return BlinkWebGLCompressedTexturePVRTC.instance;
   if (s == "WebGLCompressedTextureS3TC") return BlinkWebGLCompressedTextureS3TC.instance;
-  if (s == "WebGLContextAttributes") return BlinkWebGLContextAttributes.instance;
   if (s == "WebGLContextEvent") return BlinkWebGLContextEvent.instance;
   if (s == "WebGLDebugRendererInfo") return BlinkWebGLDebugRendererInfo.instance;
   if (s == "WebGLDebugShaders") return BlinkWebGLDebugShaders.instance;
@@ -587,23 +685,27 @@
   if (s == "WebGLFramebuffer") return BlinkWebGLFramebuffer.instance;
   if (s == "WebGLLoseContext") return BlinkWebGLLoseContext.instance;
   if (s == "WebGLProgram") return BlinkWebGLProgram.instance;
+  if (s == "WebGLQuery") return BlinkWebGLQuery.instance;
   if (s == "WebGLRenderbuffer") return BlinkWebGLRenderbuffer.instance;
   if (s == "WebGLRenderingContext") return BlinkWebGLRenderingContext.instance;
+  if (s == "WebGLRenderingContextBase") return BlinkWebGLRenderingContextBase.instance;
+  if (s == "WebGLSampler") return BlinkWebGLSampler.instance;
   if (s == "WebGLShader") return BlinkWebGLShader.instance;
   if (s == "WebGLShaderPrecisionFormat") return BlinkWebGLShaderPrecisionFormat.instance;
+  if (s == "WebGLSync") return BlinkWebGLSync.instance;
   if (s == "WebGLTexture") return BlinkWebGLTexture.instance;
+  if (s == "WebGLTransformFeedback") return BlinkWebGLTransformFeedback.instance;
   if (s == "WebGLUniformLocation") return BlinkWebGLUniformLocation.instance;
+  if (s == "WebGLVertexArrayObject") return BlinkWebGLVertexArrayObject.instance;
   if (s == "WebGLVertexArrayObjectOES") return BlinkWebGLVertexArrayObjectOES.instance;
-  if (s == "WebKitAnimationEvent") return BlinkWebKitAnimationEvent.instance;
-  if (s == "WebKitCSSFilterRule") return BlinkWebKitCSSFilterRule.instance;
-  if (s == "WebKitCSSFilterValue") return BlinkWebKitCSSFilterValue.instance;
   if (s == "WebKitCSSMatrix") return BlinkWebKitCSSMatrix.instance;
-  if (s == "WebKitCSSTransformValue") return BlinkWebKitCSSTransformValue.instance;
-  if (s == "WebKitGamepad") return BlinkWebKitGamepad.instance;
-  if (s == "WebKitGamepadList") return BlinkWebKitGamepadList.instance;
   if (s == "WebSocket") return BlinkWebSocket.instance;
   if (s == "WheelEvent") return BlinkWheelEvent.instance;
   if (s == "Window") return BlinkWindow.instance;
+  if (s == "WindowBase64") return BlinkWindowBase64.instance;
+  if (s == "WindowClient") return BlinkWindowClient.instance;
+  if (s == "WindowEventHandlers") return BlinkWindowEventHandlers.instance;
+  if (s == "WindowTimers") return BlinkWindowTimers.instance;
   if (s == "Worker") return BlinkWorker.instance;
   if (s == "WorkerConsole") return BlinkWorkerConsole.instance;
   if (s == "WorkerGlobalScope") return BlinkWorkerGlobalScope.instance;
@@ -621,6 +723,7 @@
   if (s == "XPathNSResolver") return BlinkXPathNSResolver.instance;
   if (s == "XPathResult") return BlinkXPathResult.instance;
   if (s == "XSLTProcessor") return BlinkXSLTProcessor.instance;
+
   // Failed to find it, check for custom renames
   dynamic obj = resolverMap[s];
   if (obj != null) return obj;
@@ -650,6 +753,15 @@
 
 }
 
+class BlinkAbstractWorker {
+  static final instance = new BlinkAbstractWorker();
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+}
+
 class BlinkAnalyserNode extends BlinkAudioNode {
   static final instance = new BlinkAnalyserNode();
 
@@ -659,6 +771,18 @@
 
   frequencyBinCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frequencyBinCount");
 
+  maxDecibels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxDecibels");
+
+  maxDecibels_Setter_(mthis, __arg_0) => mthis["maxDecibels"] = __arg_0;
+
+  minDecibels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minDecibels");
+
+  minDecibels_Setter_(mthis, __arg_0) => mthis["minDecibels"] = __arg_0;
+
+  smoothingTimeConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "smoothingTimeConstant");
+
+  smoothingTimeConstant_Setter_(mthis, __arg_0) => mthis["smoothingTimeConstant"] = __arg_0;
+
   getByteFrequencyData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getByteFrequencyData", []);
 
   getByteFrequencyData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getByteFrequencyData", [__arg_0]);
@@ -675,99 +799,129 @@
 
   getFloatTimeDomainData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFloatTimeDomainData", [__arg_0]);
 
-  maxDecibels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxDecibels");
-
-  maxDecibels_Setter_(mthis, __arg_0) => mthis["maxDecibels"] = __arg_0;
-
-  minDecibels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minDecibels");
-
-  minDecibels_Setter_(mthis, __arg_0) => mthis["minDecibels"] = __arg_0;
-
-  smoothingTimeConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "smoothingTimeConstant");
-
-  smoothingTimeConstant_Setter_(mthis, __arg_0) => mthis["smoothingTimeConstant"] = __arg_0;
-
 }
 
-class BlinkAnimation extends BlinkAnimationNode {
+class BlinkAnimation extends BlinkEventTarget {
   static final instance = new BlinkAnimation();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Animation"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Animation"), [__arg_0]);
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Animation"), [__arg_0, __arg_1]);
-
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Animation"), [__arg_0, __arg_1, __arg_2]);
-
-}
-
-class BlinkAnimationEffect {
-  static final instance = new BlinkAnimationEffect();
-
-}
-
-class BlinkAnimationNode {
-  static final instance = new BlinkAnimationNode();
-
-  activeDuration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeDuration");
-
-  currentIteration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentIteration");
-
-  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
-
-  endTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endTime");
-
-  localTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localTime");
-
-  player_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "player");
-
-  startTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startTime");
-
-  timing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timing");
-
-}
-
-class BlinkAnimationPlayer extends BlinkEventTarget {
-  static final instance = new BlinkAnimationPlayer();
-
-  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
-
   currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
 
   currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
 
-  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+  effect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "effect");
+
+  effect_Setter_(mthis, __arg_0) => mthis["effect"] = __arg_0;
+
+  endClip_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endClip");
+
+  endClip_Setter_(mthis, __arg_0) => mthis["endClip"] = __arg_0;
+
+  finished_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "finished");
 
   onfinish_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfinish");
 
   onfinish_Setter_(mthis, __arg_0) => mthis["onfinish"] = __arg_0;
 
-  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
-
   playState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playState");
 
-  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
-
   playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
 
   playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
 
-  reverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reverse", []);
+  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ready");
 
-  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
+  startClip_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startClip");
 
-  source_Setter_(mthis, __arg_0) => mthis["source"] = __arg_0;
+  startClip_Setter_(mthis, __arg_0) => mthis["startClip"] = __arg_0;
 
   startTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startTime");
 
   startTime_Setter_(mthis, __arg_0) => mthis["startTime"] = __arg_0;
 
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+
+  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
+
+  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
+
+  reverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reverse", []);
+
+}
+
+class BlinkAnimationEffectReadOnly {
+  static final instance = new BlinkAnimationEffectReadOnly();
+
+  computedTiming_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "computedTiming");
+
+  timing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timing");
+
+}
+
+class BlinkAnimationEffectTiming {
+  static final instance = new BlinkAnimationEffectTiming();
+
+  delay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "delay");
+
+  delay_Setter_(mthis, __arg_0) => mthis["delay"] = __arg_0;
+
+  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
+
+  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
+
+  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
+
+  duration_Setter_(mthis, __arg_0) => mthis["duration"] = __arg_0;
+
+  easing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "easing");
+
+  easing_Setter_(mthis, __arg_0) => mthis["easing"] = __arg_0;
+
+  endDelay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endDelay");
+
+  endDelay_Setter_(mthis, __arg_0) => mthis["endDelay"] = __arg_0;
+
+  fill_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fill");
+
+  fill_Setter_(mthis, __arg_0) => mthis["fill"] = __arg_0;
+
+  iterationStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iterationStart");
+
+  iterationStart_Setter_(mthis, __arg_0) => mthis["iterationStart"] = __arg_0;
+
+  iterations_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iterations");
+
+  iterations_Setter_(mthis, __arg_0) => mthis["iterations"] = __arg_0;
+
+  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
+
+  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
+
+}
+
+class BlinkAnimationEvent extends BlinkEvent {
+  static final instance = new BlinkAnimationEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationEvent"), [__arg_0, __arg_1]);
+
+  animationName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animationName");
+
+  elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elapsedTime");
+
 }
 
 class BlinkAnimationPlayerEvent extends BlinkEvent {
   static final instance = new BlinkAnimationPlayerEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationPlayerEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationPlayerEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationPlayerEvent"), [__arg_0, __arg_1]);
 
   currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
@@ -781,7 +935,13 @@
 
   currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
 
-  getAnimationPlayers_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAnimationPlayers", []);
+  currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
+
+  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
+
+  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
+
+  getAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAnimations", []);
 
   play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
 
@@ -789,11 +949,18 @@
 
 }
 
+class BlinkAppBannerPromptResult {
+  static final instance = new BlinkAppBannerPromptResult();
+
+  outcome_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outcome");
+
+  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
+
+}
+
 class BlinkApplicationCache extends BlinkEventTarget {
   static final instance = new BlinkApplicationCache();
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
-
   oncached_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncached");
 
   oncached_Setter_(mthis, __arg_0) => mthis["oncached"] = __arg_0;
@@ -828,6 +995,8 @@
 
   status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
 
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+
   swapCache_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "swapCache", []);
 
   update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "update", []);
@@ -837,6 +1006,10 @@
 class BlinkApplicationCacheErrorEvent extends BlinkEvent {
   static final instance = new BlinkApplicationCacheErrorEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ApplicationCacheErrorEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ApplicationCacheErrorEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ApplicationCacheErrorEvent"), [__arg_0, __arg_1]);
 
   message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
@@ -849,6 +1022,24 @@
 
 }
 
+class BlinkArrayBuffer {
+  static final instance = new BlinkArrayBuffer();
+
+  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteLength");
+
+}
+
+class BlinkArrayBufferView {
+  static final instance = new BlinkArrayBufferView();
+
+  buffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffer");
+
+  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteLength");
+
+  byteOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteOffset");
+
+}
+
 class BlinkAttr extends BlinkNode {
   static final instance = new BlinkAttr();
 
@@ -883,16 +1074,41 @@
 
   duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
 
-  getChannelData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getChannelData", []);
-
-  getChannelData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getChannelData", [__arg_0]);
-
   length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   numberOfChannels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfChannels");
 
   sampleRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sampleRate");
 
+  copyFromChannel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyFromChannel", []);
+
+  copyFromChannel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyFromChannel", [__arg_0]);
+
+  copyFromChannel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyFromChannel", [__arg_0, __arg_1]);
+
+  copyFromChannel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyFromChannel", [__arg_0, __arg_1, __arg_2]);
+
+  copyToChannel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyToChannel", []);
+
+  copyToChannel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyToChannel", [__arg_0]);
+
+  copyToChannel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyToChannel", [__arg_0, __arg_1]);
+
+  copyToChannel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyToChannel", [__arg_0, __arg_1, __arg_2]);
+
+  getChannelData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getChannelData", []);
+
+  getChannelData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getChannelData", [__arg_0]);
+
+}
+
+class BlinkAudioBufferCallback {
+  static final instance = new BlinkAudioBufferCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
 }
 
 class BlinkAudioBufferSourceNode extends BlinkAudioSourceNode {
@@ -902,6 +1118,12 @@
 
   buffer_Setter_(mthis, __arg_0) => mthis["buffer"] = __arg_0;
 
+  detune_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "detune");
+
+  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loop");
+
+  loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
+
   loopEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loopEnd");
 
   loopEnd_Setter_(mthis, __arg_0) => mthis["loopEnd"] = __arg_0;
@@ -910,10 +1132,6 @@
 
   loopStart_Setter_(mthis, __arg_0) => mthis["loopStart"] = __arg_0;
 
-  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loop");
-
-  loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
-
   onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
 
   onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
@@ -939,18 +1157,34 @@
 
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AudioContext"), []);
 
+  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
+
+  destination_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "destination");
+
+  listener_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "listener");
+
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
+
+  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
+
+  sampleRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sampleRate");
+
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
   createAnalyser_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createAnalyser", []);
 
   createBiquadFilter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBiquadFilter", []);
 
-  createBufferSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBufferSource", []);
-
   createBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", [__arg_0]);
 
   createBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", [__arg_0, __arg_1]);
 
   createBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", [__arg_0, __arg_1, __arg_2]);
 
+  createBufferSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBufferSource", []);
+
   createChannelMerger_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createChannelMerger", []);
 
   createChannelMerger_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createChannelMerger", [__arg_0]);
@@ -997,9 +1231,9 @@
 
   createScriptProcessor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createScriptProcessor", [__arg_0, __arg_1, __arg_2]);
 
-  createWaveShaper_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWaveShaper", []);
+  createStereoPanner_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createStereoPanner", []);
 
-  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
+  createWaveShaper_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWaveShaper", []);
 
   decodeAudioData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "decodeAudioData", []);
 
@@ -1009,17 +1243,9 @@
 
   decodeAudioData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "decodeAudioData", [__arg_0, __arg_1, __arg_2]);
 
-  destination_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "destination");
+  resume_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resume", []);
 
-  listener_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "listener");
-
-  oncomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncomplete");
-
-  oncomplete_Setter_(mthis, __arg_0) => mthis["oncomplete"] = __arg_0;
-
-  sampleRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sampleRate");
-
-  startRendering_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "startRendering", []);
+  suspend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "suspend", []);
 
 }
 
@@ -1037,6 +1263,10 @@
 
   dopplerFactor_Setter_(mthis, __arg_0) => mthis["dopplerFactor"] = __arg_0;
 
+  speedOfSound_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speedOfSound");
+
+  speedOfSound_Setter_(mthis, __arg_0) => mthis["speedOfSound"] = __arg_0;
+
   setOrientation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setOrientation", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
   setOrientation_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "setOrientation", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
@@ -1055,27 +1285,29 @@
 
   setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setVelocity", [__arg_0, __arg_1, __arg_2]);
 
-  speedOfSound_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speedOfSound");
-
-  speedOfSound_Setter_(mthis, __arg_0) => mthis["speedOfSound"] = __arg_0;
-
 }
 
 class BlinkAudioNode extends BlinkEventTarget {
   static final instance = new BlinkAudioNode();
 
-  channelCountMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "channelCountMode");
-
-  channelCountMode_Setter_(mthis, __arg_0) => mthis["channelCountMode"] = __arg_0;
-
   channelCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "channelCount");
 
   channelCount_Setter_(mthis, __arg_0) => mthis["channelCount"] = __arg_0;
 
+  channelCountMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "channelCountMode");
+
+  channelCountMode_Setter_(mthis, __arg_0) => mthis["channelCountMode"] = __arg_0;
+
   channelInterpretation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "channelInterpretation");
 
   channelInterpretation_Setter_(mthis, __arg_0) => mthis["channelInterpretation"] = __arg_0;
 
+  context_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "context");
+
+  numberOfInputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfInputs");
+
+  numberOfOutputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfOutputs");
+
   connect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "connect", []);
 
   connect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0]);
@@ -1084,27 +1316,29 @@
 
   connect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0, __arg_1, __arg_2]);
 
-  context_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "context");
-
   disconnect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", []);
 
   disconnect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", [__arg_0]);
 
-  numberOfInputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfInputs");
+  disconnect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", [__arg_0, __arg_1]);
 
-  numberOfOutputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfOutputs");
+  disconnect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkAudioParam {
   static final instance = new BlinkAudioParam();
 
+  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultValue");
+
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+
   cancelScheduledValues_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancelScheduledValues", []);
 
   cancelScheduledValues_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancelScheduledValues", [__arg_0]);
 
-  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultValue");
-
   exponentialRampToValueAtTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "exponentialRampToValueAtTime", []);
 
   exponentialRampToValueAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "exponentialRampToValueAtTime", [__arg_0]);
@@ -1135,10 +1369,6 @@
 
   setValueCurveAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setValueCurveAtTime", [__arg_0, __arg_1, __arg_2]);
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
-
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
-
 }
 
 class BlinkAudioProcessingEvent extends BlinkEvent {
@@ -1177,12 +1407,6 @@
 class BlinkAudioTrackList extends BlinkEventTarget {
   static final instance = new BlinkAudioTrackList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
-
-  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
-
   length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
@@ -1197,11 +1421,21 @@
 
   onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
 
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+
+  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
+
+  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
+
 }
 
 class BlinkAutocompleteErrorEvent extends BlinkEvent {
   static final instance = new BlinkAutocompleteErrorEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AutocompleteErrorEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AutocompleteErrorEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AutocompleteErrorEvent"), [__arg_0, __arg_1]);
 
   reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reason");
@@ -1218,10 +1452,10 @@
 class BlinkBatteryManager extends BlinkEventTarget {
   static final instance = new BlinkBatteryManager();
 
-  chargingTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chargingTime");
-
   charging_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charging");
 
+  chargingTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chargingTime");
+
   dischargingTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dischargingTime");
 
   level_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "level");
@@ -1244,6 +1478,23 @@
 
 }
 
+class BlinkBeforeInstallPromptEvent extends BlinkEvent {
+  static final instance = new BlinkBeforeInstallPromptEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "BeforeInstallPromptEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "BeforeInstallPromptEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "BeforeInstallPromptEvent"), [__arg_0, __arg_1]);
+
+  platforms_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platforms");
+
+  userChoice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userChoice");
+
+  prompt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prompt", []);
+
+}
+
 class BlinkBeforeUnloadEvent extends BlinkEvent {
   static final instance = new BlinkBeforeUnloadEvent();
 
@@ -1264,31 +1515,35 @@
 
   gain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gain");
 
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+
   getFrequencyResponse_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFrequencyResponse", [__arg_0]);
 
   getFrequencyResponse_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFrequencyResponse", [__arg_0, __arg_1]);
 
   getFrequencyResponse_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFrequencyResponse", [__arg_0, __arg_1, __arg_2]);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
-
 }
 
 class BlinkBlob {
   static final instance = new BlinkBlob();
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Blob"), []);
 
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Blob"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Blob"), [__arg_0, __arg_1]);
 
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Blob"), [__arg_0, __arg_1, __arg_2]);
+
   size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
 
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
   slice_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "slice", []);
 
   slice_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "slice", [__arg_0]);
@@ -1297,19 +1552,107 @@
 
   slice_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "slice", [__arg_0, __arg_1, __arg_2]);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+}
+
+class BlinkBluetooth {
+  static final instance = new BlinkBluetooth();
+
+  requestDevice_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestDevice", []);
+
+  requestDevice_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestDevice", [__arg_0]);
+
+}
+
+class BlinkBluetoothDevice {
+  static final instance = new BlinkBluetoothDevice();
+
+  deviceClass_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deviceClass");
+
+  instanceID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "instanceID");
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  paired_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "paired");
+
+  productID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "productID");
+
+  productVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "productVersion");
+
+  vendorID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendorID");
+
+  vendorIDSource_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendorIDSource");
+
+  connectGATT_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "connectGATT", []);
+
+}
+
+class BlinkBluetoothGATTCharacteristic {
+  static final instance = new BlinkBluetoothGATTCharacteristic();
+
+  uuid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "uuid");
+
+  readValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readValue", []);
+
+  writeValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "writeValue", []);
+
+  writeValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "writeValue", [__arg_0]);
+
+}
+
+class BlinkBluetoothGATTRemoteServer {
+  static final instance = new BlinkBluetoothGATTRemoteServer();
+
+  connected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connected");
+
+  getPrimaryService_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getPrimaryService", []);
+
+  getPrimaryService_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getPrimaryService", [__arg_0]);
+
+}
+
+class BlinkBluetoothGATTService {
+  static final instance = new BlinkBluetoothGATTService();
+
+  isPrimary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isPrimary");
+
+  uuid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "uuid");
+
+  getCharacteristic_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCharacteristic", []);
+
+  getCharacteristic_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getCharacteristic", [__arg_0]);
+
+}
+
+class BlinkBluetoothUUID {
+  static final instance = new BlinkBluetoothUUID();
+
+  canonicalUUID_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "canonicalUUID", []);
+
+  canonicalUUID_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "canonicalUUID", [__arg_0]);
+
+  getCharacteristic_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getCharacteristic", []);
+
+  getCharacteristic_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getCharacteristic", [__arg_0]);
+
+  getDescriptor_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getDescriptor", []);
+
+  getDescriptor_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getDescriptor", [__arg_0]);
+
+  getService_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getService", []);
+
+  getService_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getService", [__arg_0]);
 
 }
 
 class BlinkBody {
   static final instance = new BlinkBody();
 
+  bodyUsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bodyUsed");
+
   arrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "arrayBuffer", []);
 
   blob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blob", []);
 
-  bodyUsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bodyUsed");
-
   json_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "json", []);
 
   text_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "text", []);
@@ -1321,14 +1664,56 @@
 
 }
 
+class BlinkCHROMIUMSubscribeUniform {
+  static final instance = new BlinkCHROMIUMSubscribeUniform();
+
+  bindValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindValuebufferCHROMIUM", []);
+
+  bindValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindValuebufferCHROMIUM", [__arg_0]);
+
+  bindValuebufferCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindValuebufferCHROMIUM", [__arg_0, __arg_1]);
+
+  createValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createValuebufferCHROMIUM", []);
+
+  deleteValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteValuebufferCHROMIUM", []);
+
+  deleteValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteValuebufferCHROMIUM", [__arg_0]);
+
+  isValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isValuebufferCHROMIUM", []);
+
+  isValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isValuebufferCHROMIUM", [__arg_0]);
+
+  populateSubscribedValuesCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "populateSubscribedValuesCHROMIUM", []);
+
+  populateSubscribedValuesCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "populateSubscribedValuesCHROMIUM", [__arg_0]);
+
+  subscribeValueCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "subscribeValueCHROMIUM", []);
+
+  subscribeValueCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "subscribeValueCHROMIUM", [__arg_0]);
+
+  subscribeValueCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "subscribeValueCHROMIUM", [__arg_0, __arg_1]);
+
+  uniformValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformValuebufferCHROMIUM", [__arg_0]);
+
+  uniformValuebufferCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformValuebufferCHROMIUM", [__arg_0, __arg_1]);
+
+  uniformValuebufferCHROMIUM_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformValuebufferCHROMIUM", [__arg_0, __arg_1, __arg_2]);
+
+}
+
+class BlinkCHROMIUMValuebuffer {
+  static final instance = new BlinkCHROMIUMValuebuffer();
+
+}
+
 class BlinkCSS {
   static final instance = new BlinkCSS();
 
-  supports_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "supports", []);
+  supports_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS"), "supports", []);
 
-  supports_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "supports", [__arg_0]);
+  supports_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS"), "supports", [__arg_0]);
 
-  supports_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "supports", [__arg_0, __arg_1]);
+  supports_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS"), "supports", [__arg_0, __arg_1]);
 
 }
 
@@ -1348,6 +1733,23 @@
 
 }
 
+class BlinkCSSGroupingRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSGroupingRule();
+
+  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
+
+  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", []);
+
+  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", [__arg_0]);
+
+  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", []);
+
+  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0]);
+
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0, __arg_1]);
+
+}
+
 class BlinkCSSImportRule extends BlinkCSSRule {
   static final instance = new BlinkCSSImportRule();
 
@@ -1373,9 +1775,17 @@
 class BlinkCSSKeyframesRule extends BlinkCSSRule {
   static final instance = new BlinkCSSKeyframesRule();
 
+  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+
   $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
 
-  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
+  appendRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendRule", []);
+
+  appendRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendRule", [__arg_0]);
 
   deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", []);
 
@@ -1385,31 +1795,11 @@
 
   findRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "findRule", [__arg_0]);
 
-  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", []);
-
-  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0]);
-
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
-
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
-
 }
 
-class BlinkCSSMediaRule extends BlinkCSSRule {
+class BlinkCSSMediaRule extends BlinkCSSGroupingRule {
   static final instance = new BlinkCSSMediaRule();
 
-  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
-
-  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", []);
-
-  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", [__arg_0]);
-
-  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", []);
-
-  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0]);
-
-  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0, __arg_1]);
-
   media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
 
 }
@@ -1425,37 +1815,6 @@
 
 }
 
-class BlinkCSSPrimitiveValue extends BlinkCSSValue {
-  static final instance = new BlinkCSSPrimitiveValue();
-
-  getCounterValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCounterValue", []);
-
-  getFloatValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFloatValue", []);
-
-  getFloatValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFloatValue", [__arg_0]);
-
-  getRGBColorValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRGBColorValue", []);
-
-  getRectValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRectValue", []);
-
-  getStringValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStringValue", []);
-
-  primitiveType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "primitiveType");
-
-  setFloatValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setFloatValue", []);
-
-  setFloatValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setFloatValue", [__arg_0]);
-
-  setFloatValue_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setFloatValue", [__arg_0, __arg_1]);
-
-  setStringValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStringValue", []);
-
-  setStringValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStringValue", [__arg_0]);
-
-  setStringValue_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setStringValue", [__arg_0, __arg_1]);
-
-}
-
 class BlinkCSSRule {
   static final instance = new BlinkCSSRule();
 
@@ -1474,29 +1833,31 @@
 class BlinkCSSRuleList {
   static final instance = new BlinkCSSRuleList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkCSSStyleDeclaration {
   static final instance = new BlinkCSSStyleDeclaration();
 
+  cssText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssText");
+
+  cssText_Setter_(mthis, __arg_0) => mthis["cssText"] = __arg_0;
+
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  parentRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parentRule");
+
   $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
 
   $__propertyQuery___Callback_1_(mthis, __arg_0) => mthis[__arg_0];
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
-  cssText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssText");
-
-  cssText_Setter_(mthis, __arg_0) => mthis["cssText"] = __arg_0;
-
   getPropertyPriority_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getPropertyPriority", []);
 
   getPropertyPriority_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getPropertyPriority", [__arg_0]);
@@ -1509,16 +1870,10 @@
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  parentRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parentRule");
-
   removeProperty_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeProperty", []);
 
   removeProperty_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeProperty", [__arg_0]);
 
-  setProperty_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setProperty", []);
-
   setProperty_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setProperty", [__arg_0]);
 
   setProperty_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setProperty", [__arg_0, __arg_1]);
@@ -1541,6 +1896,12 @@
 class BlinkCSSStyleSheet extends BlinkStyleSheet {
   static final instance = new BlinkCSSStyleSheet();
 
+  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
+
+  ownerRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerRule");
+
+  rules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rules");
+
   addRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addRule", []);
 
   addRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addRule", [__arg_0]);
@@ -1549,8 +1910,6 @@
 
   addRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addRule", [__arg_0, __arg_1, __arg_2]);
 
-  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
-
   deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", []);
 
   deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", [__arg_0]);
@@ -1561,14 +1920,10 @@
 
   insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0, __arg_1]);
 
-  ownerRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerRule");
-
   removeRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeRule", []);
 
   removeRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeRule", [__arg_0]);
 
-  rules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rules");
-
 }
 
 class BlinkCSSSupportsRule extends BlinkCSSRule {
@@ -1590,35 +1945,6 @@
 
 }
 
-class BlinkCSSUnknownRule extends BlinkCSSRule {
-  static final instance = new BlinkCSSUnknownRule();
-
-}
-
-class BlinkCSSValue {
-  static final instance = new BlinkCSSValue();
-
-  cssText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssText");
-
-  cssText_Setter_(mthis, __arg_0) => mthis["cssText"] = __arg_0;
-
-  cssValueType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssValueType");
-
-}
-
-class BlinkCSSValueList extends BlinkCSSValue {
-  static final instance = new BlinkCSSValueList();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-}
-
 class BlinkCSSViewportRule extends BlinkCSSRule {
   static final instance = new BlinkCSSViewportRule();
 
@@ -1629,14 +1955,14 @@
 class BlinkCache {
   static final instance = new BlinkCache();
 
-  addAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addAll", []);
-
-  addAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addAll", [__arg_0]);
-
   add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
 
   add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
 
+  addAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addAll", []);
+
+  addAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addAll", [__arg_0]);
+
   delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
 
   delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
@@ -1649,12 +1975,6 @@
 
   keys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "keys", [__arg_0, __arg_1]);
 
-  matchAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", []);
-
-  matchAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", [__arg_0]);
-
-  matchAll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", [__arg_0, __arg_1]);
-
   match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "match", []);
 
   match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0]);
@@ -1672,36 +1992,25 @@
 class BlinkCacheStorage {
   static final instance = new BlinkCacheStorage();
 
-  create_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "create", []);
-
-  create_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "create", [__arg_0]);
-
   delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
 
   delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
 
-  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
-
-  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
-
   has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
 
   has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
 
   keys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "keys", []);
 
-}
+  match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "match", []);
 
-class BlinkCanvas2DContextAttributes {
-  static final instance = new BlinkCanvas2DContextAttributes();
+  match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0]);
 
-  alpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alpha");
+  match_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0, __arg_1]);
 
-  alpha_Setter_(mthis, __arg_0) => mthis["alpha"] = __arg_0;
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
 
-  storage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "storage");
-
-  storage_Setter_(mthis, __arg_0) => mthis["storage"] = __arg_0;
+  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0]);
 
 }
 
@@ -1716,6 +2025,61 @@
 
 }
 
+class BlinkCanvasPathMethods {
+  static final instance = new BlinkCanvasPathMethods();
+
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2]);
+
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closePath", []);
+
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", []);
+
+  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0]);
+
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0, __arg_1]);
+
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1]);
+
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
+
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1]);
+
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2]);
+
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+}
+
 class BlinkCanvasPattern {
   static final instance = new BlinkCanvasPattern();
 
@@ -1728,34 +2092,98 @@
 class BlinkCanvasRenderingContext2D {
   static final instance = new BlinkCanvasRenderingContext2D();
 
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+
+  currentTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTransform");
+
+  currentTransform_Setter_(mthis, __arg_0) => mthis["currentTransform"] = __arg_0;
+
+  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
+
+  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
+
+  fillStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fillStyle");
+
+  fillStyle_Setter_(mthis, __arg_0) => mthis["fillStyle"] = __arg_0;
+
+  filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filter");
+
+  filter_Setter_(mthis, __arg_0) => mthis["filter"] = __arg_0;
+
+  font_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "font");
+
+  font_Setter_(mthis, __arg_0) => mthis["font"] = __arg_0;
+
+  globalAlpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "globalAlpha");
+
+  globalAlpha_Setter_(mthis, __arg_0) => mthis["globalAlpha"] = __arg_0;
+
+  globalCompositeOperation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "globalCompositeOperation");
+
+  globalCompositeOperation_Setter_(mthis, __arg_0) => mthis["globalCompositeOperation"] = __arg_0;
+
+  imageSmoothingEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "imageSmoothingEnabled");
+
+  imageSmoothingEnabled_Setter_(mthis, __arg_0) => mthis["imageSmoothingEnabled"] = __arg_0;
+
+  lineCap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineCap");
+
+  lineCap_Setter_(mthis, __arg_0) => mthis["lineCap"] = __arg_0;
+
+  lineDashOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineDashOffset");
+
+  lineDashOffset_Setter_(mthis, __arg_0) => mthis["lineDashOffset"] = __arg_0;
+
+  lineJoin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineJoin");
+
+  lineJoin_Setter_(mthis, __arg_0) => mthis["lineJoin"] = __arg_0;
+
+  lineWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineWidth");
+
+  lineWidth_Setter_(mthis, __arg_0) => mthis["lineWidth"] = __arg_0;
+
+  miterLimit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "miterLimit");
+
+  miterLimit_Setter_(mthis, __arg_0) => mthis["miterLimit"] = __arg_0;
+
+  shadowBlur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowBlur");
+
+  shadowBlur_Setter_(mthis, __arg_0) => mthis["shadowBlur"] = __arg_0;
+
+  shadowColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowColor");
+
+  shadowColor_Setter_(mthis, __arg_0) => mthis["shadowColor"] = __arg_0;
+
+  shadowOffsetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowOffsetX");
+
+  shadowOffsetX_Setter_(mthis, __arg_0) => mthis["shadowOffsetX"] = __arg_0;
+
+  shadowOffsetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowOffsetY");
+
+  shadowOffsetY_Setter_(mthis, __arg_0) => mthis["shadowOffsetY"] = __arg_0;
+
+  strokeStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "strokeStyle");
+
+  strokeStyle_Setter_(mthis, __arg_0) => mthis["strokeStyle"] = __arg_0;
+
+  textAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textAlign");
+
+  textAlign_Setter_(mthis, __arg_0) => mthis["textAlign"] = __arg_0;
+
+  textBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textBaseline");
+
+  textBaseline_Setter_(mthis, __arg_0) => mthis["textBaseline"] = __arg_0;
+
+  webkitImageSmoothingEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitImageSmoothingEnabled");
+
+  webkitImageSmoothingEnabled_Setter_(mthis, __arg_0) => mthis["webkitImageSmoothingEnabled"] = __arg_0;
+
   addHitRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addHitRegion", []);
 
   addHitRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addHitRegion", [__arg_0]);
 
-  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2]);
-
-  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  arc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2]);
-
-  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
   beginPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginPath", []);
 
-  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
-  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
-
   clearHitRegions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearHitRegions", []);
 
   clearRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearRect", [__arg_0, __arg_1]);
@@ -1770,8 +2198,6 @@
 
   clip_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clip", [__arg_0, __arg_1]);
 
-  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closePath", []);
-
   createImageData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createImageData", []);
 
   createImageData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createImageData", [__arg_0]);
@@ -1796,14 +2222,6 @@
 
   createRadialGradient_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  currentTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTransform");
-
-  currentTransform_Setter_(mthis, __arg_0) => mthis["currentTransform"] = __arg_0;
-
-  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
-
-  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
-
   drawFocusIfNeeded_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawFocusIfNeeded", []);
 
   drawFocusIfNeeded_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawFocusIfNeeded", [__arg_0]);
@@ -1820,19 +2238,19 @@
 
   drawImage_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
+  drawImage_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
   drawImage_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
   drawImage_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
   drawImage_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  ellipse_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  fill_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fill", []);
 
-  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  fill_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fill", [__arg_0]);
 
-  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
-
-  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  fill_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fill", [__arg_0, __arg_1]);
 
   fillRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fillRect", [__arg_0, __arg_1]);
 
@@ -1840,10 +2258,6 @@
 
   fillRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "fillRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  fillStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fillStyle");
-
-  fillStyle_Setter_(mthis, __arg_0) => mthis["fillStyle"] = __arg_0;
-
   fillText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fillText", [__arg_0]);
 
   fillText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fillText", [__arg_0, __arg_1]);
@@ -1852,16 +2266,6 @@
 
   fillText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "fillText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  fill_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fill", []);
-
-  fill_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fill", [__arg_0]);
-
-  fill_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fill", [__arg_0, __arg_1]);
-
-  font_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "font");
-
-  font_Setter_(mthis, __arg_0) => mthis["font"] = __arg_0;
-
   getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
 
   getImageData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getImageData", [__arg_0, __arg_1]);
@@ -1872,18 +2276,6 @@
 
   getLineDash_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getLineDash", []);
 
-  globalAlpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "globalAlpha");
-
-  globalAlpha_Setter_(mthis, __arg_0) => mthis["globalAlpha"] = __arg_0;
-
-  globalCompositeOperation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "globalCompositeOperation");
-
-  globalCompositeOperation_Setter_(mthis, __arg_0) => mthis["globalCompositeOperation"] = __arg_0;
-
-  imageSmoothingEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "imageSmoothingEnabled");
-
-  imageSmoothingEnabled_Setter_(mthis, __arg_0) => mthis["imageSmoothingEnabled"] = __arg_0;
-
   isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
 
   isPointInPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isPointInPath", []);
@@ -1904,66 +2296,24 @@
 
   isPointInStroke_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "isPointInStroke", [__arg_0, __arg_1, __arg_2]);
 
-  lineCap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineCap");
-
-  lineCap_Setter_(mthis, __arg_0) => mthis["lineCap"] = __arg_0;
-
-  lineDashOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineDashOffset");
-
-  lineDashOffset_Setter_(mthis, __arg_0) => mthis["lineDashOffset"] = __arg_0;
-
-  lineJoin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineJoin");
-
-  lineJoin_Setter_(mthis, __arg_0) => mthis["lineJoin"] = __arg_0;
-
-  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", []);
-
-  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0]);
-
-  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0, __arg_1]);
-
-  lineWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineWidth");
-
-  lineWidth_Setter_(mthis, __arg_0) => mthis["lineWidth"] = __arg_0;
-
   measureText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "measureText", []);
 
   measureText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "measureText", [__arg_0]);
 
-  miterLimit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "miterLimit");
-
-  miterLimit_Setter_(mthis, __arg_0) => mthis["miterLimit"] = __arg_0;
-
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
-
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
-
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
-
   putImageData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0]);
 
   putImageData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1]);
 
   putImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2]);
 
+  putImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
   putImageData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
   putImageData_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
   putImageData_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1]);
-
-  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
-
-  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1]);
-
-  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2]);
-
-  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
   removeHitRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeHitRegion", []);
 
   removeHitRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeHitRegion", [__arg_0]);
@@ -1998,21 +2348,9 @@
 
   setTransform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "setTransform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  shadowBlur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowBlur");
+  stroke_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stroke", []);
 
-  shadowBlur_Setter_(mthis, __arg_0) => mthis["shadowBlur"] = __arg_0;
-
-  shadowColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowColor");
-
-  shadowColor_Setter_(mthis, __arg_0) => mthis["shadowColor"] = __arg_0;
-
-  shadowOffsetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowOffsetX");
-
-  shadowOffsetX_Setter_(mthis, __arg_0) => mthis["shadowOffsetX"] = __arg_0;
-
-  shadowOffsetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowOffsetY");
-
-  shadowOffsetY_Setter_(mthis, __arg_0) => mthis["shadowOffsetY"] = __arg_0;
+  stroke_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stroke", [__arg_0]);
 
   strokeRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "strokeRect", [__arg_0, __arg_1]);
 
@@ -2020,10 +2358,6 @@
 
   strokeRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "strokeRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  strokeStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "strokeStyle");
-
-  strokeStyle_Setter_(mthis, __arg_0) => mthis["strokeStyle"] = __arg_0;
-
   strokeText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "strokeText", [__arg_0]);
 
   strokeText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "strokeText", [__arg_0, __arg_1]);
@@ -2032,18 +2366,6 @@
 
   strokeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "strokeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  stroke_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stroke", []);
-
-  stroke_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stroke", [__arg_0]);
-
-  textAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textAlign");
-
-  textAlign_Setter_(mthis, __arg_0) => mthis["textAlign"] = __arg_0;
-
-  textBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textBaseline");
-
-  textBaseline_Setter_(mthis, __arg_0) => mthis["textBaseline"] = __arg_0;
-
   transform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "transform", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
   transform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "transform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
@@ -2056,6 +2378,56 @@
 
   translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0, __arg_1]);
 
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2]);
+
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closePath", []);
+
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", []);
+
+  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0]);
+
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0, __arg_1]);
+
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1]);
+
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
+
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1]);
+
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2]);
+
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
 }
 
 class BlinkChannelMergerNode extends BlinkAudioNode {
@@ -2071,14 +2443,16 @@
 class BlinkCharacterData extends BlinkNode {
   static final instance = new BlinkCharacterData();
 
-  appendData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendData", []);
-
-  appendData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendData", [__arg_0]);
-
   data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
 
   data_Setter_(mthis, __arg_0) => mthis["data"] = __arg_0;
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  appendData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendData", []);
+
+  appendData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendData", [__arg_0]);
+
   deleteData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteData", []);
 
   deleteData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteData", [__arg_0]);
@@ -2091,12 +2465,6 @@
 
   insertData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertData", [__arg_0, __arg_1]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextElementSibling");
-
-  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousElementSibling");
-
   replaceData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceData", [__arg_0]);
 
   replaceData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceData", [__arg_0, __arg_1]);
@@ -2109,6 +2477,43 @@
 
   substringData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "substringData", [__arg_0, __arg_1]);
 
+  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "after", []);
+
+  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "after", [__arg_0]);
+
+  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "before", []);
+
+  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "before", [__arg_0]);
+
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+
+  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", []);
+
+  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", [__arg_0]);
+
+  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextElementSibling");
+
+  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousElementSibling");
+
+}
+
+class BlinkChildNode {
+  static final instance = new BlinkChildNode();
+
+  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "after", []);
+
+  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "after", [__arg_0]);
+
+  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "before", []);
+
+  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "before", [__arg_0]);
+
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+
+  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", []);
+
+  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", [__arg_0]);
+
 }
 
 class BlinkCircularGeofencingRegion extends BlinkGeofencingRegion {
@@ -2126,6 +2531,23 @@
 
 }
 
+class BlinkClient {
+  static final instance = new BlinkClient();
+
+  frameType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frameType");
+
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+
+}
+
 class BlinkClientRect {
   static final instance = new BlinkClientRect();
 
@@ -2146,23 +2568,49 @@
 class BlinkClientRectList {
   static final instance = new BlinkClientRectList();
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
   $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+}
+
+class BlinkClients {
+  static final instance = new BlinkClients();
+
+  claim_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "claim", []);
+
+  matchAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", []);
+
+  matchAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", [__arg_0]);
+
+  openWindow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "openWindow", []);
+
+  openWindow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "openWindow", [__arg_0]);
+
+}
+
+class BlinkClipboardEvent extends BlinkEvent {
+  static final instance = new BlinkClipboardEvent();
+
+  clipboardData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clipboardData");
 
 }
 
 class BlinkCloseEvent extends BlinkEvent {
   static final instance = new BlinkCloseEvent();
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CloseEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CloseEvent"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CloseEvent"), [__arg_0, __arg_1]);
 
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+
   reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reason");
 
   wasClean_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wasClean");
@@ -2181,22 +2629,14 @@
 class BlinkCompositionEvent extends BlinkUIEvent {
   static final instance = new BlinkCompositionEvent();
 
-  activeSegmentEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeSegmentEnd");
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositionEvent"), []);
 
-  activeSegmentStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeSegmentStart");
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositionEvent"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositionEvent"), [__arg_0, __arg_1]);
 
   data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
 
-  getSegments_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSegments", []);
-
-  initCompositionEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initCompositionEvent", []);
-
-  initCompositionEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initCompositionEvent", [__arg_0]);
-
-  initCompositionEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initCompositionEvent", [__arg_0, __arg_1]);
-
   initCompositionEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initCompositionEvent", [__arg_0, __arg_1, __arg_2]);
 
   initCompositionEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initCompositionEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
@@ -2205,11 +2645,94 @@
 
 }
 
+class BlinkCompositorProxy {
+  static final instance = new BlinkCompositorProxy();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorProxy"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorProxy"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorProxy"), [__arg_0, __arg_1]);
+
+  opacity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "opacity");
+
+  opacity_Setter_(mthis, __arg_0) => mthis["opacity"] = __arg_0;
+
+  scrollLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollLeft");
+
+  scrollLeft_Setter_(mthis, __arg_0) => mthis["scrollLeft"] = __arg_0;
+
+  scrollTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollTop");
+
+  scrollTop_Setter_(mthis, __arg_0) => mthis["scrollTop"] = __arg_0;
+
+  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transform");
+
+  transform_Setter_(mthis, __arg_0) => mthis["transform"] = __arg_0;
+
+  disconnect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", []);
+
+  supports_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "supports", []);
+
+  supports_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "supports", [__arg_0]);
+
+}
+
+class BlinkCompositorWorker extends BlinkEventTarget {
+  static final instance = new BlinkCompositorWorker();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorWorker"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorWorker"), [__arg_0]);
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+
+  terminate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "terminate", []);
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+}
+
+class BlinkCompositorWorkerGlobalScope extends BlinkWorkerGlobalScope {
+  static final instance = new BlinkCompositorWorkerGlobalScope();
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  cancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", []);
+
+  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", [__arg_0]);
+
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+
+  requestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", []);
+
+  requestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", [__arg_0]);
+
+}
+
 class BlinkConsole extends BlinkConsoleBase {
   static final instance = new BlinkConsole();
 
   memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "memory");
 
+  memory_Setter_(mthis, __arg_0) => mthis["memory"] = __arg_0;
+
 }
 
 class BlinkConsoleBase {
@@ -2219,6 +2742,8 @@
 
   assert_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "assert", [__arg_0]);
 
+  assert_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "assert", [__arg_0, __arg_1]);
+
   clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
 
   clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
@@ -2243,16 +2768,16 @@
 
   error_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "error", [__arg_0]);
 
+  group_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "group", []);
+
+  group_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "group", [__arg_0]);
+
   groupCollapsed_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "groupCollapsed", []);
 
   groupCollapsed_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "groupCollapsed", [__arg_0]);
 
   groupEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "groupEnd", []);
 
-  group_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "group", []);
-
-  group_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "group", [__arg_0]);
-
   info_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "info", []);
 
   info_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "info", [__arg_0]);
@@ -2265,18 +2790,22 @@
 
   markTimeline_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "markTimeline", [__arg_0]);
 
-  profileEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "profileEnd", []);
-
-  profileEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "profileEnd", [__arg_0]);
-
   profile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "profile", []);
 
   profile_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "profile", [__arg_0]);
 
+  profileEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "profileEnd", []);
+
+  profileEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "profileEnd", [__arg_0]);
+
   table_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "table", []);
 
   table_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "table", [__arg_0]);
 
+  time_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "time", []);
+
+  time_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "time", [__arg_0]);
+
   timeEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "timeEnd", []);
 
   timeEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timeEnd", [__arg_0]);
@@ -2285,18 +2814,14 @@
 
   timeStamp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timeStamp", [__arg_0]);
 
-  time_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "time", []);
+  timeline_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "timeline", []);
 
-  time_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "time", [__arg_0]);
+  timeline_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timeline", [__arg_0]);
 
   timelineEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "timelineEnd", []);
 
   timelineEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timelineEnd", [__arg_0]);
 
-  timeline_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "timeline", []);
-
-  timeline_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timeline", [__arg_0]);
-
   trace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "trace", []);
 
   trace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "trace", [__arg_0]);
@@ -2325,10 +2850,10 @@
 
   accuracy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accuracy");
 
-  altitudeAccuracy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altitudeAccuracy");
-
   altitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altitude");
 
+  altitudeAccuracy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altitudeAccuracy");
+
   heading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "heading");
 
   latitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "latitude");
@@ -2339,56 +2864,69 @@
 
 }
 
-class BlinkCounter {
-  static final instance = new BlinkCounter();
-
-  identifier_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "identifier");
-
-  listStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "listStyle");
-
-  separator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "separator");
-
-}
-
 class BlinkCredential {
   static final instance = new BlinkCredential();
 
-  avatarURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "avatarURL");
+  iconURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iconURL");
 
   id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
 
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
 }
 
 class BlinkCredentialsContainer {
   static final instance = new BlinkCredentialsContainer();
 
-  notifyFailedSignIn_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "notifyFailedSignIn", []);
-
-  notifyFailedSignIn_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "notifyFailedSignIn", [__arg_0]);
-
   notifySignedIn_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "notifySignedIn", []);
 
   notifySignedIn_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "notifySignedIn", [__arg_0]);
 
-  notifySignedOut_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "notifySignedOut", []);
-
   request_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "request", []);
 
   request_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "request", [__arg_0]);
 
+  requireUserMediation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requireUserMediation", []);
+
+}
+
+class BlinkCrossOriginConnectEvent extends BlinkEvent {
+  static final instance = new BlinkCrossOriginConnectEvent();
+
+  client_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "client");
+
+  acceptConnection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "acceptConnection", []);
+
+  acceptConnection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "acceptConnection", [__arg_0]);
+
+}
+
+class BlinkCrossOriginServiceWorkerClient extends BlinkEventTarget {
+  static final instance = new BlinkCrossOriginServiceWorkerClient();
+
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+
+  targetUrl_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetUrl");
+
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+
 }
 
 class BlinkCrypto {
   static final instance = new BlinkCrypto();
 
+  subtle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "subtle");
+
   getRandomValues_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRandomValues", []);
 
   getRandomValues_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRandomValues", [__arg_0]);
 
-  subtle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "subtle");
-
 }
 
 class BlinkCryptoKey {
@@ -2407,14 +2945,14 @@
 class BlinkCustomEvent extends BlinkEvent {
   static final instance = new BlinkCustomEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CustomEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CustomEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CustomEvent"), [__arg_0, __arg_1]);
 
   detail_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "detail");
 
-  initCustomEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initCustomEvent", []);
-
-  initCustomEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initCustomEvent", [__arg_0]);
-
   initCustomEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initCustomEvent", [__arg_0, __arg_1]);
 
   initCustomEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initCustomEvent", [__arg_0, __arg_1, __arg_2]);
@@ -2441,6 +2979,8 @@
 class BlinkDOMException {
   static final instance = new BlinkDOMException();
 
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+
   message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
 
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
@@ -2470,35 +3010,33 @@
 class BlinkDOMImplementation {
   static final instance = new BlinkDOMImplementation();
 
-  createDocumentType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0]);
-
-  createDocumentType_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0, __arg_1]);
-
-  createDocumentType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0, __arg_1, __arg_2]);
-
-  createDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createDocument", []);
-
   createDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createDocument", [__arg_0]);
 
   createDocument_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createDocument", [__arg_0, __arg_1]);
 
   createDocument_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createDocument", [__arg_0, __arg_1, __arg_2]);
 
+  createDocumentType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0]);
+
+  createDocumentType_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0, __arg_1]);
+
+  createDocumentType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0, __arg_1, __arg_2]);
+
   createHTMLDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createHTMLDocument", []);
 
   createHTMLDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createHTMLDocument", [__arg_0]);
 
   hasFeature_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasFeature", []);
 
-  hasFeature_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasFeature", [__arg_0]);
-
-  hasFeature_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hasFeature", [__arg_0, __arg_1]);
-
 }
 
 class BlinkDOMMatrix extends BlinkDOMMatrixReadOnly {
   static final instance = new BlinkDOMMatrix();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMMatrix"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMMatrix"), [__arg_0]);
+
   a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "a");
 
   a_Setter_(mthis, __arg_0) => mthis["a"] = __arg_0;
@@ -2511,10 +3049,6 @@
 
   c_Setter_(mthis, __arg_0) => mthis["c"] = __arg_0;
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMMatrix"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMMatrix"), [__arg_0]);
-
   d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "d");
 
   d_Setter_(mthis, __arg_0) => mthis["d"] = __arg_0;
@@ -2696,6 +3230,14 @@
 
   multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "multiply", [__arg_0]);
 
+  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale", []);
+
+  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
+
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1]);
+
+  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1, __arg_2]);
+
   scale3d_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale3d", []);
 
   scale3d_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale3d", [__arg_0]);
@@ -2720,14 +3262,6 @@
 
   scaleNonUniform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale", []);
-
-  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
-
-  scale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1]);
-
-  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1, __arg_2]);
-
   toFloat32Array_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toFloat32Array", []);
 
   toFloat64Array_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toFloat64Array", []);
@@ -2839,14 +3373,14 @@
 class BlinkDOMRectReadOnly {
   static final instance = new BlinkDOMRectReadOnly();
 
-  bottom_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bottom");
-
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRectReadOnly"), [__arg_0, __arg_1]);
 
   constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRectReadOnly"), [__arg_0, __arg_1, __arg_2]);
 
   constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRectReadOnly"), [__arg_0, __arg_1, __arg_2, __arg_3]);
 
+  bottom_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bottom");
+
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
   left_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "left");
@@ -2866,17 +3400,21 @@
 class BlinkDOMSettableTokenList extends BlinkDOMTokenList {
   static final instance = new BlinkDOMSettableTokenList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
   value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
 
   value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
 }
 
 class BlinkDOMStringList {
   static final instance = new BlinkDOMStringList();
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
   $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
 
   contains_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "contains", []);
@@ -2887,8 +3425,6 @@
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkDOMStringMap {
@@ -2900,12 +3436,16 @@
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
 }
 
 class BlinkDOMTokenList {
   static final instance = new BlinkDOMTokenList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
 
@@ -2919,8 +3459,6 @@
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
   remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
 
   remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
@@ -2936,10 +3474,6 @@
 class BlinkDataTransfer {
   static final instance = new BlinkDataTransfer();
 
-  clearData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearData", []);
-
-  clearData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearData", [__arg_0]);
-
   dropEffect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dropEffect");
 
   dropEffect_Setter_(mthis, __arg_0) => mthis["dropEffect"] = __arg_0;
@@ -2950,12 +3484,18 @@
 
   files_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "files");
 
+  items_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "items");
+
+  types_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "types");
+
+  clearData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearData", []);
+
+  clearData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearData", [__arg_0]);
+
   getData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getData", []);
 
   getData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getData", [__arg_0]);
 
-  items_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "items");
-
   setData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setData", []);
 
   setData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setData", [__arg_0]);
@@ -2968,23 +3508,21 @@
 
   setDragImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setDragImage", [__arg_0, __arg_1, __arg_2]);
 
-  types_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "types");
-
 }
 
 class BlinkDataTransferItem {
   static final instance = new BlinkDataTransferItem();
 
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
   getAsFile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAsFile", []);
 
   getAsString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAsString", []);
 
   getAsString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAsString", [__arg_0]);
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
-
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
   webkitGetAsEntry_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetAsEntry", []);
 
 }
@@ -2992,7 +3530,7 @@
 class BlinkDataTransferItemList {
   static final instance = new BlinkDataTransferItemList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
 
@@ -3002,7 +3540,9 @@
 
   clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
   remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
 
@@ -3010,9 +3550,16 @@
 
 }
 
+class BlinkDataView extends BlinkArrayBufferView {
+  static final instance = new BlinkDataView();
+
+}
+
 class BlinkDatabase {
   static final instance = new BlinkDatabase();
 
+  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
+
   changeVersion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "changeVersion", []);
 
   changeVersion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "changeVersion", [__arg_0]);
@@ -3041,7 +3588,14 @@
 
   transaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "transaction", [__arg_0, __arg_1, __arg_2]);
 
-  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
+}
+
+class BlinkDatabaseCallback {
+  static final instance = new BlinkDatabaseCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
 
 }
 
@@ -3060,6 +3614,19 @@
 
 }
 
+class BlinkDefaultSessionStartEvent extends BlinkEvent {
+  static final instance = new BlinkDefaultSessionStartEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DefaultSessionStartEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DefaultSessionStartEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DefaultSessionStartEvent"), [__arg_0, __arg_1]);
+
+  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "session");
+
+}
+
 class BlinkDelayNode extends BlinkAudioNode {
   static final instance = new BlinkDelayNode();
 
@@ -3123,6 +3690,10 @@
 class BlinkDeviceLightEvent extends BlinkEvent {
   static final instance = new BlinkDeviceLightEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DeviceLightEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DeviceLightEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DeviceLightEvent"), [__arg_0, __arg_1]);
 
   value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
@@ -3132,19 +3703,13 @@
 class BlinkDeviceMotionEvent extends BlinkEvent {
   static final instance = new BlinkDeviceMotionEvent();
 
-  accelerationIncludingGravity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accelerationIncludingGravity");
-
   acceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "acceleration");
 
-  initDeviceMotionEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", []);
+  accelerationIncludingGravity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accelerationIncludingGravity");
 
-  initDeviceMotionEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0]);
+  interval_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "interval");
 
-  initDeviceMotionEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0, __arg_1]);
-
-  initDeviceMotionEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2]);
-
-  initDeviceMotionEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  rotationRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rotationRate");
 
   initDeviceMotionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
@@ -3152,10 +3717,6 @@
 
   initDeviceMotionEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  interval_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "interval");
-
-  rotationRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rotationRate");
-
 }
 
 class BlinkDeviceOrientationEvent extends BlinkEvent {
@@ -3169,16 +3730,6 @@
 
   gamma_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gamma");
 
-  initDeviceOrientationEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", []);
-
-  initDeviceOrientationEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0]);
-
-  initDeviceOrientationEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0, __arg_1]);
-
-  initDeviceOrientationEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2]);
-
-  initDeviceOrientationEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
   initDeviceOrientationEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
   initDeviceOrientationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
@@ -3277,32 +3828,18 @@
 
   activeElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeElement");
 
-  adoptNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "adoptNode", []);
-
-  adoptNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "adoptNode", [__arg_0]);
-
   anchors_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "anchors");
 
+  applets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "applets");
+
   body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "body");
 
   body_Setter_(mthis, __arg_0) => mthis["body"] = __arg_0;
 
-  caretRangeFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", []);
-
-  caretRangeFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", [__arg_0]);
-
-  caretRangeFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", [__arg_0, __arg_1]);
-
   characterSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "characterSet");
 
   charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charset");
 
-  charset_Setter_(mthis, __arg_0) => mthis["charset"] = __arg_0;
-
-  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
-
-  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
-
   compatMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compatMode");
 
   contentType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentType");
@@ -3311,86 +3848,20 @@
 
   cookie_Setter_(mthis, __arg_0) => mthis["cookie"] = __arg_0;
 
-  createCDATASection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createCDATASection", []);
-
-  createCDATASection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createCDATASection", [__arg_0]);
-
-  createDocumentFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentFragment", []);
-
-  createElementNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", []);
-
-  createElementNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0]);
-
-  createElementNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0, __arg_1]);
-
-  createElementNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0, __arg_1, __arg_2]);
-
-  createElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createElement", []);
-
-  createElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createElement", [__arg_0]);
-
-  createElement_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createElement", [__arg_0, __arg_1]);
-
-  createEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createEvent", []);
-
-  createEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createEvent", [__arg_0]);
-
-  createNodeIterator_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", []);
-
-  createNodeIterator_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0]);
-
-  createNodeIterator_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0, __arg_1]);
-
-  createNodeIterator_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0, __arg_1, __arg_2]);
-
-  createRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRange", []);
-
-  createTextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTextNode", []);
-
-  createTextNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTextNode", [__arg_0]);
-
-  createTouchList_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTouchList", []);
-
-  createTouchList_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTouchList", [__arg_0]);
-
-  createTouch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", []);
-
-  createTouch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0]);
-
-  createTouch_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
-
-  createTouch_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
-
-  createTouch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1]);
-
-  createTouch_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2]);
-
-  createTouch_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  createTouch_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  createTouch_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
-  createTouch_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
-
-  createTouch_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
-
-  createTouch_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
-
-  createTreeWalker_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", []);
-
-  createTreeWalker_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0]);
-
-  createTreeWalker_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0, __arg_1]);
-
-  createTreeWalker_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0, __arg_1, __arg_2]);
-
   currentScript_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentScript");
 
   defaultCharset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultCharset");
 
   defaultView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultView");
 
+  designMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "designMode");
+
+  designMode_Setter_(mthis, __arg_0) => mthis["designMode"] = __arg_0;
+
+  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dir");
+
+  dir_Setter_(mthis, __arg_0) => mthis["dir"] = __arg_0;
+
   doctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "doctype");
 
   documentElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "documentElement");
@@ -3401,13 +3872,293 @@
 
   domain_Setter_(mthis, __arg_0) => mthis["domain"] = __arg_0;
 
+  embeds_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "embeds");
+
+  fonts_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fonts");
+
+  forms_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "forms");
+
+  fullscreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullscreenElement");
+
+  fullscreenEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullscreenEnabled");
+
+  head_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "head");
+
+  hidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hidden");
+
+  images_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "images");
+
+  implementation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "implementation");
+
+  inputEncoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputEncoding");
+
+  lastModified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModified");
+
+  links_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "links");
+
+  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "location");
+
+  onbeforecopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforecopy");
+
+  onbeforecopy_Setter_(mthis, __arg_0) => mthis["onbeforecopy"] = __arg_0;
+
+  onbeforecut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforecut");
+
+  onbeforecut_Setter_(mthis, __arg_0) => mthis["onbeforecut"] = __arg_0;
+
+  onbeforepaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforepaste");
+
+  onbeforepaste_Setter_(mthis, __arg_0) => mthis["onbeforepaste"] = __arg_0;
+
+  oncopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncopy");
+
+  oncopy_Setter_(mthis, __arg_0) => mthis["oncopy"] = __arg_0;
+
+  oncut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncut");
+
+  oncut_Setter_(mthis, __arg_0) => mthis["oncut"] = __arg_0;
+
+  onfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfullscreenchange");
+
+  onfullscreenchange_Setter_(mthis, __arg_0) => mthis["onfullscreenchange"] = __arg_0;
+
+  onfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfullscreenerror");
+
+  onfullscreenerror_Setter_(mthis, __arg_0) => mthis["onfullscreenerror"] = __arg_0;
+
+  onpaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpaste");
+
+  onpaste_Setter_(mthis, __arg_0) => mthis["onpaste"] = __arg_0;
+
+  onpointerlockchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerlockchange");
+
+  onpointerlockchange_Setter_(mthis, __arg_0) => mthis["onpointerlockchange"] = __arg_0;
+
+  onpointerlockerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerlockerror");
+
+  onpointerlockerror_Setter_(mthis, __arg_0) => mthis["onpointerlockerror"] = __arg_0;
+
+  onreadystatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreadystatechange");
+
+  onreadystatechange_Setter_(mthis, __arg_0) => mthis["onreadystatechange"] = __arg_0;
+
+  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsearch");
+
+  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
+
+  onsecuritypolicyviolation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsecuritypolicyviolation");
+
+  onsecuritypolicyviolation_Setter_(mthis, __arg_0) => mthis["onsecuritypolicyviolation"] = __arg_0;
+
+  onselectionchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselectionchange");
+
+  onselectionchange_Setter_(mthis, __arg_0) => mthis["onselectionchange"] = __arg_0;
+
+  onselectstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselectstart");
+
+  onselectstart_Setter_(mthis, __arg_0) => mthis["onselectstart"] = __arg_0;
+
+  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchcancel");
+
+  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
+
+  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchend");
+
+  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
+
+  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchmove");
+
+  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
+
+  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchstart");
+
+  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
+
+  onwebkitfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitfullscreenchange");
+
+  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenchange"] = __arg_0;
+
+  onwebkitfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitfullscreenerror");
+
+  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenerror"] = __arg_0;
+
+  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwheel");
+
+  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
+
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+
+  plugins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "plugins");
+
+  pointerLockElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerLockElement");
+
+  preferredStylesheetSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preferredStylesheetSet");
+
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+
+  referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "referrer");
+
+  rootElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rootElement");
+
+  scripts_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scripts");
+
+  scrollingElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollingElement");
+
+  selectedStylesheetSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedStylesheetSet");
+
+  selectedStylesheetSet_Setter_(mthis, __arg_0) => mthis["selectedStylesheetSet"] = __arg_0;
+
+  styleSheets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleSheets");
+
+  timeline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeline");
+
+  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "title");
+
+  title_Setter_(mthis, __arg_0) => mthis["title"] = __arg_0;
+
+  visibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "visibilityState");
+
+  webkitCurrentFullScreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitCurrentFullScreenElement");
+
+  webkitFullscreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitFullscreenElement");
+
+  webkitFullscreenEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitFullscreenEnabled");
+
+  webkitHidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitHidden");
+
+  webkitIsFullScreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitIsFullScreen");
+
+  webkitVisibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitVisibilityState");
+
+  xmlEncoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlEncoding");
+
+  xmlStandalone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlStandalone");
+
+  xmlStandalone_Setter_(mthis, __arg_0) => mthis["xmlStandalone"] = __arg_0;
+
+  xmlVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlVersion");
+
+  xmlVersion_Setter_(mthis, __arg_0) => mthis["xmlVersion"] = __arg_0;
+
+  adoptNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "adoptNode", []);
+
+  adoptNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "adoptNode", [__arg_0]);
+
+  caretRangeFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", []);
+
+  caretRangeFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", [__arg_0]);
+
+  caretRangeFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", [__arg_0, __arg_1]);
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  createAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createAttribute", []);
+
+  createAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createAttribute", [__arg_0]);
+
+  createAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createAttributeNS", []);
+
+  createAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createAttributeNS", [__arg_0]);
+
+  createAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createAttributeNS", [__arg_0, __arg_1]);
+
+  createCDATASection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createCDATASection", []);
+
+  createCDATASection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createCDATASection", [__arg_0]);
+
+  createComment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createComment", []);
+
+  createComment_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createComment", [__arg_0]);
+
+  createDocumentFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentFragment", []);
+
+  createElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createElement", []);
+
+  createElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createElement", [__arg_0]);
+
+  createElement_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createElement", [__arg_0, __arg_1]);
+
+  createElementNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", []);
+
+  createElementNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0]);
+
+  createElementNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0, __arg_1]);
+
+  createElementNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0, __arg_1, __arg_2]);
+
+  createEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createEvent", []);
+
+  createEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createEvent", [__arg_0]);
+
+  createExpression_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", []);
+
+  createExpression_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", [__arg_0]);
+
+  createExpression_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", [__arg_0, __arg_1]);
+
+  createNSResolver_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createNSResolver", []);
+
+  createNSResolver_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createNSResolver", [__arg_0]);
+
+  createNodeIterator_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", []);
+
+  createNodeIterator_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0]);
+
+  createNodeIterator_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0, __arg_1]);
+
+  createNodeIterator_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0, __arg_1, __arg_2]);
+
+  createProcessingInstruction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProcessingInstruction", []);
+
+  createProcessingInstruction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createProcessingInstruction", [__arg_0]);
+
+  createProcessingInstruction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createProcessingInstruction", [__arg_0, __arg_1]);
+
+  createRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRange", []);
+
+  createTextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTextNode", []);
+
+  createTextNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTextNode", [__arg_0]);
+
+  createTouch_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  createTouch_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  createTouch_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
+
+  createTouchList_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTouchList", []);
+
+  createTouchList_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTouchList", [__arg_0]);
+
+  createTreeWalker_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", []);
+
+  createTreeWalker_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0]);
+
+  createTreeWalker_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0, __arg_1]);
+
+  createTreeWalker_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0, __arg_1, __arg_2]);
+
   elementFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", []);
 
   elementFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", [__arg_0]);
 
   elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", [__arg_0, __arg_1]);
 
-  embeds_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "embeds");
+  elementsFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", []);
+
+  elementsFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", [__arg_0]);
+
+  elementsFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", [__arg_0, __arg_1]);
+
+  evaluate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0]);
+
+  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1]);
+
+  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2]);
+
+  evaluate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  evaluate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
   execCommand_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "execCommand", []);
 
@@ -3421,26 +4172,12 @@
 
   exitPointerLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "exitPointerLock", []);
 
-  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
-
-  fonts_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fonts");
-
-  forms_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "forms");
-
-  fullscreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullscreenElement");
-
-  fullscreenEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullscreenEnabled");
-
   getCSSCanvasContext_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getCSSCanvasContext", [__arg_0, __arg_1]);
 
   getCSSCanvasContext_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getCSSCanvasContext", [__arg_0, __arg_1, __arg_2]);
 
   getCSSCanvasContext_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "getCSSCanvasContext", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
-
-  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
-
   getElementsByClassName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", []);
 
   getElementsByClassName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", [__arg_0]);
@@ -3453,11 +4190,15 @@
 
   getElementsByTagName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", [__arg_0]);
 
-  head_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "head");
+  getElementsByTagNameNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", []);
 
-  hidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hidden");
+  getElementsByTagNameNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", [__arg_0]);
 
-  implementation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "implementation");
+  getElementsByTagNameNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", [__arg_0, __arg_1]);
+
+  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelection", []);
+
+  hasFocus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasFocus", []);
 
   importNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "importNode", []);
 
@@ -3465,13 +4206,43 @@
 
   importNode_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "importNode", [__arg_0, __arg_1]);
 
-  inputEncoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputEncoding");
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
 
-  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
+  queryCommandEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandEnabled", []);
 
-  lastModified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModified");
+  queryCommandEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandEnabled", [__arg_0]);
 
-  links_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "links");
+  queryCommandIndeterm_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandIndeterm", []);
+
+  queryCommandIndeterm_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandIndeterm", [__arg_0]);
+
+  queryCommandState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandState", []);
+
+  queryCommandState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandState", [__arg_0]);
+
+  queryCommandSupported_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandSupported", []);
+
+  queryCommandSupported_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandSupported", [__arg_0]);
+
+  queryCommandValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandValue", []);
+
+  queryCommandValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandValue", [__arg_0]);
+
+  transformDocumentToTreeView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "transformDocumentToTreeView", []);
+
+  transformDocumentToTreeView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformDocumentToTreeView", [__arg_0]);
+
+  webkitCancelFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelFullScreen", []);
+
+  webkitExitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitExitFullscreen", []);
+
+  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
+
+  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
+
+  writeln_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "writeln", []);
+
+  writeln_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "writeln", [__arg_0]);
 
   onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
 
@@ -3485,18 +4256,6 @@
 
   onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
 
-  onbeforecopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforecopy");
-
-  onbeforecopy_Setter_(mthis, __arg_0) => mthis["onbeforecopy"] = __arg_0;
-
-  onbeforecut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforecut");
-
-  onbeforecut_Setter_(mthis, __arg_0) => mthis["onbeforecut"] = __arg_0;
-
-  onbeforepaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforepaste");
-
-  onbeforepaste_Setter_(mthis, __arg_0) => mthis["onbeforepaste"] = __arg_0;
-
   onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
 
   onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
@@ -3529,18 +4288,10 @@
 
   oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
 
-  oncopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncopy");
-
-  oncopy_Setter_(mthis, __arg_0) => mthis["oncopy"] = __arg_0;
-
   oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
 
   oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
 
-  oncut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncut");
-
-  oncut_Setter_(mthis, __arg_0) => mthis["oncut"] = __arg_0;
-
   ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
 
   ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
@@ -3593,14 +4344,6 @@
 
   onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
 
-  onfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfullscreenchange");
-
-  onfullscreenchange_Setter_(mthis, __arg_0) => mthis["onfullscreenchange"] = __arg_0;
-
-  onfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfullscreenerror");
-
-  onfullscreenerror_Setter_(mthis, __arg_0) => mthis["onfullscreenerror"] = __arg_0;
-
   oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
 
   oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
@@ -3669,10 +4412,6 @@
 
   onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
 
-  onpaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpaste");
-
-  onpaste_Setter_(mthis, __arg_0) => mthis["onpaste"] = __arg_0;
-
   onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
 
   onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
@@ -3685,13 +4424,37 @@
 
   onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
 
-  onpointerlockchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerlockchange");
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
 
-  onpointerlockchange_Setter_(mthis, __arg_0) => mthis["onpointerlockchange"] = __arg_0;
+  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
 
-  onpointerlockerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerlockerror");
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
 
-  onpointerlockerror_Setter_(mthis, __arg_0) => mthis["onpointerlockerror"] = __arg_0;
+  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+
+  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+
+  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+
+  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+
+  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+
+  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+
+  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
 
   onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
 
@@ -3701,10 +4464,6 @@
 
   onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
 
-  onreadystatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreadystatechange");
-
-  onreadystatechange_Setter_(mthis, __arg_0) => mthis["onreadystatechange"] = __arg_0;
-
   onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
 
   onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
@@ -3717,14 +4476,6 @@
 
   onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
 
-  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsearch");
-
-  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
-
-  onsecuritypolicyviolation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsecuritypolicyviolation");
-
-  onsecuritypolicyviolation_Setter_(mthis, __arg_0) => mthis["onsecuritypolicyviolation"] = __arg_0;
-
   onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
 
   onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
@@ -3737,14 +4488,6 @@
 
   onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
 
-  onselectionchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselectionchange");
-
-  onselectionchange_Setter_(mthis, __arg_0) => mthis["onselectionchange"] = __arg_0;
-
-  onselectstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselectstart");
-
-  onselectstart_Setter_(mthis, __arg_0) => mthis["onselectstart"] = __arg_0;
-
   onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
 
   onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
@@ -3769,22 +4512,6 @@
 
   ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
 
-  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchcancel");
-
-  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
-
-  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchend");
-
-  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
-
-  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchmove");
-
-  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
-
-  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchstart");
-
-  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
-
   onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
 
   onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
@@ -3793,130 +4520,94 @@
 
   onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
 
-  onwebkitfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitfullscreenchange");
+  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
 
-  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenchange"] = __arg_0;
+  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
 
-  onwebkitfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitfullscreenerror");
+  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
 
-  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenerror"] = __arg_0;
+  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
 
-  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwheel");
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
 
-  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
 
-  plugins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "plugins");
+  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prepend", []);
 
-  pointerLockElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerLockElement");
-
-  preferredStylesheetSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preferredStylesheetSet");
-
-  queryCommandEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandEnabled", []);
-
-  queryCommandEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandEnabled", [__arg_0]);
-
-  queryCommandIndeterm_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandIndeterm", []);
-
-  queryCommandIndeterm_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandIndeterm", [__arg_0]);
-
-  queryCommandState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandState", []);
-
-  queryCommandState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandState", [__arg_0]);
-
-  queryCommandSupported_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandSupported", []);
-
-  queryCommandSupported_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandSupported", [__arg_0]);
-
-  queryCommandValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandValue", []);
-
-  queryCommandValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandValue", [__arg_0]);
-
-  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
-
-  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
+  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prepend", [__arg_0]);
 
   querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
 
   querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
 
-  referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "referrer");
+  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
 
-  registerElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "registerElement", []);
+  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
 
-  registerElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "registerElement", [__arg_0]);
-
-  registerElement_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "registerElement", [__arg_0, __arg_1]);
-
-  rootElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rootElement");
-
-  scripts_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scripts");
-
-  selectedStylesheetSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedStylesheetSet");
-
-  selectedStylesheetSet_Setter_(mthis, __arg_0) => mthis["selectedStylesheetSet"] = __arg_0;
-
-  styleSheets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleSheets");
-
-  timeline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeline");
-
-  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "title");
-
-  title_Setter_(mthis, __arg_0) => mthis["title"] = __arg_0;
-
-  transformDocumentToTreeView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "transformDocumentToTreeView", []);
-
-  transformDocumentToTreeView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformDocumentToTreeView", [__arg_0]);
-
-  visibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "visibilityState");
-
-  webkitCancelFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelFullScreen", []);
-
-  webkitExitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitExitFullscreen", []);
-
-  webkitFullscreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitFullscreenElement");
-
-  webkitFullscreenEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitFullscreenEnabled");
-
-  webkitHidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitHidden");
-
-  webkitIsFullScreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitIsFullScreen");
-
-  webkitVisibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitVisibilityState");
-
-  xmlEncoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlEncoding");
+  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
 
 }
 
 class BlinkDocumentFragment extends BlinkNode {
   static final instance = new BlinkDocumentFragment();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DocumentFragment"), []);
+
   childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DocumentFragment"), []);
+  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
 
   firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
 
-  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
-
-  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
-
   lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
 
-  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
 
-  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
+
+  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prepend", []);
+
+  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prepend", [__arg_0]);
 
   querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
 
   querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
 
+  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
+
+  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
+
+  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
+
+  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
+
 }
 
 class BlinkDocumentType extends BlinkNode {
   static final instance = new BlinkDocumentType();
 
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  publicId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "publicId");
+
+  systemId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemId");
+
+  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "after", []);
+
+  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "after", [__arg_0]);
+
+  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "before", []);
+
+  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "before", [__arg_0]);
+
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+
+  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", []);
+
+  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", [__arg_0]);
+
 }
 
 class BlinkDynamicsCompressorNode extends BlinkAudioNode {
@@ -3956,23 +4647,21 @@
 
 }
 
+class BlinkEXTsRGB {
+  static final instance = new BlinkEXTsRGB();
+
+}
+
+class BlinkEffectModel {
+  static final instance = new BlinkEffectModel();
+
+}
+
 class BlinkElement extends BlinkNode {
   static final instance = new BlinkElement();
 
-  animate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "animate", []);
-
-  animate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "animate", [__arg_0]);
-
-  animate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "animate", [__arg_0, __arg_1]);
-
   attributes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "attributes");
 
-  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blur", []);
-
-  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
-
-  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
-
   classList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "classList");
 
   className_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "className");
@@ -3987,49 +4676,9 @@
 
   clientWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientWidth");
 
-  createShadowRoot_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShadowRoot", []);
+  computedName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "computedName");
 
-  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
-
-  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
-
-  getAnimationPlayers_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAnimationPlayers", []);
-
-  getAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", []);
-
-  getAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", [__arg_0]);
-
-  getAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", [__arg_0, __arg_1]);
-
-  getAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribute", []);
-
-  getAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribute", [__arg_0]);
-
-  getBoundingClientRect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBoundingClientRect", []);
-
-  getClientRects_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getClientRects", []);
-
-  getDestinationInsertionPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDestinationInsertionPoints", []);
-
-  getElementsByClassName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", []);
-
-  getElementsByClassName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", [__arg_0]);
-
-  getElementsByTagName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", []);
-
-  getElementsByTagName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", [__arg_0]);
-
-  hasAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", []);
-
-  hasAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", [__arg_0]);
-
-  hasAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", [__arg_0, __arg_1]);
-
-  hasAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttribute", []);
-
-  hasAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasAttribute", [__arg_0]);
-
-  hasAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributes", []);
+  computedRole_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "computedRole");
 
   id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
 
@@ -4039,36 +4688,10 @@
 
   innerHTML_Setter_(mthis, __arg_0) => mthis["innerHTML"] = __arg_0;
 
-  insertAdjacentElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", []);
-
-  insertAdjacentElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", [__arg_0]);
-
-  insertAdjacentElement_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", [__arg_0, __arg_1]);
-
-  insertAdjacentHTML_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", []);
-
-  insertAdjacentHTML_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", [__arg_0]);
-
-  insertAdjacentHTML_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", [__arg_0, __arg_1]);
-
-  insertAdjacentText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", []);
-
-  insertAdjacentText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", [__arg_0]);
-
-  insertAdjacentText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", [__arg_0, __arg_1]);
-
-  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
-
   localName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localName");
 
-  matches_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matches", []);
-
-  matches_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matches", [__arg_0]);
-
   namespaceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "namespaceURI");
 
-  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextElementSibling");
-
   offsetHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetHeight");
 
   offsetLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetLeft");
@@ -4145,44 +4768,8 @@
 
   prefix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "prefix");
 
-  prefix_Setter_(mthis, __arg_0) => mthis["prefix"] = __arg_0;
-
-  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousElementSibling");
-
-  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
-
-  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
-
-  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
-
-  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
-
-  removeAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", []);
-
-  removeAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", [__arg_0]);
-
-  removeAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", [__arg_0, __arg_1]);
-
-  removeAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAttribute", []);
-
-  removeAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeAttribute", [__arg_0]);
-
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
-
-  requestFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestFullscreen", []);
-
-  requestPointerLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestPointerLock", []);
-
   scrollHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollHeight");
 
-  scrollIntoViewIfNeeded_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoViewIfNeeded", []);
-
-  scrollIntoViewIfNeeded_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoViewIfNeeded", [__arg_0]);
-
-  scrollIntoView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoView", []);
-
-  scrollIntoView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoView", [__arg_0]);
-
   scrollLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollLeft");
 
   scrollLeft_Setter_(mthis, __arg_0) => mthis["scrollLeft"] = __arg_0;
@@ -4193,11 +4780,143 @@
 
   scrollWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollWidth");
 
-  setAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0]);
+  shadowRoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowRoot");
 
-  setAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0, __arg_1]);
+  tagName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tagName");
 
-  setAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0, __arg_1, __arg_2]);
+  animate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "animate", []);
+
+  animate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "animate", [__arg_0]);
+
+  animate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "animate", [__arg_0, __arg_1]);
+
+  closest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closest", []);
+
+  closest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "closest", [__arg_0]);
+
+  createShadowRoot_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShadowRoot", []);
+
+  createShadowRoot_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShadowRoot", [__arg_0]);
+
+  getAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAnimations", []);
+
+  getAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribute", []);
+
+  getAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribute", [__arg_0]);
+
+  getAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", []);
+
+  getAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", [__arg_0]);
+
+  getAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", [__arg_0, __arg_1]);
+
+  getAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNode", []);
+
+  getAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNode", [__arg_0]);
+
+  getAttributeNodeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNodeNS", []);
+
+  getAttributeNodeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNodeNS", [__arg_0]);
+
+  getAttributeNodeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNodeNS", [__arg_0, __arg_1]);
+
+  getBoundingClientRect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBoundingClientRect", []);
+
+  getClientRects_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getClientRects", []);
+
+  getDestinationInsertionPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDestinationInsertionPoints", []);
+
+  getElementsByClassName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", []);
+
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", [__arg_0]);
+
+  getElementsByTagName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", []);
+
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", [__arg_0]);
+
+  getElementsByTagNameNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", []);
+
+  getElementsByTagNameNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", [__arg_0]);
+
+  getElementsByTagNameNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", [__arg_0, __arg_1]);
+
+  hasAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttribute", []);
+
+  hasAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasAttribute", [__arg_0]);
+
+  hasAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", []);
+
+  hasAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", [__arg_0]);
+
+  hasAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", [__arg_0, __arg_1]);
+
+  hasAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributes", []);
+
+  insertAdjacentElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", []);
+
+  insertAdjacentElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", [__arg_0]);
+
+  insertAdjacentElement_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", [__arg_0, __arg_1]);
+
+  insertAdjacentHTML_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", []);
+
+  insertAdjacentHTML_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", [__arg_0]);
+
+  insertAdjacentHTML_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", [__arg_0, __arg_1]);
+
+  insertAdjacentText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", []);
+
+  insertAdjacentText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", [__arg_0]);
+
+  insertAdjacentText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", [__arg_0, __arg_1]);
+
+  matches_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matches", []);
+
+  matches_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matches", [__arg_0]);
+
+  removeAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAttribute", []);
+
+  removeAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeAttribute", [__arg_0]);
+
+  removeAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", []);
+
+  removeAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", [__arg_0]);
+
+  removeAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", [__arg_0, __arg_1]);
+
+  removeAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNode", []);
+
+  removeAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNode", [__arg_0]);
+
+  requestFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestFullscreen", []);
+
+  requestPointerLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestPointerLock", []);
+
+  scroll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scroll", []);
+
+  scroll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0]);
+
+  scroll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0, __arg_1]);
+
+  scrollBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", []);
+
+  scrollBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0]);
+
+  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0, __arg_1]);
+
+  scrollIntoView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoView", []);
+
+  scrollIntoView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoView", [__arg_0]);
+
+  scrollIntoViewIfNeeded_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoViewIfNeeded", []);
+
+  scrollIntoViewIfNeeded_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoViewIfNeeded", [__arg_0]);
+
+  scrollTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", []);
+
+  scrollTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0]);
+
+  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0, __arg_1]);
 
   setAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setAttribute", []);
 
@@ -4205,1257 +4924,67 @@
 
   setAttribute_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setAttribute", [__arg_0, __arg_1]);
 
-  shadowRoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowRoot");
+  setAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0]);
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  setAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0, __arg_1]);
 
-  tagName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tagName");
+  setAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0, __arg_1, __arg_2]);
+
+  setAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNode", []);
+
+  setAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNode", [__arg_0]);
+
+  setAttributeNodeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNodeNS", []);
+
+  setAttributeNodeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNodeNS", [__arg_0]);
+
+  webkitMatchesSelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitMatchesSelector", []);
+
+  webkitMatchesSelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitMatchesSelector", [__arg_0]);
 
   webkitRequestFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFullScreen", []);
 
-  webkitRequestFullScreen_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFullScreen", [__arg_0]);
+  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
 
-  webkitRequestFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFullscreen", []);
+  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
 
-}
+  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
 
-class BlinkEntry {
-  static final instance = new BlinkEntry();
-
-  copyTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", []);
-
-  copyTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0]);
-
-  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1]);
-
-  copyTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1, __arg_2]);
-
-  copyTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  filesystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filesystem");
-
-  fullPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullPath");
-
-  getMetadata_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", []);
-
-  getMetadata_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", [__arg_0]);
-
-  getMetadata_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", [__arg_0, __arg_1]);
-
-  getParent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParent", []);
-
-  getParent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParent", [__arg_0]);
-
-  getParent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getParent", [__arg_0, __arg_1]);
-
-  isDirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isDirectory");
-
-  isFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isFile");
-
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
-
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
-
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
-
-  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1, __arg_2]);
-
-  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
-
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
-
-  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
-
-  remove_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0, __arg_1]);
-
-  toURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toURL", []);
-
-}
-
-class BlinkEntrySync {
-  static final instance = new BlinkEntrySync();
-
-  copyTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", []);
-
-  copyTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0]);
-
-  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1]);
-
-  filesystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filesystem");
-
-  fullPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullPath");
-
-  getMetadata_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", []);
-
-  getParent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParent", []);
-
-  isDirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isDirectory");
-
-  isFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isFile");
-
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
-
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
-
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
-
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
-
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
-
-  toURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toURL", []);
-
-}
-
-class BlinkErrorEvent extends BlinkEvent {
-  static final instance = new BlinkErrorEvent();
-
-  colno_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "colno");
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ErrorEvent"), [__arg_0, __arg_1]);
-
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
-
-  filename_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filename");
-
-  lineno_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineno");
-
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
-
-}
-
-class BlinkEvent {
-  static final instance = new BlinkEvent();
-
-  bubbles_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bubbles");
-
-  cancelBubble_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cancelBubble");
-
-  cancelBubble_Setter_(mthis, __arg_0) => mthis["cancelBubble"] = __arg_0;
-
-  cancelable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cancelable");
-
-  clipboardData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clipboardData");
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Event"), [__arg_0, __arg_1]);
-
-  currentTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTarget");
-
-  defaultPrevented_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultPrevented");
-
-  eventPhase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "eventPhase");
-
-  initEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", []);
-
-  initEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0]);
-
-  initEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0, __arg_1]);
-
-  initEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0, __arg_1, __arg_2]);
-
-  path_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "path");
-
-  preventDefault_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "preventDefault", []);
-
-  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "returnValue");
-
-  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
-
-  stopImmediatePropagation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stopImmediatePropagation", []);
-
-  stopPropagation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stopPropagation", []);
-
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
-
-  timeStamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeStamp");
-
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-}
-
-class BlinkEventSource extends BlinkEventTarget {
-  static final instance = new BlinkEventSource();
-
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), [__arg_0]);
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), [__arg_0, __arg_1]);
-
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
-
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
-
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
-
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
-
-  onopen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onopen");
-
-  onopen_Setter_(mthis, __arg_0) => mthis["onopen"] = __arg_0;
-
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
-
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
-
-  withCredentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "withCredentials");
-
-}
-
-class BlinkEventTarget {
-  static final instance = new BlinkEventTarget();
-
-  addEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", []);
-
-  addEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0]);
-
-  addEventListener_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0, __arg_1]);
-
-  addEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0, __arg_1, __arg_2]);
-
-  dispatchEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "dispatchEvent", []);
-
-  dispatchEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "dispatchEvent", [__arg_0]);
-
-  removeEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", []);
-
-  removeEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0]);
-
-  removeEventListener_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0, __arg_1]);
-
-  removeEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0, __arg_1, __arg_2]);
-
-}
-
-class BlinkExtendableEvent extends BlinkEvent {
-  static final instance = new BlinkExtendableEvent();
-
-  waitUntil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "waitUntil", []);
-
-  waitUntil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "waitUntil", [__arg_0]);
-
-}
-
-class BlinkFederatedCredential extends BlinkCredential {
-  static final instance = new BlinkFederatedCredential();
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FederatedCredential"), [__arg_0, __arg_1]);
-
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FederatedCredential"), [__arg_0, __arg_1, __arg_2]);
-
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FederatedCredential"), [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  federation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "federation");
-
-}
-
-class BlinkFetchEvent extends BlinkEvent {
-  static final instance = new BlinkFetchEvent();
-
-  isReload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isReload");
-
-  request_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "request");
-
-  respondWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", []);
-
-  respondWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", [__arg_0]);
-
-}
-
-class BlinkFile extends BlinkBlob {
-  static final instance = new BlinkFile();
-
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0]);
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0, __arg_1]);
-
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0, __arg_1, __arg_2]);
-
-  lastModifiedDate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModifiedDate");
-
-  lastModified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModified");
-
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
-
-  webkitRelativePath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitRelativePath");
-
-}
-
-class BlinkFileEntry extends BlinkEntry {
-  static final instance = new BlinkFileEntry();
-
-  createWriter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", []);
-
-  createWriter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", [__arg_0]);
-
-  createWriter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", [__arg_0, __arg_1]);
-
-  file_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "file", []);
-
-  file_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "file", [__arg_0]);
-
-  file_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "file", [__arg_0, __arg_1]);
-
-}
-
-class BlinkFileEntrySync extends BlinkEntrySync {
-  static final instance = new BlinkFileEntrySync();
-
-  createWriter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", []);
-
-  file_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "file", []);
-
-}
-
-class BlinkFileError extends BlinkDOMError {
-  static final instance = new BlinkFileError();
-
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
-
-}
-
-class BlinkFileList {
-  static final instance = new BlinkFileList();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-}
-
-class BlinkFileReader extends BlinkEventTarget {
-  static final instance = new BlinkFileReader();
-
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
-
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FileReader"), []);
-
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
-
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
-
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
-
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
-
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
-
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
-
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
-
-  onloadend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadend");
-
-  onloadend_Setter_(mthis, __arg_0) => mthis["onloadend"] = __arg_0;
-
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
-
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
-
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
-
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
-
-  readAsArrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", []);
-
-  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", [__arg_0]);
-
-  readAsBinaryString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", []);
-
-  readAsBinaryString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", [__arg_0]);
-
-  readAsDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", []);
-
-  readAsDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", [__arg_0]);
-
-  readAsText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", []);
-
-  readAsText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0]);
-
-  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0, __arg_1]);
-
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
-
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
-
-}
-
-class BlinkFileReaderSync {
-  static final instance = new BlinkFileReaderSync();
-
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FileReaderSync"), []);
-
-  readAsArrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", []);
-
-  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", [__arg_0]);
-
-  readAsBinaryString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", []);
-
-  readAsBinaryString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", [__arg_0]);
-
-  readAsDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", []);
-
-  readAsDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", [__arg_0]);
-
-  readAsText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", []);
-
-  readAsText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0]);
-
-  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0, __arg_1]);
-
-}
-
-class BlinkFileWriter extends BlinkEventTarget {
-  static final instance = new BlinkFileWriter();
-
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
-
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
-
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
-
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
-
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
-
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
-
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
-
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
-
-  onwrite_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwrite");
-
-  onwrite_Setter_(mthis, __arg_0) => mthis["onwrite"] = __arg_0;
-
-  onwriteend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwriteend");
-
-  onwriteend_Setter_(mthis, __arg_0) => mthis["onwriteend"] = __arg_0;
-
-  onwritestart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwritestart");
-
-  onwritestart_Setter_(mthis, __arg_0) => mthis["onwritestart"] = __arg_0;
-
-  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
-
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
-
-  seek_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "seek", []);
-
-  seek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "seek", [__arg_0]);
-
-  truncate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "truncate", []);
-
-  truncate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "truncate", [__arg_0]);
-
-  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
-
-  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
-
-}
-
-class BlinkFileWriterSync {
-  static final instance = new BlinkFileWriterSync();
-
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
-
-  seek_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "seek", []);
-
-  seek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "seek", [__arg_0]);
-
-  truncate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "truncate", []);
-
-  truncate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "truncate", [__arg_0]);
-
-  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
-
-  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
-
-}
-
-class BlinkFocusEvent extends BlinkUIEvent {
-  static final instance = new BlinkFocusEvent();
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FocusEvent"), [__arg_0, __arg_1]);
-
-  relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedTarget");
-
-}
-
-class BlinkFontFace {
-  static final instance = new BlinkFontFace();
-
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0]);
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0, __arg_1]);
-
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0, __arg_1, __arg_2]);
-
-  family_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "family");
-
-  family_Setter_(mthis, __arg_0) => mthis["family"] = __arg_0;
-
-  featureSettings_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "featureSettings");
-
-  featureSettings_Setter_(mthis, __arg_0) => mthis["featureSettings"] = __arg_0;
-
-  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
-
-  loaded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loaded");
-
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
-
-  stretch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stretch");
-
-  stretch_Setter_(mthis, __arg_0) => mthis["stretch"] = __arg_0;
-
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
-
-  style_Setter_(mthis, __arg_0) => mthis["style"] = __arg_0;
-
-  unicodeRange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unicodeRange");
-
-  unicodeRange_Setter_(mthis, __arg_0) => mthis["unicodeRange"] = __arg_0;
-
-  variant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "variant");
-
-  variant_Setter_(mthis, __arg_0) => mthis["variant"] = __arg_0;
-
-  weight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "weight");
-
-  weight_Setter_(mthis, __arg_0) => mthis["weight"] = __arg_0;
-
-}
-
-class BlinkFontFaceSet extends BlinkEventTarget {
-  static final instance = new BlinkFontFaceSet();
-
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
-
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
-
-  check_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "check", []);
-
-  check_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "check", [__arg_0]);
-
-  check_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "check", [__arg_0, __arg_1]);
-
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
-
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
-
-  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
-
-  forEach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "forEach", []);
-
-  forEach_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "forEach", [__arg_0]);
-
-  forEach_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "forEach", [__arg_0, __arg_1]);
-
-  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
-
-  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
-
-  onloading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloading");
-
-  onloading_Setter_(mthis, __arg_0) => mthis["onloading"] = __arg_0;
-
-  onloadingdone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadingdone");
-
-  onloadingdone_Setter_(mthis, __arg_0) => mthis["onloadingdone"] = __arg_0;
-
-  onloadingerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadingerror");
-
-  onloadingerror_Setter_(mthis, __arg_0) => mthis["onloadingerror"] = __arg_0;
-
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
-
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
-
-}
-
-class BlinkFontFaceSetLoadEvent extends BlinkEvent {
-  static final instance = new BlinkFontFaceSetLoadEvent();
-
-  fontfaces_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fontfaces");
-
-}
-
-class BlinkFormData {
-  static final instance = new BlinkFormData();
+  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
 
   append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
 
   append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
 
-  append_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0, __arg_1]);
+  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prepend", []);
 
-  append_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0, __arg_1, __arg_2]);
+  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prepend", [__arg_0]);
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FormData"), []);
+  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FormData"), [__arg_0]);
+  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
 
-}
+  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
 
-class BlinkGainNode extends BlinkAudioNode {
-  static final instance = new BlinkGainNode();
+  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
 
-  gain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gain");
+  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "after", []);
 
-}
+  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "after", [__arg_0]);
 
-class BlinkGamepad {
-  static final instance = new BlinkGamepad();
+  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "before", []);
 
-  axes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "axes");
+  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "before", [__arg_0]);
 
-  connected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connected");
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", []);
 
-  index_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "index");
+  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", [__arg_0]);
 
-  mapping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mapping");
+  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextElementSibling");
 
-  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
-
-}
-
-class BlinkGamepadButton {
-  static final instance = new BlinkGamepadButton();
-
-  pressed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pressed");
-
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
-
-}
-
-class BlinkGamepadEvent extends BlinkEvent {
-  static final instance = new BlinkGamepadEvent();
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "GamepadEvent"), [__arg_0, __arg_1]);
-
-  gamepad_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gamepad");
-
-}
-
-class BlinkGamepadList {
-  static final instance = new BlinkGamepadList();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-}
-
-class BlinkGeofencing {
-  static final instance = new BlinkGeofencing();
-
-  getRegisteredRegions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegisteredRegions", []);
-
-  registerRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "registerRegion", []);
-
-  registerRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "registerRegion", [__arg_0]);
-
-  unregisterRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregisterRegion", []);
-
-  unregisterRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "unregisterRegion", [__arg_0]);
-
-}
-
-class BlinkGeofencingRegion {
-  static final instance = new BlinkGeofencingRegion();
-
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
-
-}
-
-class BlinkGeolocation {
-  static final instance = new BlinkGeolocation();
-
-  clearWatch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearWatch", []);
-
-  clearWatch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearWatch", [__arg_0]);
-
-  getCurrentPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", []);
-
-  getCurrentPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0]);
-
-  getCurrentPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0, __arg_1]);
-
-  getCurrentPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0, __arg_1, __arg_2]);
-
-  watchPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", []);
-
-  watchPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0]);
-
-  watchPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0, __arg_1]);
-
-  watchPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0, __arg_1, __arg_2]);
-
-}
-
-class BlinkGeoposition {
-  static final instance = new BlinkGeoposition();
-
-  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coords");
-
-  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
-
-}
-
-class BlinkHTMLAllCollection {
-  static final instance = new BlinkHTMLAllCollection();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
-
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
-
-}
-
-class BlinkHTMLAnchorElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLAnchorElement();
-
-  download_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "download");
-
-  download_Setter_(mthis, __arg_0) => mthis["download"] = __arg_0;
-
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
-
-  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
-
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
-
-  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
-
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
-
-  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
-
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
-
-  hreflang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hreflang");
-
-  hreflang_Setter_(mthis, __arg_0) => mthis["hreflang"] = __arg_0;
-
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
-
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
-
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
-
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
-
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
-
-  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
-
-  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
-
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
-
-  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
-
-  ping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ping");
-
-  ping_Setter_(mthis, __arg_0) => mthis["ping"] = __arg_0;
-
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
-
-  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
-
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
-
-  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
-
-  rel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rel");
-
-  rel_Setter_(mthis, __arg_0) => mthis["rel"] = __arg_0;
-
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
-
-  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
-
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
-
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
-
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
-
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
-
-  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
-
-  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
-
-}
-
-class BlinkHTMLAppletElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLAppletElement();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
-
-}
-
-class BlinkHTMLAreaElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLAreaElement();
-
-  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
-
-  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
-
-  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coords");
-
-  coords_Setter_(mthis, __arg_0) => mthis["coords"] = __arg_0;
-
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
-
-  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
-
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
-
-  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
-
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
-
-  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
-
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
-
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
-
-  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
-
-  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
-
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
-
-  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
-
-  ping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ping");
-
-  ping_Setter_(mthis, __arg_0) => mthis["ping"] = __arg_0;
-
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
-
-  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
-
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
-
-  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
-
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
-
-  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
-
-  shape_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shape");
-
-  shape_Setter_(mthis, __arg_0) => mthis["shape"] = __arg_0;
-
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
-
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
-
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
-
-  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
-
-  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
-
-}
-
-class BlinkHTMLAudioElement extends BlinkHTMLMediaElement {
-  static final instance = new BlinkHTMLAudioElement();
-
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Audio"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Audio"), [__arg_0]);
-
-}
-
-class BlinkHTMLBRElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLBRElement();
-
-}
-
-class BlinkHTMLBaseElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLBaseElement();
-
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
-
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
-
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
-
-}
-
-class BlinkHTMLBodyElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLBodyElement();
-
-  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
-
-  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
-
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
-
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
-
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
-
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
-
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
-
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
-
-  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
-
-  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
-
-  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
-
-  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
-
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
-
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
-
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
-
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
-
-  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
-
-  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
-
-  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
-
-  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
-
-  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onorientationchange");
-
-  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
-
-  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
-
-  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
-
-  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
-
-  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
-
-  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
-
-  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
-
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
-
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
-
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
-
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
-
-  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
-
-  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
-
-  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
-
-  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
-
-}
-
-class BlinkHTMLButtonElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLButtonElement();
-
-  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
-
-  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
-
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
-
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
-
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
-
-  formAction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formAction");
-
-  formAction_Setter_(mthis, __arg_0) => mthis["formAction"] = __arg_0;
-
-  formEnctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formEnctype");
-
-  formEnctype_Setter_(mthis, __arg_0) => mthis["formEnctype"] = __arg_0;
-
-  formMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formMethod");
-
-  formMethod_Setter_(mthis, __arg_0) => mthis["formMethod"] = __arg_0;
-
-  formNoValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formNoValidate");
-
-  formNoValidate_Setter_(mthis, __arg_0) => mthis["formNoValidate"] = __arg_0;
-
-  formTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formTarget");
-
-  formTarget_Setter_(mthis, __arg_0) => mthis["formTarget"] = __arg_0;
-
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
-
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
-
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
-
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
-
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
-
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
-
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
-
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
-
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
-
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
-
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
-
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
-
-}
-
-class BlinkHTMLCanvasElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLCanvasElement();
-
-  getContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContext", []);
-
-  getContext_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getContext", [__arg_0]);
-
-  getContext_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getContext", [__arg_0, __arg_1]);
-
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
-
-  toDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", []);
-
-  toDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", [__arg_0]);
-
-  toDataURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", [__arg_0, __arg_1]);
-
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
-
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
-
-}
-
-class BlinkHTMLCollection {
-  static final instance = new BlinkHTMLCollection();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
-
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
-
-}
-
-class BlinkHTMLContentElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLContentElement();
-
-  getDistributedNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDistributedNodes", []);
-
-  select_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "select");
-
-  select_Setter_(mthis, __arg_0) => mthis["select"] = __arg_0;
-
-}
-
-class BlinkHTMLDListElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLDListElement();
-
-}
-
-class BlinkHTMLDataListElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLDataListElement();
-
-  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "options");
-
-}
-
-class BlinkHTMLDetailsElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLDetailsElement();
-
-  open_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "open");
-
-  open_Setter_(mthis, __arg_0) => mthis["open"] = __arg_0;
-
-}
-
-class BlinkHTMLDialogElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLDialogElement();
-
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
-  close_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0]);
-
-  open_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "open");
-
-  open_Setter_(mthis, __arg_0) => mthis["open"] = __arg_0;
-
-  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "returnValue");
-
-  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
-
-  showModal_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "showModal", []);
-
-  show_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "show", []);
-
-}
-
-class BlinkHTMLDirectoryElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLDirectoryElement();
-
-}
-
-class BlinkHTMLDivElement extends BlinkHTMLElement {
-  static final instance = new BlinkHTMLDivElement();
-
-}
-
-class BlinkHTMLDocument extends BlinkDocument {
-  static final instance = new BlinkHTMLDocument();
-
-  alinkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alinkColor");
-
-  alinkColor_Setter_(mthis, __arg_0) => mthis["alinkColor"] = __arg_0;
-
-  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
-
-  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
-
-  captureEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "captureEvents", []);
-
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
-
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
-  compatMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compatMode");
-
-  fgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fgColor");
-
-  fgColor_Setter_(mthis, __arg_0) => mthis["fgColor"] = __arg_0;
-
-  linkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "linkColor");
-
-  linkColor_Setter_(mthis, __arg_0) => mthis["linkColor"] = __arg_0;
-
-  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
-
-  releaseEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseEvents", []);
-
-  vlinkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vlinkColor");
-
-  vlinkColor_Setter_(mthis, __arg_0) => mthis["vlinkColor"] = __arg_0;
-
-  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
-
-  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
-
-  writeln_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "writeln", []);
-
-  writeln_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "writeln", [__arg_0]);
-
-}
-
-class BlinkHTMLElement extends BlinkElement {
-  static final instance = new BlinkHTMLElement();
-
-  accessKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accessKey");
-
-  accessKey_Setter_(mthis, __arg_0) => mthis["accessKey"] = __arg_0;
-
-  click_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "click", []);
-
-  contentEditable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentEditable");
-
-  contentEditable_Setter_(mthis, __arg_0) => mthis["contentEditable"] = __arg_0;
-
-  contextMenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contextMenu");
-
-  contextMenu_Setter_(mthis, __arg_0) => mthis["contextMenu"] = __arg_0;
-
-  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dir");
-
-  dir_Setter_(mthis, __arg_0) => mthis["dir"] = __arg_0;
-
-  draggable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "draggable");
-
-  draggable_Setter_(mthis, __arg_0) => mthis["draggable"] = __arg_0;
-
-  hidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hidden");
-
-  hidden_Setter_(mthis, __arg_0) => mthis["hidden"] = __arg_0;
-
-  innerText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerText");
-
-  innerText_Setter_(mthis, __arg_0) => mthis["innerText"] = __arg_0;
-
-  inputMethodContext_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputMethodContext");
-
-  isContentEditable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isContentEditable");
-
-  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lang");
-
-  lang_Setter_(mthis, __arg_0) => mthis["lang"] = __arg_0;
+  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousElementSibling");
 
   onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
 
@@ -5637,6 +5166,38 @@
 
   onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
 
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+
+  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+
+  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+
+  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+
+  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+
+  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+
+  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+
+  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+
+  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+
   onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
 
   onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
@@ -5701,6 +5262,1806 @@
 
   onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
 
+}
+
+class BlinkEntriesCallback {
+  static final instance = new BlinkEntriesCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkEntry {
+  static final instance = new BlinkEntry();
+
+  filesystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filesystem");
+
+  fullPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullPath");
+
+  isDirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isDirectory");
+
+  isFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isFile");
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  copyTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", []);
+
+  copyTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0]);
+
+  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1]);
+
+  copyTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1, __arg_2]);
+
+  copyTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  getMetadata_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", []);
+
+  getMetadata_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", [__arg_0]);
+
+  getMetadata_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", [__arg_0, __arg_1]);
+
+  getParent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParent", []);
+
+  getParent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParent", [__arg_0]);
+
+  getParent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getParent", [__arg_0, __arg_1]);
+
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+
+  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1, __arg_2]);
+
+  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+
+  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
+
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0, __arg_1]);
+
+  toURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toURL", []);
+
+}
+
+class BlinkEntryCallback {
+  static final instance = new BlinkEntryCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkEntrySync {
+  static final instance = new BlinkEntrySync();
+
+  filesystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filesystem");
+
+  fullPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullPath");
+
+  isDirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isDirectory");
+
+  isFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isFile");
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  copyTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", []);
+
+  copyTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0]);
+
+  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1]);
+
+  getMetadata_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", []);
+
+  getParent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParent", []);
+
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+
+  toURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toURL", []);
+
+}
+
+class BlinkErrorCallback {
+  static final instance = new BlinkErrorCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkErrorEvent extends BlinkEvent {
+  static final instance = new BlinkErrorEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ErrorEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ErrorEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ErrorEvent"), [__arg_0, __arg_1]);
+
+  colno_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "colno");
+
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+
+  filename_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filename");
+
+  lineno_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineno");
+
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+
+}
+
+class BlinkEvent {
+  static final instance = new BlinkEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Event"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Event"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Event"), [__arg_0, __arg_1]);
+
+  bubbles_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bubbles");
+
+  cancelBubble_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cancelBubble");
+
+  cancelBubble_Setter_(mthis, __arg_0) => mthis["cancelBubble"] = __arg_0;
+
+  cancelable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cancelable");
+
+  currentTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTarget");
+
+  defaultPrevented_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultPrevented");
+
+  eventPhase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "eventPhase");
+
+  path_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "path");
+
+  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "returnValue");
+
+  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
+
+  srcElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "srcElement");
+
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+
+  timeStamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeStamp");
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  initEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0]);
+
+  initEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0, __arg_1]);
+
+  initEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0, __arg_1, __arg_2]);
+
+  preventDefault_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "preventDefault", []);
+
+  stopImmediatePropagation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stopImmediatePropagation", []);
+
+  stopPropagation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stopPropagation", []);
+
+}
+
+class BlinkEventListener {
+  static final instance = new BlinkEventListener();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkEventSource extends BlinkEventTarget {
+  static final instance = new BlinkEventSource();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), [__arg_0, __arg_1]);
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  onopen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onopen");
+
+  onopen_Setter_(mthis, __arg_0) => mthis["onopen"] = __arg_0;
+
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+
+  withCredentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "withCredentials");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+}
+
+class BlinkEventTarget {
+  static final instance = new BlinkEventTarget();
+
+  addEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", []);
+
+  addEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0]);
+
+  addEventListener_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0, __arg_1]);
+
+  addEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0, __arg_1, __arg_2]);
+
+  dispatchEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "dispatchEvent", []);
+
+  dispatchEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "dispatchEvent", [__arg_0]);
+
+  removeEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", []);
+
+  removeEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0]);
+
+  removeEventListener_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0, __arg_1]);
+
+  removeEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0, __arg_1, __arg_2]);
+
+}
+
+class BlinkExtendableEvent extends BlinkEvent {
+  static final instance = new BlinkExtendableEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ExtendableEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ExtendableEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ExtendableEvent"), [__arg_0, __arg_1]);
+
+  waitUntil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "waitUntil", []);
+
+  waitUntil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "waitUntil", [__arg_0]);
+
+}
+
+class BlinkFederatedCredential extends BlinkCredential {
+  static final instance = new BlinkFederatedCredential();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FederatedCredential"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FederatedCredential"), [__arg_0]);
+
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+
+  provider_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "provider");
+
+}
+
+class BlinkFetchEvent extends BlinkExtendableEvent {
+  static final instance = new BlinkFetchEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FetchEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FetchEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FetchEvent"), [__arg_0, __arg_1]);
+
+  isReload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isReload");
+
+  request_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "request");
+
+  respondWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", []);
+
+  respondWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", [__arg_0]);
+
+}
+
+class BlinkFile extends BlinkBlob {
+  static final instance = new BlinkFile();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0, __arg_1]);
+
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0, __arg_1, __arg_2]);
+
+  lastModified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModified");
+
+  lastModifiedDate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModifiedDate");
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  webkitRelativePath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitRelativePath");
+
+}
+
+class BlinkFileCallback {
+  static final instance = new BlinkFileCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkFileEntry extends BlinkEntry {
+  static final instance = new BlinkFileEntry();
+
+  createWriter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", []);
+
+  createWriter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", [__arg_0]);
+
+  createWriter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", [__arg_0, __arg_1]);
+
+  file_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "file", []);
+
+  file_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "file", [__arg_0]);
+
+  file_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "file", [__arg_0, __arg_1]);
+
+}
+
+class BlinkFileEntrySync extends BlinkEntrySync {
+  static final instance = new BlinkFileEntrySync();
+
+  createWriter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", []);
+
+  file_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "file", []);
+
+}
+
+class BlinkFileError extends BlinkDOMError {
+  static final instance = new BlinkFileError();
+
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+
+}
+
+class BlinkFileList {
+  static final instance = new BlinkFileList();
+
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
+}
+
+class BlinkFileReader extends BlinkEventTarget {
+  static final instance = new BlinkFileReader();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FileReader"), []);
+
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+
+  onloadend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadend");
+
+  onloadend_Setter_(mthis, __arg_0) => mthis["onloadend"] = __arg_0;
+
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+
+  readAsArrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", []);
+
+  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", [__arg_0]);
+
+  readAsBinaryString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", []);
+
+  readAsBinaryString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", [__arg_0]);
+
+  readAsDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", []);
+
+  readAsDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", [__arg_0]);
+
+  readAsText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", []);
+
+  readAsText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0]);
+
+  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0, __arg_1]);
+
+}
+
+class BlinkFileReaderSync {
+  static final instance = new BlinkFileReaderSync();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FileReaderSync"), []);
+
+  readAsArrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", []);
+
+  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", [__arg_0]);
+
+  readAsBinaryString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", []);
+
+  readAsBinaryString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", [__arg_0]);
+
+  readAsDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", []);
+
+  readAsDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", [__arg_0]);
+
+  readAsText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", []);
+
+  readAsText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0]);
+
+  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0, __arg_1]);
+
+}
+
+class BlinkFileSystemCallback {
+  static final instance = new BlinkFileSystemCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkFileWriter extends BlinkEventTarget {
+  static final instance = new BlinkFileWriter();
+
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+
+  onwrite_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwrite");
+
+  onwrite_Setter_(mthis, __arg_0) => mthis["onwrite"] = __arg_0;
+
+  onwriteend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwriteend");
+
+  onwriteend_Setter_(mthis, __arg_0) => mthis["onwriteend"] = __arg_0;
+
+  onwritestart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwritestart");
+
+  onwritestart_Setter_(mthis, __arg_0) => mthis["onwritestart"] = __arg_0;
+
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+
+  seek_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "seek", []);
+
+  seek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "seek", [__arg_0]);
+
+  truncate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "truncate", []);
+
+  truncate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "truncate", [__arg_0]);
+
+  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
+
+  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
+
+}
+
+class BlinkFileWriterCallback {
+  static final instance = new BlinkFileWriterCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkFileWriterSync {
+  static final instance = new BlinkFileWriterSync();
+
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+
+  seek_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "seek", []);
+
+  seek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "seek", [__arg_0]);
+
+  truncate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "truncate", []);
+
+  truncate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "truncate", [__arg_0]);
+
+  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
+
+  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
+
+}
+
+class BlinkFloat32Array extends BlinkArrayBufferView {
+  static final instance = new BlinkFloat32Array();
+
+}
+
+class BlinkFloat64Array extends BlinkArrayBufferView {
+  static final instance = new BlinkFloat64Array();
+
+}
+
+class BlinkFocusEvent extends BlinkUIEvent {
+  static final instance = new BlinkFocusEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FocusEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FocusEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FocusEvent"), [__arg_0, __arg_1]);
+
+  relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedTarget");
+
+}
+
+class BlinkFontFace {
+  static final instance = new BlinkFontFace();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0, __arg_1]);
+
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0, __arg_1, __arg_2]);
+
+  family_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "family");
+
+  family_Setter_(mthis, __arg_0) => mthis["family"] = __arg_0;
+
+  featureSettings_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "featureSettings");
+
+  featureSettings_Setter_(mthis, __arg_0) => mthis["featureSettings"] = __arg_0;
+
+  loaded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loaded");
+
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+
+  stretch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stretch");
+
+  stretch_Setter_(mthis, __arg_0) => mthis["stretch"] = __arg_0;
+
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+
+  style_Setter_(mthis, __arg_0) => mthis["style"] = __arg_0;
+
+  unicodeRange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unicodeRange");
+
+  unicodeRange_Setter_(mthis, __arg_0) => mthis["unicodeRange"] = __arg_0;
+
+  variant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "variant");
+
+  variant_Setter_(mthis, __arg_0) => mthis["variant"] = __arg_0;
+
+  weight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "weight");
+
+  weight_Setter_(mthis, __arg_0) => mthis["weight"] = __arg_0;
+
+  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
+
+}
+
+class BlinkFontFaceSet extends BlinkEventTarget {
+  static final instance = new BlinkFontFaceSet();
+
+  onloading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloading");
+
+  onloading_Setter_(mthis, __arg_0) => mthis["onloading"] = __arg_0;
+
+  onloadingdone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadingdone");
+
+  onloadingdone_Setter_(mthis, __arg_0) => mthis["onloadingdone"] = __arg_0;
+
+  onloadingerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadingerror");
+
+  onloadingerror_Setter_(mthis, __arg_0) => mthis["onloadingerror"] = __arg_0;
+
+  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ready");
+
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+
+  check_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "check", []);
+
+  check_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "check", [__arg_0]);
+
+  check_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "check", [__arg_0, __arg_1]);
+
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+
+  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
+
+  forEach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "forEach", []);
+
+  forEach_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "forEach", [__arg_0]);
+
+  forEach_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "forEach", [__arg_0, __arg_1]);
+
+  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
+
+  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
+
+  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
+
+  load_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "load", [__arg_0]);
+
+  load_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "load", [__arg_0, __arg_1]);
+
+}
+
+class BlinkFontFaceSetForEachCallback {
+  static final instance = new BlinkFontFaceSetForEachCallback();
+
+  handleItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleItem", [__arg_0]);
+
+  handleItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleItem", [__arg_0, __arg_1]);
+
+  handleItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "handleItem", [__arg_0, __arg_1, __arg_2]);
+
+}
+
+class BlinkFontFaceSetLoadEvent extends BlinkEvent {
+  static final instance = new BlinkFontFaceSetLoadEvent();
+
+  fontfaces_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fontfaces");
+
+}
+
+class BlinkFormData {
+  static final instance = new BlinkFormData();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FormData"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FormData"), [__arg_0]);
+
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
+
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
+
+  append_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0, __arg_1]);
+
+  append_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0, __arg_1, __arg_2]);
+
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+
+  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
+
+  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
+
+  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
+
+  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAll", []);
+
+  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0]);
+
+  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
+
+  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
+
+  set_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "set", []);
+
+  set_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "set", [__arg_0]);
+
+  set_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "set", [__arg_0, __arg_1]);
+
+  set_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "set", [__arg_0, __arg_1, __arg_2]);
+
+}
+
+class BlinkFrameRequestCallback {
+  static final instance = new BlinkFrameRequestCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkGainNode extends BlinkAudioNode {
+  static final instance = new BlinkGainNode();
+
+  gain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gain");
+
+}
+
+class BlinkGamepad {
+  static final instance = new BlinkGamepad();
+
+  axes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "axes");
+
+  buttons_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buttons");
+
+  connected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connected");
+
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+
+  index_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "index");
+
+  mapping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mapping");
+
+  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
+
+}
+
+class BlinkGamepadButton {
+  static final instance = new BlinkGamepadButton();
+
+  pressed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pressed");
+
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+
+}
+
+class BlinkGamepadEvent extends BlinkEvent {
+  static final instance = new BlinkGamepadEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "GamepadEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "GamepadEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "GamepadEvent"), [__arg_0, __arg_1]);
+
+  gamepad_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gamepad");
+
+}
+
+class BlinkGamepadList {
+  static final instance = new BlinkGamepadList();
+
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
+}
+
+class BlinkGeofencing {
+  static final instance = new BlinkGeofencing();
+
+  getRegisteredRegions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegisteredRegions", []);
+
+  registerRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "registerRegion", []);
+
+  registerRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "registerRegion", [__arg_0]);
+
+  unregisterRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregisterRegion", []);
+
+  unregisterRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "unregisterRegion", [__arg_0]);
+
+}
+
+class BlinkGeofencingEvent extends BlinkEvent {
+  static final instance = new BlinkGeofencingEvent();
+
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+
+  region_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "region");
+
+}
+
+class BlinkGeofencingRegion {
+  static final instance = new BlinkGeofencingRegion();
+
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+
+}
+
+class BlinkGeolocation {
+  static final instance = new BlinkGeolocation();
+
+  clearWatch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearWatch", []);
+
+  clearWatch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearWatch", [__arg_0]);
+
+  getCurrentPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", []);
+
+  getCurrentPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0]);
+
+  getCurrentPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0, __arg_1]);
+
+  getCurrentPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0, __arg_1, __arg_2]);
+
+  watchPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", []);
+
+  watchPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0]);
+
+  watchPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0, __arg_1]);
+
+  watchPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0, __arg_1, __arg_2]);
+
+}
+
+class BlinkGeoposition {
+  static final instance = new BlinkGeoposition();
+
+  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coords");
+
+  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
+
+}
+
+class BlinkGlobalEventHandlers {
+  static final instance = new BlinkGlobalEventHandlers();
+
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+
+  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
+
+  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
+
+  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocompleteerror");
+
+  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
+
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+
+  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncancel");
+
+  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
+
+  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplay");
+
+  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
+
+  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplaythrough");
+
+  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
+
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+
+  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+
+  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontextmenu");
+
+  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
+
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+
+  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+
+  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
+
+  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
+
+  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
+
+  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
+
+  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragend");
+
+  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
+
+  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragenter");
+
+  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
+
+  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragleave");
+
+  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
+
+  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragover");
+
+  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
+
+  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragstart");
+
+  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
+
+  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrop");
+
+  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
+
+  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondurationchange");
+
+  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
+
+  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onemptied");
+
+  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
+
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+
+  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
+
+  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
+
+  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninvalid");
+
+  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
+
+  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeydown");
+
+  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
+
+  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeypress");
+
+  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
+
+  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeyup");
+
+  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
+
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+
+  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadeddata");
+
+  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
+
+  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadedmetadata");
+
+  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
+
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+
+  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
+
+  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
+
+  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseenter");
+
+  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
+
+  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseleave");
+
+  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
+
+  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousemove");
+
+  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
+
+  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseout");
+
+  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
+
+  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseover");
+
+  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
+
+  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseup");
+
+  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
+
+  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousewheel");
+
+  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
+
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+
+  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+
+  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplay");
+
+  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
+
+  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplaying");
+
+  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
+
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+
+  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+
+  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+
+  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+
+  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+
+  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+
+  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+
+  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+
+  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+
+  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onratechange");
+
+  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
+
+  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
+
+  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
+
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+
+  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
+
+  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
+
+  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeking");
+
+  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
+
+  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselect");
+
+  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
+
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+
+  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+
+  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstalled");
+
+  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
+
+  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
+
+  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
+
+  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuspend");
+
+  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
+
+  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeupdate");
+
+  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
+
+  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontoggle");
+
+  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
+
+  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
+
+  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
+
+  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwaiting");
+
+  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
+
+}
+
+class BlinkHMDVRDevice extends BlinkVRDevice {
+  static final instance = new BlinkHMDVRDevice();
+
+  getEyeParameters_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEyeParameters", []);
+
+  getEyeParameters_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEyeParameters", [__arg_0]);
+
+  setFieldOfView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setFieldOfView", []);
+
+  setFieldOfView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setFieldOfView", [__arg_0]);
+
+  setFieldOfView_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setFieldOfView", [__arg_0, __arg_1]);
+
+}
+
+class BlinkHTMLAllCollection {
+  static final instance = new BlinkHTMLAllCollection();
+
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+
+}
+
+class BlinkHTMLAnchorElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLAnchorElement();
+
+  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charset");
+
+  charset_Setter_(mthis, __arg_0) => mthis["charset"] = __arg_0;
+
+  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coords");
+
+  coords_Setter_(mthis, __arg_0) => mthis["coords"] = __arg_0;
+
+  download_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "download");
+
+  download_Setter_(mthis, __arg_0) => mthis["download"] = __arg_0;
+
+  hreflang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hreflang");
+
+  hreflang_Setter_(mthis, __arg_0) => mthis["hreflang"] = __arg_0;
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+
+  ping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ping");
+
+  ping_Setter_(mthis, __arg_0) => mthis["ping"] = __arg_0;
+
+  rel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rel");
+
+  rel_Setter_(mthis, __arg_0) => mthis["rel"] = __arg_0;
+
+  rev_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rev");
+
+  rev_Setter_(mthis, __arg_0) => mthis["rev"] = __arg_0;
+
+  shape_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shape");
+
+  shape_Setter_(mthis, __arg_0) => mthis["shape"] = __arg_0;
+
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+
+  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+
+  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
+
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+
+  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
+
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+
+  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
+
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+
+  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
+
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+
+  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
+
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+
+  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
+
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+
+  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
+
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+
+  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+
+  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
+
+  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
+
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+
+}
+
+class BlinkHTMLAppletElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLAppletElement();
+
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
+  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
+
+  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
+
+  archive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "archive");
+
+  archive_Setter_(mthis, __arg_0) => mthis["archive"] = __arg_0;
+
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+
+  code_Setter_(mthis, __arg_0) => mthis["code"] = __arg_0;
+
+  codeBase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "codeBase");
+
+  codeBase_Setter_(mthis, __arg_0) => mthis["codeBase"] = __arg_0;
+
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+
+  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hspace");
+
+  hspace_Setter_(mthis, __arg_0) => mthis["hspace"] = __arg_0;
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+
+  object_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "object");
+
+  object_Setter_(mthis, __arg_0) => mthis["object"] = __arg_0;
+
+  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vspace");
+
+  vspace_Setter_(mthis, __arg_0) => mthis["vspace"] = __arg_0;
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+
+}
+
+class BlinkHTMLAreaElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLAreaElement();
+
+  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
+
+  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
+
+  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coords");
+
+  coords_Setter_(mthis, __arg_0) => mthis["coords"] = __arg_0;
+
+  noHref_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noHref");
+
+  noHref_Setter_(mthis, __arg_0) => mthis["noHref"] = __arg_0;
+
+  ping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ping");
+
+  ping_Setter_(mthis, __arg_0) => mthis["ping"] = __arg_0;
+
+  shape_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shape");
+
+  shape_Setter_(mthis, __arg_0) => mthis["shape"] = __arg_0;
+
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+
+  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
+
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+
+  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
+
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+
+  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
+
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+
+  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
+
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+
+  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
+
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+
+  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
+
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+
+  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
+
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+
+  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+
+  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
+
+  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
+
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+
+}
+
+class BlinkHTMLAudioElement extends BlinkHTMLMediaElement {
+  static final instance = new BlinkHTMLAudioElement();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Audio"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Audio"), [__arg_0]);
+
+}
+
+class BlinkHTMLBRElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLBRElement();
+
+  clear_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clear");
+
+  clear_Setter_(mthis, __arg_0) => mthis["clear"] = __arg_0;
+
+}
+
+class BlinkHTMLBaseElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLBaseElement();
+
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+
+}
+
+class BlinkHTMLBodyElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLBodyElement();
+
+  aLink_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "aLink");
+
+  aLink_Setter_(mthis, __arg_0) => mthis["aLink"] = __arg_0;
+
+  background_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "background");
+
+  background_Setter_(mthis, __arg_0) => mthis["background"] = __arg_0;
+
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+
+  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+
+  link_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "link");
+
+  link_Setter_(mthis, __arg_0) => mthis["link"] = __arg_0;
+
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+
+  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onorientationchange");
+
+  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
+
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+
+  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+
+  vLink_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vLink");
+
+  vLink_Setter_(mthis, __arg_0) => mthis["vLink"] = __arg_0;
+
+  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
+
+  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
+
+  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
+
+  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
+
+  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
+
+  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
+
+  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
+
+  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
+
+  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
+
+  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
+
+  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
+
+  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
+
+  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
+
+  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
+
+  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
+
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+
+  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+
+  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
+
+  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
+
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+
+  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+
+  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
+
+  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
+
+}
+
+class BlinkHTMLButtonElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLButtonElement();
+
+  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
+
+  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
+
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+
+  formAction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formAction");
+
+  formAction_Setter_(mthis, __arg_0) => mthis["formAction"] = __arg_0;
+
+  formEnctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formEnctype");
+
+  formEnctype_Setter_(mthis, __arg_0) => mthis["formEnctype"] = __arg_0;
+
+  formMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formMethod");
+
+  formMethod_Setter_(mthis, __arg_0) => mthis["formMethod"] = __arg_0;
+
+  formNoValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formNoValidate");
+
+  formNoValidate_Setter_(mthis, __arg_0) => mthis["formNoValidate"] = __arg_0;
+
+  formTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formTarget");
+
+  formTarget_Setter_(mthis, __arg_0) => mthis["formTarget"] = __arg_0;
+
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+
+}
+
+class BlinkHTMLCanvasElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLCanvasElement();
+
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
+  getContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContext", []);
+
+  getContext_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getContext", [__arg_0]);
+
+  getContext_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getContext", [__arg_0, __arg_1]);
+
+  toDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", []);
+
+  toDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", [__arg_0]);
+
+  toDataURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", [__arg_0, __arg_1]);
+
+}
+
+class BlinkHTMLCollection {
+  static final instance = new BlinkHTMLCollection();
+
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+
+}
+
+class BlinkHTMLContentElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLContentElement();
+
+  select_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "select");
+
+  select_Setter_(mthis, __arg_0) => mthis["select"] = __arg_0;
+
+  getDistributedNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDistributedNodes", []);
+
+}
+
+class BlinkHTMLDListElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDListElement();
+
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+
+  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+
+}
+
+class BlinkHTMLDataListElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDataListElement();
+
+  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "options");
+
+}
+
+class BlinkHTMLDetailsElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDetailsElement();
+
+  open_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "open");
+
+  open_Setter_(mthis, __arg_0) => mthis["open"] = __arg_0;
+
+}
+
+class BlinkHTMLDialogElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDialogElement();
+
+  open_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "open");
+
+  open_Setter_(mthis, __arg_0) => mthis["open"] = __arg_0;
+
+  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "returnValue");
+
+  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  close_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0]);
+
+  show_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "show", []);
+
+  showModal_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "showModal", []);
+
+}
+
+class BlinkHTMLDirectoryElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDirectoryElement();
+
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+
+  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+
+}
+
+class BlinkHTMLDivElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDivElement();
+
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
+}
+
+class BlinkHTMLDocument extends BlinkDocument {
+  static final instance = new BlinkHTMLDocument();
+
+  alinkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alinkColor");
+
+  alinkColor_Setter_(mthis, __arg_0) => mthis["alinkColor"] = __arg_0;
+
+  all_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "all");
+
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+
+  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+
+  fgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fgColor");
+
+  fgColor_Setter_(mthis, __arg_0) => mthis["fgColor"] = __arg_0;
+
+  linkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "linkColor");
+
+  linkColor_Setter_(mthis, __arg_0) => mthis["linkColor"] = __arg_0;
+
+  vlinkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vlinkColor");
+
+  vlinkColor_Setter_(mthis, __arg_0) => mthis["vlinkColor"] = __arg_0;
+
+  captureEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "captureEvents", []);
+
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+
+  releaseEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseEvents", []);
+
+}
+
+class BlinkHTMLElement extends BlinkElement {
+  static final instance = new BlinkHTMLElement();
+
+  accessKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accessKey");
+
+  accessKey_Setter_(mthis, __arg_0) => mthis["accessKey"] = __arg_0;
+
+  contentEditable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentEditable");
+
+  contentEditable_Setter_(mthis, __arg_0) => mthis["contentEditable"] = __arg_0;
+
+  contextMenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contextMenu");
+
+  contextMenu_Setter_(mthis, __arg_0) => mthis["contextMenu"] = __arg_0;
+
+  dataset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataset");
+
+  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dir");
+
+  dir_Setter_(mthis, __arg_0) => mthis["dir"] = __arg_0;
+
+  draggable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "draggable");
+
+  draggable_Setter_(mthis, __arg_0) => mthis["draggable"] = __arg_0;
+
+  hidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hidden");
+
+  hidden_Setter_(mthis, __arg_0) => mthis["hidden"] = __arg_0;
+
+  innerText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerText");
+
+  innerText_Setter_(mthis, __arg_0) => mthis["innerText"] = __arg_0;
+
+  isContentEditable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isContentEditable");
+
+  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lang");
+
+  lang_Setter_(mthis, __arg_0) => mthis["lang"] = __arg_0;
+
+  offsetHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetHeight");
+
+  offsetLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetLeft");
+
+  offsetParent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetParent");
+
+  offsetTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetTop");
+
+  offsetWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetWidth");
+
   outerText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerText");
 
   outerText_Setter_(mthis, __arg_0) => mthis["outerText"] = __arg_0;
@@ -5709,6 +7070,8 @@
 
   spellcheck_Setter_(mthis, __arg_0) => mthis["spellcheck"] = __arg_0;
 
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+
   tabIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tabIndex");
 
   tabIndex_Setter_(mthis, __arg_0) => mthis["tabIndex"] = __arg_0;
@@ -5725,29 +7088,301 @@
 
   webkitdropzone_Setter_(mthis, __arg_0) => mthis["webkitdropzone"] = __arg_0;
 
+  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blur", []);
+
+  click_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "click", []);
+
+  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
+
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+
+  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
+
+  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
+
+  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocompleteerror");
+
+  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
+
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+
+  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncancel");
+
+  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
+
+  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplay");
+
+  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
+
+  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplaythrough");
+
+  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
+
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+
+  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+
+  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontextmenu");
+
+  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
+
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+
+  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+
+  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
+
+  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
+
+  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
+
+  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
+
+  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragend");
+
+  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
+
+  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragenter");
+
+  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
+
+  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragleave");
+
+  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
+
+  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragover");
+
+  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
+
+  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragstart");
+
+  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
+
+  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrop");
+
+  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
+
+  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondurationchange");
+
+  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
+
+  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onemptied");
+
+  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
+
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+
+  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
+
+  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
+
+  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninvalid");
+
+  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
+
+  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeydown");
+
+  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
+
+  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeypress");
+
+  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
+
+  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeyup");
+
+  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
+
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+
+  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadeddata");
+
+  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
+
+  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadedmetadata");
+
+  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
+
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+
+  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
+
+  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
+
+  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseenter");
+
+  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
+
+  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseleave");
+
+  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
+
+  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousemove");
+
+  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
+
+  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseout");
+
+  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
+
+  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseover");
+
+  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
+
+  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseup");
+
+  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
+
+  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousewheel");
+
+  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
+
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+
+  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+
+  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplay");
+
+  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
+
+  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplaying");
+
+  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
+
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+
+  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+
+  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+
+  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+
+  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+
+  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+
+  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+
+  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+
+  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+
+  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onratechange");
+
+  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
+
+  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
+
+  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
+
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+
+  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
+
+  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
+
+  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeking");
+
+  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
+
+  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselect");
+
+  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
+
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+
+  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+
+  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstalled");
+
+  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
+
+  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
+
+  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
+
+  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuspend");
+
+  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
+
+  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeupdate");
+
+  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
+
+  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontoggle");
+
+  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
+
+  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
+
+  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
+
+  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwaiting");
+
+  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
+
 }
 
 class BlinkHTMLEmbedElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLEmbedElement();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
-
   align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
 
   align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
 
-  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
-
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
   height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
-
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
-
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
@@ -5764,13 +7399,17 @@
 
   width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+
+  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+
 }
 
 class BlinkHTMLFieldSetElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFieldSetElement();
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
-
   disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
 
   disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
@@ -5783,10 +7422,6 @@
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
-
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
-
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
@@ -5795,17 +7430,39 @@
 
   willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
 
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+
 }
 
 class BlinkHTMLFontElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFontElement();
 
+  color_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "color");
+
+  color_Setter_(mthis, __arg_0) => mthis["color"] = __arg_0;
+
+  face_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "face");
+
+  face_Setter_(mthis, __arg_0) => mthis["face"] = __arg_0;
+
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+
+  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
+
 }
 
 class BlinkHTMLFormControlsCollection extends BlinkHTMLCollection {
   static final instance = new BlinkHTMLFormControlsCollection();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
   namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
 
@@ -5816,8 +7473,6 @@
 class BlinkHTMLFormElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFormElement();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
   acceptCharset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "acceptCharset");
 
   acceptCharset_Setter_(mthis, __arg_0) => mthis["acceptCharset"] = __arg_0;
@@ -5830,8 +7485,6 @@
 
   autocomplete_Setter_(mthis, __arg_0) => mthis["autocomplete"] = __arg_0;
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
-
   elements_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elements");
 
   encoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "encoding");
@@ -5856,37 +7509,191 @@
 
   noValidate_Setter_(mthis, __arg_0) => mthis["noValidate"] = __arg_0;
 
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
   requestAutocomplete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestAutocomplete", []);
 
+  requestAutocomplete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestAutocomplete", [__arg_0]);
+
   reset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reset", []);
 
   submit_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "submit", []);
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
-
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
-
 }
 
 class BlinkHTMLFrameElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFrameElement();
 
+  contentDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentDocument");
+
+  contentWindow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentWindow");
+
+  frameBorder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frameBorder");
+
+  frameBorder_Setter_(mthis, __arg_0) => mthis["frameBorder"] = __arg_0;
+
+  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "longDesc");
+
+  longDesc_Setter_(mthis, __arg_0) => mthis["longDesc"] = __arg_0;
+
+  marginHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "marginHeight");
+
+  marginHeight_Setter_(mthis, __arg_0) => mthis["marginHeight"] = __arg_0;
+
+  marginWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "marginWidth");
+
+  marginWidth_Setter_(mthis, __arg_0) => mthis["marginWidth"] = __arg_0;
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+
+  noResize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noResize");
+
+  noResize_Setter_(mthis, __arg_0) => mthis["noResize"] = __arg_0;
+
+  scrolling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrolling");
+
+  scrolling_Setter_(mthis, __arg_0) => mthis["scrolling"] = __arg_0;
+
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+
+  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+
 }
 
 class BlinkHTMLFrameSetElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFrameSetElement();
 
+  cols_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cols");
+
+  cols_Setter_(mthis, __arg_0) => mthis["cols"] = __arg_0;
+
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+
+  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onorientationchange");
+
+  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
+
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+
+  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
+
+  rows_Setter_(mthis, __arg_0) => mthis["rows"] = __arg_0;
+
   $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
 
+  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
+
+  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
+
+  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
+
+  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
+
+  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
+
+  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
+
+  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
+
+  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
+
+  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
+
+  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
+
+  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
+
+  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
+
+  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
+
+  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
+
+  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
+
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+
+  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+
+  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
+
+  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
+
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+
+  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+
+  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
+
+  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
+
 }
 
 class BlinkHTMLHRElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLHRElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
   color_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "color");
 
   color_Setter_(mthis, __arg_0) => mthis["color"] = __arg_0;
 
+  noShade_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noShade");
+
+  noShade_Setter_(mthis, __arg_0) => mthis["noShade"] = __arg_0;
+
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+
+  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
 }
 
 class BlinkHTMLHeadElement extends BlinkHTMLElement {
@@ -5897,16 +7704,28 @@
 class BlinkHTMLHeadingElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLHeadingElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
 }
 
 class BlinkHTMLHtmlElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLHtmlElement();
 
+  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
+
+  version_Setter_(mthis, __arg_0) => mthis["version"] = __arg_0;
+
 }
 
 class BlinkHTMLIFrameElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLIFrameElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
   allowFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "allowFullscreen");
 
   allowFullscreen_Setter_(mthis, __arg_0) => mthis["allowFullscreen"] = __arg_0;
@@ -5915,15 +7734,25 @@
 
   contentWindow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentWindow");
 
-  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+  frameBorder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frameBorder");
+
+  frameBorder_Setter_(mthis, __arg_0) => mthis["frameBorder"] = __arg_0;
 
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
   height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
+  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "longDesc");
 
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
+  longDesc_Setter_(mthis, __arg_0) => mthis["longDesc"] = __arg_0;
+
+  marginHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "marginHeight");
+
+  marginHeight_Setter_(mthis, __arg_0) => mthis["marginHeight"] = __arg_0;
+
+  marginWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "marginWidth");
+
+  marginWidth_Setter_(mthis, __arg_0) => mthis["marginWidth"] = __arg_0;
 
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
@@ -5931,7 +7760,9 @@
 
   sandbox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sandbox");
 
-  sandbox_Setter_(mthis, __arg_0) => mthis["sandbox"] = __arg_0;
+  scrolling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrolling");
+
+  scrolling_Setter_(mthis, __arg_0) => mthis["scrolling"] = __arg_0;
 
   src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
 
@@ -5945,11 +7776,23 @@
 
   width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
+  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+
 }
 
 class BlinkHTMLImageElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLImageElement();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), [__arg_0, __arg_1]);
+
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
   alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
 
   alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
@@ -5960,12 +7803,6 @@
 
   complete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "complete");
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), [__arg_0]);
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), [__arg_0, __arg_1]);
-
   crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crossOrigin");
 
   crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
@@ -5976,18 +7813,26 @@
 
   height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
+  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hspace");
 
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
+  hspace_Setter_(mthis, __arg_0) => mthis["hspace"] = __arg_0;
 
   isMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isMap");
 
   isMap_Setter_(mthis, __arg_0) => mthis["isMap"] = __arg_0;
 
+  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "longDesc");
+
+  longDesc_Setter_(mthis, __arg_0) => mthis["longDesc"] = __arg_0;
+
   lowsrc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lowsrc");
 
   lowsrc_Setter_(mthis, __arg_0) => mthis["lowsrc"] = __arg_0;
 
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+
   naturalHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "naturalHeight");
 
   naturalWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "naturalWidth");
@@ -6008,6 +7853,10 @@
 
   useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __arg_0;
 
+  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vspace");
+
+  vspace_Setter_(mthis, __arg_0) => mthis["vspace"] = __arg_0;
+
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
   width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
@@ -6025,10 +7874,18 @@
 
   accept_Setter_(mthis, __arg_0) => mthis["accept"] = __arg_0;
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
   alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
 
   alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
 
+  autocapitalize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autocapitalize");
+
+  autocapitalize_Setter_(mthis, __arg_0) => mthis["autocapitalize"] = __arg_0;
+
   autocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autocomplete");
 
   autocomplete_Setter_(mthis, __arg_0) => mthis["autocomplete"] = __arg_0;
@@ -6041,8 +7898,6 @@
 
   capture_Setter_(mthis, __arg_0) => mthis["capture"] = __arg_0;
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
-
   checked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "checked");
 
   checked_Setter_(mthis, __arg_0) => mthis["checked"] = __arg_0;
@@ -6067,6 +7922,8 @@
 
   files_Setter_(mthis, __arg_0) => mthis["files"] = __arg_0;
 
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+
   formAction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formAction");
 
   formAction_Setter_(mthis, __arg_0) => mthis["formAction"] = __arg_0;
@@ -6087,8 +7944,6 @@
 
   formTarget_Setter_(mthis, __arg_0) => mthis["formTarget"] = __arg_0;
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
-
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
   height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
@@ -6109,18 +7964,22 @@
 
   list_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "list");
 
-  maxLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxLength");
-
-  maxLength_Setter_(mthis, __arg_0) => mthis["maxLength"] = __arg_0;
-
   max_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "max");
 
   max_Setter_(mthis, __arg_0) => mthis["max"] = __arg_0;
 
+  maxLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxLength");
+
+  maxLength_Setter_(mthis, __arg_0) => mthis["maxLength"] = __arg_0;
+
   min_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "min");
 
   min_Setter_(mthis, __arg_0) => mthis["min"] = __arg_0;
 
+  minLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minLength");
+
+  minLength_Setter_(mthis, __arg_0) => mthis["minLength"] = __arg_0;
+
   multiple_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "multiple");
 
   multiple_Setter_(mthis, __arg_0) => mthis["multiple"] = __arg_0;
@@ -6145,8 +8004,6 @@
 
   required_Setter_(mthis, __arg_0) => mthis["required"] = __arg_0;
 
-  select_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "select", []);
-
   selectionDirection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectionDirection");
 
   selectionDirection_Setter_(mthis, __arg_0) => mthis["selectionDirection"] = __arg_0;
@@ -6159,6 +8016,60 @@
 
   selectionStart_Setter_(mthis, __arg_0) => mthis["selectionStart"] = __arg_0;
 
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+
+  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
+
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+
+  step_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "step");
+
+  step_Setter_(mthis, __arg_0) => mthis["step"] = __arg_0;
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+
+  useMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "useMap");
+
+  useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __arg_0;
+
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+
+  valueAsDate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsDate");
+
+  valueAsDate_Setter_(mthis, __arg_0) => mthis["valueAsDate"] = __arg_0;
+
+  valueAsNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsNumber");
+
+  valueAsNumber_Setter_(mthis, __arg_0) => mthis["valueAsNumber"] = __arg_0;
+
+  webkitEntries_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitEntries");
+
+  webkitdirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitdirectory");
+
+  webkitdirectory_Setter_(mthis, __arg_0) => mthis["webkitdirectory"] = __arg_0;
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
+  select_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "select", []);
+
   setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
 
   setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
@@ -6181,14 +8092,6 @@
 
   setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", [__arg_0, __arg_1, __arg_2]);
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
-
-  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
-
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
-
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
-
   stepDown_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stepDown", []);
 
   stepDown_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stepDown", [__arg_0]);
@@ -6197,46 +8100,6 @@
 
   stepUp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stepUp", [__arg_0]);
 
-  step_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "step");
-
-  step_Setter_(mthis, __arg_0) => mthis["step"] = __arg_0;
-
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
-
-  useMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "useMap");
-
-  useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __arg_0;
-
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
-
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
-
-  valueAsDate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsDate");
-
-  valueAsDate_Setter_(mthis, __arg_0) => mthis["valueAsDate"] = __arg_0;
-
-  valueAsNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsNumber");
-
-  valueAsNumber_Setter_(mthis, __arg_0) => mthis["valueAsNumber"] = __arg_0;
-
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
-
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
-
-  webkitEntries_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitEntries");
-
-  webkitdirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitdirectory");
-
-  webkitdirectory_Setter_(mthis, __arg_0) => mthis["webkitdirectory"] = __arg_0;
-
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
-
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
-
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
-
 }
 
 class BlinkHTMLKeygenElement extends BlinkHTMLElement {
@@ -6250,8 +8113,6 @@
 
   challenge_Setter_(mthis, __arg_0) => mthis["challenge"] = __arg_0;
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
-
   disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
 
   disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
@@ -6268,10 +8129,6 @@
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
-
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
-
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
@@ -6280,6 +8137,14 @@
 
   willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
 
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+
 }
 
 class BlinkHTMLLIElement extends BlinkHTMLElement {
@@ -6311,6 +8176,10 @@
 class BlinkHTMLLegendElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLegendElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
   form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
 
 }
@@ -6318,6 +8187,10 @@
 class BlinkHTMLLinkElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLinkElement();
 
+  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charset");
+
+  charset_Setter_(mthis, __arg_0) => mthis["charset"] = __arg_0;
+
   crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crossOrigin");
 
   crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
@@ -6348,11 +8221,17 @@
 
   rel_Setter_(mthis, __arg_0) => mthis["rel"] = __arg_0;
 
+  rev_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rev");
+
+  rev_Setter_(mthis, __arg_0) => mthis["rev"] = __arg_0;
+
   sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sheet");
 
   sizes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sizes");
 
-  sizes_Setter_(mthis, __arg_0) => mthis["sizes"] = __arg_0;
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
 
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
@@ -6374,19 +8253,71 @@
 class BlinkHTMLMarqueeElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMarqueeElement();
 
+  behavior_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "behavior");
+
+  behavior_Setter_(mthis, __arg_0) => mthis["behavior"] = __arg_0;
+
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+
+  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+
+  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
+
+  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
+
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+
+  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hspace");
+
+  hspace_Setter_(mthis, __arg_0) => mthis["hspace"] = __arg_0;
+
+  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loop");
+
+  loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
+
+  scrollAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollAmount");
+
+  scrollAmount_Setter_(mthis, __arg_0) => mthis["scrollAmount"] = __arg_0;
+
+  scrollDelay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollDelay");
+
+  scrollDelay_Setter_(mthis, __arg_0) => mthis["scrollDelay"] = __arg_0;
+
+  trueSpeed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "trueSpeed");
+
+  trueSpeed_Setter_(mthis, __arg_0) => mthis["trueSpeed"] = __arg_0;
+
+  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vspace");
+
+  vspace_Setter_(mthis, __arg_0) => mthis["vspace"] = __arg_0;
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
+  attachedCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachedCallback", []);
+
+  attributeChangedCallback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attributeChangedCallback", [__arg_0]);
+
+  attributeChangedCallback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attributeChangedCallback", [__arg_0, __arg_1]);
+
+  attributeChangedCallback_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "attributeChangedCallback", [__arg_0, __arg_1, __arg_2]);
+
+  createdCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createdCallback", []);
+
+  detachedCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachedCallback", []);
+
+  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
+
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+
 }
 
 class BlinkHTMLMediaElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMediaElement();
 
-  addTextTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", []);
-
-  addTextTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0]);
-
-  addTextTrack_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0, __arg_1]);
-
-  addTextTrack_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0, __arg_1, __arg_2]);
-
   audioTracks_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "audioTracks");
 
   autoplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autoplay");
@@ -6395,12 +8326,6 @@
 
   buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffered");
 
-  canPlayType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", []);
-
-  canPlayType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", [__arg_0]);
-
-  canPlayType_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", [__arg_0, __arg_1]);
-
   controller_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "controller");
 
   controller_Setter_(mthis, __arg_0) => mthis["controller"] = __arg_0;
@@ -6433,12 +8358,6 @@
 
   error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
-
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
-
-  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
-
   loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loop");
 
   loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
@@ -6455,9 +8374,9 @@
 
   networkState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "networkState");
 
-  onneedkey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onneedkey");
+  onencrypted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onencrypted");
 
-  onneedkey_Setter_(mthis, __arg_0) => mthis["onneedkey"] = __arg_0;
+  onencrypted_Setter_(mthis, __arg_0) => mthis["onencrypted"] = __arg_0;
 
   onwebkitkeyadded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitkeyadded");
 
@@ -6475,12 +8394,8 @@
 
   onwebkitneedkey_Setter_(mthis, __arg_0) => mthis["onwebkitneedkey"] = __arg_0;
 
-  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
-
   paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "paused");
 
-  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
-
   playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
 
   playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
@@ -6497,9 +8412,11 @@
 
   seeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "seeking");
 
-  setMediaKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setMediaKeys", []);
+  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "session");
 
-  setMediaKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setMediaKeys", [__arg_0]);
+  session_Setter_(mthis, __arg_0) => mthis["session"] = __arg_0;
+
+  sinkId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sinkId");
 
   src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
 
@@ -6513,6 +8430,38 @@
 
   volume_Setter_(mthis, __arg_0) => mthis["volume"] = __arg_0;
 
+  webkitAudioDecodedByteCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitAudioDecodedByteCount");
+
+  webkitVideoDecodedByteCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitVideoDecodedByteCount");
+
+  addTextTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", []);
+
+  addTextTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0]);
+
+  addTextTrack_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0, __arg_1]);
+
+  addTextTrack_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0, __arg_1, __arg_2]);
+
+  canPlayType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", []);
+
+  canPlayType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", [__arg_0]);
+
+  canPlayType_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", [__arg_0, __arg_1]);
+
+  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
+
+  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
+
+  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
+
+  setMediaKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setMediaKeys", []);
+
+  setMediaKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setMediaKeys", [__arg_0]);
+
+  setSinkId_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setSinkId", []);
+
+  setSinkId_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setSinkId", [__arg_0]);
+
   webkitAddKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitAddKey", []);
 
   webkitAddKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitAddKey", [__arg_0]);
@@ -6523,8 +8472,6 @@
 
   webkitAddKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "webkitAddKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  webkitAudioDecodedByteCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitAudioDecodedByteCount");
-
   webkitCancelKeyRequest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelKeyRequest", []);
 
   webkitCancelKeyRequest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelKeyRequest", [__arg_0]);
@@ -6537,13 +8484,15 @@
 
   webkitGenerateKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitGenerateKeyRequest", [__arg_0, __arg_1]);
 
-  webkitVideoDecodedByteCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitVideoDecodedByteCount");
-
 }
 
 class BlinkHTMLMenuElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMenuElement();
 
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+
+  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+
   label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
 
   label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
@@ -6569,10 +8518,18 @@
 
   disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
+  icon_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "icon");
+
+  icon_Setter_(mthis, __arg_0) => mthis["icon"] = __arg_0;
+
   label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
 
   label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
 
+  radiogroup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radiogroup");
+
+  radiogroup_Setter_(mthis, __arg_0) => mthis["radiogroup"] = __arg_0;
+
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
@@ -6594,6 +8551,10 @@
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
+  scheme_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scheme");
+
+  scheme_Setter_(mthis, __arg_0) => mthis["scheme"] = __arg_0;
+
 }
 
 class BlinkHTMLMeterElement extends BlinkHTMLElement {
@@ -6643,6 +8604,10 @@
 class BlinkHTMLOListElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOListElement();
 
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+
+  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+
   reversed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reversed");
 
   reversed_Setter_(mthis, __arg_0) => mthis["reversed"] = __arg_0;
@@ -6660,41 +8625,57 @@
 class BlinkHTMLObjectElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLObjectElement();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  archive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "archive");
+
+  archive_Setter_(mthis, __arg_0) => mthis["archive"] = __arg_0;
+
+  border_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "border");
+
+  border_Setter_(mthis, __arg_0) => mthis["border"] = __arg_0;
 
   code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
 
   code_Setter_(mthis, __arg_0) => mthis["code"] = __arg_0;
 
+  codeBase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "codeBase");
+
+  codeBase_Setter_(mthis, __arg_0) => mthis["codeBase"] = __arg_0;
+
+  codeType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "codeType");
+
+  codeType_Setter_(mthis, __arg_0) => mthis["codeType"] = __arg_0;
+
   contentDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentDocument");
 
   data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
 
   data_Setter_(mthis, __arg_0) => mthis["data"] = __arg_0;
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  declare_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "declare");
 
-  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+  declare_Setter_(mthis, __arg_0) => mthis["declare"] = __arg_0;
+
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
 
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
   height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
+  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hspace");
 
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
+  hspace_Setter_(mthis, __arg_0) => mthis["hspace"] = __arg_0;
 
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  standby_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "standby");
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  standby_Setter_(mthis, __arg_0) => mthis["standby"] = __arg_0;
 
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
@@ -6708,12 +8689,30 @@
 
   validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
 
+  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vspace");
+
+  vspace_Setter_(mthis, __arg_0) => mthis["vspace"] = __arg_0;
+
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
   width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
   willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
 
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+
 }
 
 class BlinkHTMLOptGroupElement extends BlinkHTMLElement {
@@ -6762,6 +8761,10 @@
 
   selected_Setter_(mthis, __arg_0) => mthis["selected"] = __arg_0;
 
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+
+  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+
   value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
 
   value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
@@ -6771,17 +8774,39 @@
 class BlinkHTMLOptionsCollection extends BlinkHTMLCollection {
   static final instance = new BlinkHTMLOptionsCollection();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  length_Setter_(mthis, __arg_0) => mthis["length"] = __arg_0;
+
+  selectedIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedIndex");
+
+  selectedIndex_Setter_(mthis, __arg_0) => mthis["selectedIndex"] = __arg_0;
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+
+  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
+
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+
+  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
+
 }
 
 class BlinkHTMLOutputElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOutputElement();
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
-
   defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultValue");
 
   defaultValue_Setter_(mthis, __arg_0) => mthis["defaultValue"] = __arg_0;
@@ -6790,18 +8815,12 @@
 
   htmlFor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "htmlFor");
 
-  htmlFor_Setter_(mthis, __arg_0) => mthis["htmlFor"] = __arg_0;
-
   labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
 
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
-
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
-
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
@@ -6814,11 +8833,23 @@
 
   willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
 
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+
 }
 
 class BlinkHTMLParagraphElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLParagraphElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
 }
 
 class BlinkHTMLParamElement extends BlinkHTMLElement {
@@ -6828,10 +8859,18 @@
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+
   value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
 
   value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
+  valueType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueType");
+
+  valueType_Setter_(mthis, __arg_0) => mthis["valueType"] = __arg_0;
+
 }
 
 class BlinkHTMLPictureElement extends BlinkHTMLElement {
@@ -6842,6 +8881,10 @@
 class BlinkHTMLPreElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLPreElement();
 
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
 }
 
 class BlinkHTMLProgressElement extends BlinkHTMLElement {
@@ -6909,6 +8952,10 @@
 
   src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+
+  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
@@ -6918,32 +8965,16 @@
 class BlinkHTMLSelectElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLSelectElement();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
-
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
-
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
-
-  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
-
   autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
 
   autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
-
   disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
 
   disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
   form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
   labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
 
   length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
@@ -6958,9 +8989,7 @@
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
-
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "options");
 
   required_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "required");
 
@@ -6970,9 +8999,7 @@
 
   selectedIndex_Setter_(mthis, __arg_0) => mthis["selectedIndex"] = __arg_0;
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
-
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  selectedOptions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedOptions");
 
   size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
 
@@ -6990,6 +9017,30 @@
 
   willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
 
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+
+  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
+
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+
 }
 
 class BlinkHTMLShadowElement extends BlinkHTMLElement {
@@ -7002,10 +9053,6 @@
 class BlinkHTMLSourceElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLSourceElement();
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
-
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
-
   media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
 
   media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
@@ -7055,13 +9102,41 @@
 class BlinkHTMLTableCaptionElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableCaptionElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
 }
 
 class BlinkHTMLTableCellElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableCellElement();
 
+  abbr_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "abbr");
+
+  abbr_Setter_(mthis, __arg_0) => mthis["abbr"] = __arg_0;
+
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
+  axis_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "axis");
+
+  axis_Setter_(mthis, __arg_0) => mthis["axis"] = __arg_0;
+
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+
+  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+
   cellIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cellIndex");
 
+  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ch");
+
+  ch_Setter_(mthis, __arg_0) => mthis["ch"] = __arg_0;
+
+  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chOff");
+
+  chOff_Setter_(mthis, __arg_0) => mthis["chOff"] = __arg_0;
+
   colSpan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "colSpan");
 
   colSpan_Setter_(mthis, __arg_0) => mthis["colSpan"] = __arg_0;
@@ -7070,24 +9145,72 @@
 
   headers_Setter_(mthis, __arg_0) => mthis["headers"] = __arg_0;
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+
+  noWrap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noWrap");
+
+  noWrap_Setter_(mthis, __arg_0) => mthis["noWrap"] = __arg_0;
+
   rowSpan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rowSpan");
 
   rowSpan_Setter_(mthis, __arg_0) => mthis["rowSpan"] = __arg_0;
 
+  scope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scope");
+
+  scope_Setter_(mthis, __arg_0) => mthis["scope"] = __arg_0;
+
+  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vAlign");
+
+  vAlign_Setter_(mthis, __arg_0) => mthis["vAlign"] = __arg_0;
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
 }
 
 class BlinkHTMLTableColElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableColElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
+  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ch");
+
+  ch_Setter_(mthis, __arg_0) => mthis["ch"] = __arg_0;
+
+  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chOff");
+
+  chOff_Setter_(mthis, __arg_0) => mthis["chOff"] = __arg_0;
+
   span_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "span");
 
   span_Setter_(mthis, __arg_0) => mthis["span"] = __arg_0;
 
+  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vAlign");
+
+  vAlign_Setter_(mthis, __arg_0) => mthis["vAlign"] = __arg_0;
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
 }
 
 class BlinkHTMLTableElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+
+  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+
   border_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "border");
 
   border_Setter_(mthis, __arg_0) => mthis["border"] = __arg_0;
@@ -7096,6 +9219,42 @@
 
   caption_Setter_(mthis, __arg_0) => mthis["caption"] = __arg_0;
 
+  cellPadding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cellPadding");
+
+  cellPadding_Setter_(mthis, __arg_0) => mthis["cellPadding"] = __arg_0;
+
+  cellSpacing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cellSpacing");
+
+  cellSpacing_Setter_(mthis, __arg_0) => mthis["cellSpacing"] = __arg_0;
+
+  frame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frame");
+
+  frame_Setter_(mthis, __arg_0) => mthis["frame"] = __arg_0;
+
+  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
+
+  rules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rules");
+
+  rules_Setter_(mthis, __arg_0) => mthis["rules"] = __arg_0;
+
+  summary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "summary");
+
+  summary_Setter_(mthis, __arg_0) => mthis["summary"] = __arg_0;
+
+  tBodies_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tBodies");
+
+  tFoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tFoot");
+
+  tFoot_Setter_(mthis, __arg_0) => mthis["tFoot"] = __arg_0;
+
+  tHead_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tHead");
+
+  tHead_Setter_(mthis, __arg_0) => mthis["tHead"] = __arg_0;
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
   createCaption_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createCaption", []);
 
   createTBody_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTBody", []);
@@ -7118,25 +9277,37 @@
 
   insertRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRow", [__arg_0]);
 
-  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
-
-  tBodies_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tBodies");
-
-  tFoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tFoot");
-
-  tFoot_Setter_(mthis, __arg_0) => mthis["tFoot"] = __arg_0;
-
-  tHead_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tHead");
-
-  tHead_Setter_(mthis, __arg_0) => mthis["tHead"] = __arg_0;
-
 }
 
 class BlinkHTMLTableRowElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableRowElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+
+  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+
   cells_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cells");
 
+  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ch");
+
+  ch_Setter_(mthis, __arg_0) => mthis["ch"] = __arg_0;
+
+  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chOff");
+
+  chOff_Setter_(mthis, __arg_0) => mthis["chOff"] = __arg_0;
+
+  rowIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rowIndex");
+
+  sectionRowIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sectionRowIndex");
+
+  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vAlign");
+
+  vAlign_Setter_(mthis, __arg_0) => mthis["vAlign"] = __arg_0;
+
   deleteCell_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteCell", []);
 
   deleteCell_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteCell", [__arg_0]);
@@ -7145,15 +9316,29 @@
 
   insertCell_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertCell", [__arg_0]);
 
-  rowIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rowIndex");
-
-  sectionRowIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sectionRowIndex");
-
 }
 
 class BlinkHTMLTableSectionElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableSectionElement();
 
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+
+  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ch");
+
+  ch_Setter_(mthis, __arg_0) => mthis["ch"] = __arg_0;
+
+  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chOff");
+
+  chOff_Setter_(mthis, __arg_0) => mthis["chOff"] = __arg_0;
+
+  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
+
+  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vAlign");
+
+  vAlign_Setter_(mthis, __arg_0) => mthis["vAlign"] = __arg_0;
+
   deleteRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRow", []);
 
   deleteRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRow", [__arg_0]);
@@ -7162,8 +9347,6 @@
 
   insertRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRow", [__arg_0]);
 
-  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
-
 }
 
 class BlinkHTMLTemplateElement extends BlinkHTMLElement {
@@ -7176,12 +9359,14 @@
 class BlinkHTMLTextAreaElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTextAreaElement();
 
+  autocapitalize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autocapitalize");
+
+  autocapitalize_Setter_(mthis, __arg_0) => mthis["autocapitalize"] = __arg_0;
+
   autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
 
   autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
-
   cols_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cols");
 
   cols_Setter_(mthis, __arg_0) => mthis["cols"] = __arg_0;
@@ -7210,6 +9395,10 @@
 
   maxLength_Setter_(mthis, __arg_0) => mthis["maxLength"] = __arg_0;
 
+  minLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minLength");
+
+  minLength_Setter_(mthis, __arg_0) => mthis["minLength"] = __arg_0;
+
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
@@ -7230,8 +9419,6 @@
 
   rows_Setter_(mthis, __arg_0) => mthis["rows"] = __arg_0;
 
-  select_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "select", []);
-
   selectionDirection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectionDirection");
 
   selectionDirection_Setter_(mthis, __arg_0) => mthis["selectionDirection"] = __arg_0;
@@ -7244,6 +9431,30 @@
 
   selectionStart_Setter_(mthis, __arg_0) => mthis["selectionStart"] = __arg_0;
 
+  textLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textLength");
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+
+  wrap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wrap");
+
+  wrap_Setter_(mthis, __arg_0) => mthis["wrap"] = __arg_0;
+
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+
+  select_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "select", []);
+
   setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
 
   setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
@@ -7266,29 +9477,15 @@
 
   setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", [__arg_0, __arg_1, __arg_2]);
 
-  textLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textLength");
-
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
-
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
-
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
-
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
-
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
-
-  wrap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wrap");
-
-  wrap_Setter_(mthis, __arg_0) => mthis["wrap"] = __arg_0;
-
 }
 
 class BlinkHTMLTitleElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTitleElement();
 
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+
+  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+
 }
 
 class BlinkHTMLTrackElement extends BlinkHTMLElement {
@@ -7298,10 +9495,6 @@
 
   default_Setter_(mthis, __arg_0) => mthis["default"] = __arg_0;
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
-
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
-
   kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
 
   kind_Setter_(mthis, __arg_0) => mthis["kind"] = __arg_0;
@@ -7327,6 +9520,14 @@
 class BlinkHTMLUListElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLUListElement();
 
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+
+  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+
 }
 
 class BlinkHTMLUnknownElement extends BlinkHTMLElement {
@@ -7337,8 +9538,6 @@
 class BlinkHTMLVideoElement extends BlinkHTMLMediaElement {
   static final instance = new BlinkHTMLVideoElement();
 
-  getVideoPlaybackQuality_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVideoPlaybackQuality", []);
-
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
   height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
@@ -7357,6 +9556,14 @@
 
   webkitDroppedFrameCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitDroppedFrameCount");
 
+  webkitSupportsFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitSupportsFullscreen");
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+
+  getVideoPlaybackQuality_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVideoPlaybackQuality", []);
+
   webkitEnterFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitEnterFullScreen", []);
 
   webkitEnterFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitEnterFullscreen", []);
@@ -7365,24 +9572,20 @@
 
   webkitExitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitExitFullscreen", []);
 
-  webkitSupportsFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitSupportsFullscreen");
-
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
-
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
-
 }
 
 class BlinkHashChangeEvent extends BlinkEvent {
   static final instance = new BlinkHashChangeEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "HashChangeEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "HashChangeEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "HashChangeEvent"), [__arg_0, __arg_1]);
 
-  initHashChangeEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initHashChangeEvent", []);
+  newURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newURL");
 
-  initHashChangeEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initHashChangeEvent", [__arg_0]);
-
-  initHashChangeEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initHashChangeEvent", [__arg_0, __arg_1]);
+  oldURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oldURL");
 
   initHashChangeEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initHashChangeEvent", [__arg_0, __arg_1, __arg_2]);
 
@@ -7390,60 +9593,26 @@
 
   initHashChangeEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initHashChangeEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  newURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newURL");
-
-  oldURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oldURL");
-
 }
 
 class BlinkHeaders {
   static final instance = new BlinkHeaders();
 
-  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
-
-  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
-
-  append_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0, __arg_1]);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Headers"), []);
 
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Headers"), [__arg_0]);
 
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
-
-  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
-
-  forEach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "forEach", []);
-
-  forEach_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "forEach", [__arg_0]);
-
-  forEach_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "forEach", [__arg_0, __arg_1]);
-
-  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAll", []);
-
-  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0]);
-
-  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
-
-  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
-
-  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
-
-  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
-
-  set_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "set", []);
-
-  set_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "set", [__arg_0]);
-
-  set_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "set", [__arg_0, __arg_1]);
-
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
-
 }
 
 class BlinkHistory {
   static final instance = new BlinkHistory();
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "options");
+
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+
   back_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "back", []);
 
   forward_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "forward", []);
@@ -7452,17 +9621,13 @@
 
   go_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "go", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  pushState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pushState", []);
-
   pushState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pushState", [__arg_0]);
 
   pushState_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pushState", [__arg_0, __arg_1]);
 
   pushState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "pushState", [__arg_0, __arg_1, __arg_2]);
 
-  replaceState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceState", []);
+  pushState_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "pushState", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
   replaceState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceState", [__arg_0]);
 
@@ -7470,29 +9635,13 @@
 
   replaceState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "replaceState", [__arg_0, __arg_1, __arg_2]);
 
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+  replaceState_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "replaceState", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkIDBCursor {
   static final instance = new BlinkIDBCursor();
 
-  advance_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "advance", []);
-
-  advance_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "advance", [__arg_0]);
-
-  continuePrimaryKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", []);
-
-  continuePrimaryKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", [__arg_0]);
-
-  continuePrimaryKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", [__arg_0, __arg_1]);
-
-  continue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "continue", []);
-
-  continue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "continue", [__arg_0]);
-
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
-
   direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
 
   key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "key");
@@ -7501,6 +9650,22 @@
 
   source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
 
+  advance_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "advance", []);
+
+  advance_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "advance", [__arg_0]);
+
+  continue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "continue", []);
+
+  continue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "continue", [__arg_0]);
+
+  continuePrimaryKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", []);
+
+  continuePrimaryKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", [__arg_0]);
+
+  continuePrimaryKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", [__arg_0, __arg_1]);
+
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+
   update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "update", []);
 
   update_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "update", [__arg_0]);
@@ -7517,18 +9682,6 @@
 class BlinkIDBDatabase extends BlinkEventTarget {
   static final instance = new BlinkIDBDatabase();
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
-  createObjectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", []);
-
-  createObjectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", [__arg_0]);
-
-  createObjectStore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", [__arg_0, __arg_1]);
-
-  deleteObjectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteObjectStore", []);
-
-  deleteObjectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteObjectStore", [__arg_0]);
-
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
   objectStoreNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "objectStoreNames");
@@ -7549,14 +9702,26 @@
 
   onversionchange_Setter_(mthis, __arg_0) => mthis["onversionchange"] = __arg_0;
 
+  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  createObjectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", []);
+
+  createObjectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", [__arg_0]);
+
+  createObjectStore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", [__arg_0, __arg_1]);
+
+  deleteObjectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteObjectStore", []);
+
+  deleteObjectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteObjectStore", [__arg_0]);
+
   transaction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "transaction", []);
 
   transaction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transaction", [__arg_0]);
 
   transaction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "transaction", [__arg_0, __arg_1]);
 
-  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
-
 }
 
 class BlinkIDBFactory {
@@ -7585,18 +9750,6 @@
 class BlinkIDBIndex {
   static final instance = new BlinkIDBIndex();
 
-  count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "count", []);
-
-  count_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "count", [__arg_0]);
-
-  getKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getKey", []);
-
-  getKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getKey", [__arg_0]);
-
-  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
-
-  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
-
   keyPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyPath");
 
   multiEntry_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "multiEntry");
@@ -7605,6 +9758,32 @@
 
   objectStore_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "objectStore");
 
+  unique_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unique");
+
+  count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "count", []);
+
+  count_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "count", [__arg_0]);
+
+  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
+
+  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
+
+  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAll", []);
+
+  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0]);
+
+  getAll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0, __arg_1]);
+
+  getAllKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", []);
+
+  getAllKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", [__arg_0]);
+
+  getAllKeys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", [__arg_0, __arg_1]);
+
+  getKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getKey", []);
+
+  getKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getKey", [__arg_0]);
+
   openCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", []);
 
   openCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", [__arg_0]);
@@ -7617,13 +9796,19 @@
 
   openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "openKeyCursor", [__arg_0, __arg_1]);
 
-  unique_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unique");
-
 }
 
 class BlinkIDBKeyRange {
   static final instance = new BlinkIDBKeyRange();
 
+  lower_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lower");
+
+  lowerOpen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lowerOpen");
+
+  upper_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upper");
+
+  upperOpen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upperOpen");
+
   bound_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "bound", []);
 
   bound_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "bound", [__arg_0]);
@@ -7640,10 +9825,6 @@
 
   lowerBound_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "lowerBound", [__arg_0, __arg_1]);
 
-  lowerOpen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lowerOpen");
-
-  lower_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lower");
-
   only_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "only", []);
 
   only_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "only", [__arg_0]);
@@ -7654,23 +9835,27 @@
 
   upperBound_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "upperBound", [__arg_0, __arg_1]);
 
-  upperOpen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upperOpen");
-
-  upper_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upper");
-
 }
 
 class BlinkIDBObjectStore {
   static final instance = new BlinkIDBObjectStore();
 
+  autoIncrement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autoIncrement");
+
+  indexNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indexNames");
+
+  keyPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyPath");
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  transaction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transaction");
+
   add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
 
   add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
 
   add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
 
-  autoIncrement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autoIncrement");
-
   clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
 
   count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "count", []);
@@ -7685,28 +9870,34 @@
 
   createIndex_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createIndex", [__arg_0, __arg_1, __arg_2]);
 
-  deleteIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteIndex", []);
-
-  deleteIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteIndex", [__arg_0]);
-
   delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
 
   delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
 
+  deleteIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteIndex", []);
+
+  deleteIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteIndex", [__arg_0]);
+
   get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
 
   get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
 
-  indexNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indexNames");
+  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAll", []);
+
+  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0]);
+
+  getAll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0, __arg_1]);
+
+  getAllKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", []);
+
+  getAllKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", [__arg_0]);
+
+  getAllKeys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", [__arg_0, __arg_1]);
 
   index_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "index", []);
 
   index_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "index", [__arg_0]);
 
-  keyPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyPath");
-
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
-
   openCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", []);
 
   openCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", [__arg_0]);
@@ -7725,8 +9916,6 @@
 
   put_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "put", [__arg_0, __arg_1]);
 
-  transaction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transaction");
-
 }
 
 class BlinkIDBOpenDBRequest extends BlinkIDBRequest {
@@ -7768,17 +9957,13 @@
 class BlinkIDBTransaction extends BlinkEventTarget {
   static final instance = new BlinkIDBTransaction();
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
-
   db_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "db");
 
   error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
 
   mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mode");
 
-  objectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "objectStore", []);
-
-  objectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "objectStore", [__arg_0]);
+  objectStoreNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "objectStoreNames");
 
   onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
 
@@ -7792,17 +9977,27 @@
 
   onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+
+  objectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "objectStore", []);
+
+  objectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "objectStore", [__arg_0]);
+
 }
 
 class BlinkIDBVersionChangeEvent extends BlinkEvent {
   static final instance = new BlinkIDBVersionChangeEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "IDBVersionChangeEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "IDBVersionChangeEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "IDBVersionChangeEvent"), [__arg_0, __arg_1]);
 
-  dataLossMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataLossMessage");
-
   dataLoss_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataLoss");
 
+  dataLossMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataLossMessage");
+
   newVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newVersion");
 
   oldVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oldVersion");
@@ -7840,213 +10035,37 @@
 class BlinkInjectedScriptHost {
   static final instance = new BlinkInjectedScriptHost();
 
-  callFunction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "callFunction", []);
-
-  callFunction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "callFunction", [__arg_0]);
-
-  callFunction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "callFunction", [__arg_0, __arg_1]);
-
-  callFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "callFunction", [__arg_0, __arg_1, __arg_2]);
-
-  clearConsoleMessages_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearConsoleMessages", []);
-
-  collectionEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collectionEntries", []);
-
-  collectionEntries_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "collectionEntries", [__arg_0]);
-
-  debugFunction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "debugFunction", []);
-
-  debugFunction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "debugFunction", [__arg_0]);
-
-  eval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "eval", []);
-
-  eval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "eval", [__arg_0]);
-
-  evaluateWithExceptionDetails_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "evaluateWithExceptionDetails", []);
-
-  evaluateWithExceptionDetails_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "evaluateWithExceptionDetails", [__arg_0]);
-
-  functionDetails_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "functionDetails", []);
-
-  functionDetails_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "functionDetails", [__arg_0]);
-
-  getEventListeners_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEventListeners", []);
-
-  getEventListeners_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEventListeners", [__arg_0]);
-
-  getInternalProperties_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getInternalProperties", []);
-
-  getInternalProperties_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getInternalProperties", [__arg_0]);
-
   inspect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "inspect", []);
 
   inspect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "inspect", [__arg_0]);
 
   inspect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "inspect", [__arg_0, __arg_1]);
 
-  inspectedObject_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "inspectedObject", []);
+}
 
-  inspectedObject_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "inspectedObject", [__arg_0]);
+class BlinkInputDevice {
+  static final instance = new BlinkInputDevice();
 
-  internalConstructorName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "internalConstructorName", []);
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "InputDevice"), []);
 
-  internalConstructorName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "internalConstructorName", [__arg_0]);
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "InputDevice"), [__arg_0]);
 
-  isHTMLAllCollection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isHTMLAllCollection", []);
-
-  isHTMLAllCollection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isHTMLAllCollection", [__arg_0]);
-
-  monitorFunction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "monitorFunction", []);
-
-  monitorFunction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "monitorFunction", [__arg_0]);
-
-  setFunctionVariableValue_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setFunctionVariableValue", [__arg_0, __arg_1]);
-
-  setFunctionVariableValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setFunctionVariableValue", [__arg_0, __arg_1, __arg_2]);
-
-  setFunctionVariableValue_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setFunctionVariableValue", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  setNonEnumProperty_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setNonEnumProperty", [__arg_0]);
-
-  setNonEnumProperty_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setNonEnumProperty", [__arg_0, __arg_1]);
-
-  setNonEnumProperty_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setNonEnumProperty", [__arg_0, __arg_1, __arg_2]);
-
-  subtype_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "subtype", []);
-
-  subtype_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "subtype", [__arg_0]);
-
-  suppressWarningsAndCallFunction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "suppressWarningsAndCallFunction", []);
-
-  suppressWarningsAndCallFunction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "suppressWarningsAndCallFunction", [__arg_0]);
-
-  suppressWarningsAndCallFunction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "suppressWarningsAndCallFunction", [__arg_0, __arg_1]);
-
-  suppressWarningsAndCallFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "suppressWarningsAndCallFunction", [__arg_0, __arg_1, __arg_2]);
-
-  undebugFunction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "undebugFunction", []);
-
-  undebugFunction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "undebugFunction", [__arg_0]);
-
-  unmonitorFunction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unmonitorFunction", []);
-
-  unmonitorFunction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "unmonitorFunction", [__arg_0]);
+  firesTouchEvents_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firesTouchEvents");
 
 }
 
-class BlinkInputMethodContext extends BlinkEventTarget {
-  static final instance = new BlinkInputMethodContext();
-
-  compositionEndOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compositionEndOffset");
-
-  compositionStartOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compositionStartOffset");
-
-  confirmComposition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "confirmComposition", []);
-
-  locale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "locale");
-
-  oncandidatewindowhide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncandidatewindowhide");
-
-  oncandidatewindowhide_Setter_(mthis, __arg_0) => mthis["oncandidatewindowhide"] = __arg_0;
-
-  oncandidatewindowshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncandidatewindowshow");
-
-  oncandidatewindowshow_Setter_(mthis, __arg_0) => mthis["oncandidatewindowshow"] = __arg_0;
-
-  oncandidatewindowupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncandidatewindowupdate");
-
-  oncandidatewindowupdate_Setter_(mthis, __arg_0) => mthis["oncandidatewindowupdate"] = __arg_0;
-
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+class BlinkInt16Array extends BlinkArrayBufferView {
+  static final instance = new BlinkInt16Array();
 
 }
 
-class BlinkInspectorFrontendHost {
-  static final instance = new BlinkInspectorFrontendHost();
-
-  copyText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyText", []);
-
-  copyText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyText", [__arg_0]);
-
-  getSelectionBackgroundColor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelectionBackgroundColor", []);
-
-  getSelectionForegroundColor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelectionForegroundColor", []);
-
-  isHostedMode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isHostedMode", []);
-
-  isUnderTest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isUnderTest", []);
-
-  isolatedFileSystem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isolatedFileSystem", []);
-
-  isolatedFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isolatedFileSystem", [__arg_0]);
-
-  isolatedFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "isolatedFileSystem", [__arg_0, __arg_1]);
-
-  platform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "platform", []);
-
-  port_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "port", []);
-
-  recordActionTaken_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "recordActionTaken", []);
-
-  recordActionTaken_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "recordActionTaken", [__arg_0]);
-
-  recordPanelShown_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "recordPanelShown", []);
-
-  recordPanelShown_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "recordPanelShown", [__arg_0]);
-
-  sendMessageToBackend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sendMessageToBackend", []);
-
-  sendMessageToBackend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sendMessageToBackend", [__arg_0]);
-
-  sendMessageToEmbedder_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sendMessageToEmbedder", []);
-
-  sendMessageToEmbedder_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sendMessageToEmbedder", [__arg_0]);
-
-  setInjectedScriptForOrigin_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setInjectedScriptForOrigin", []);
-
-  setInjectedScriptForOrigin_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setInjectedScriptForOrigin", [__arg_0]);
-
-  setInjectedScriptForOrigin_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setInjectedScriptForOrigin", [__arg_0, __arg_1]);
-
-  setZoomFactor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setZoomFactor", []);
-
-  setZoomFactor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setZoomFactor", [__arg_0]);
-
-  showContextMenuAtPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "showContextMenuAtPoint", [__arg_0]);
-
-  showContextMenuAtPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "showContextMenuAtPoint", [__arg_0, __arg_1]);
-
-  showContextMenuAtPoint_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "showContextMenuAtPoint", [__arg_0, __arg_1, __arg_2]);
-
-  showContextMenu_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "showContextMenu", []);
-
-  showContextMenu_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "showContextMenu", [__arg_0]);
-
-  showContextMenu_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "showContextMenu", [__arg_0, __arg_1]);
-
-  upgradeDraggedFileSystemPermissions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "upgradeDraggedFileSystemPermissions", []);
-
-  upgradeDraggedFileSystemPermissions_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "upgradeDraggedFileSystemPermissions", [__arg_0]);
-
-  zoomFactor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "zoomFactor", []);
+class BlinkInt32Array extends BlinkArrayBufferView {
+  static final instance = new BlinkInt32Array();
 
 }
 
-class BlinkInspectorOverlayHost {
-  static final instance = new BlinkInspectorOverlayHost();
-
-  resume_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resume", []);
-
-  stepOver_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stepOver", []);
-
-}
-
-class BlinkInstallEvent extends BlinkExtendableEvent {
-  static final instance = new BlinkInstallEvent();
-
-  reloadAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reloadAll", []);
-
-  replace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replace", []);
+class BlinkInt8Array extends BlinkArrayBufferView {
+  static final instance = new BlinkInt8Array();
 
 }
 
@@ -8059,85 +10078,26 @@
 
 }
 
-class BlinkJavaScriptCallFrame {
-  static final instance = new BlinkJavaScriptCallFrame();
-
-  caller_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "caller");
-
-  column_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "column");
-
-  evaluateWithExceptionDetails_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "evaluateWithExceptionDetails", []);
-
-  evaluateWithExceptionDetails_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "evaluateWithExceptionDetails", [__arg_0]);
-
-  functionName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "functionName");
-
-  isAtReturn_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isAtReturn");
-
-  line_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "line");
-
-  restart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "restart", []);
-
-  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "returnValue");
-
-  scopeChain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scopeChain");
-
-  scopeType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scopeType", []);
-
-  scopeType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scopeType", [__arg_0]);
-
-  setVariableValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setVariableValue", []);
-
-  setVariableValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setVariableValue", [__arg_0]);
-
-  setVariableValue_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setVariableValue", [__arg_0, __arg_1]);
-
-  setVariableValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setVariableValue", [__arg_0, __arg_1, __arg_2]);
-
-  sourceID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceID");
-
-  stepInPositions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stepInPositions");
-
-  thisObject_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "thisObject");
-
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-}
-
 class BlinkKeyboardEvent extends BlinkUIEvent {
   static final instance = new BlinkKeyboardEvent();
 
-  altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altKey");
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyboardEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyboardEvent"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyboardEvent"), [__arg_0, __arg_1]);
 
+  altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altKey");
+
+  charCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charCode");
+
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+
   ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ctrlKey");
 
-  getModifierState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getModifierState", []);
+  key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "key");
 
-  getModifierState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getModifierState", [__arg_0]);
-
-  initKeyboardEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", []);
-
-  initKeyboardEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0]);
-
-  initKeyboardEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
-
-  initKeyboardEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1]);
-
-  initKeyboardEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2]);
-
-  initKeyboardEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  initKeyboardEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  initKeyboardEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
-  initKeyboardEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
-
-  initKeyboardEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
-
-  initKeyboardEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  keyCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyCode");
 
   keyIdentifier_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyIdentifier");
 
@@ -8151,18 +10111,30 @@
 
   shiftKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shiftKey");
 
+  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "which");
+
+  getModifierState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getModifierState", []);
+
+  getModifierState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getModifierState", [__arg_0]);
+
+  initKeyboardEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  initKeyboardEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  initKeyboardEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
 }
 
-class BlinkLocalCredential extends BlinkCredential {
-  static final instance = new BlinkLocalCredential();
+class BlinkKeyframeEffect extends BlinkAnimationEffectReadOnly {
+  static final instance = new BlinkKeyframeEffect();
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "LocalCredential"), [__arg_0, __arg_1]);
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyframeEffect"), []);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "LocalCredential"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyframeEffect"), [__arg_0]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "LocalCredential"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyframeEffect"), [__arg_0, __arg_1]);
 
-  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyframeEffect"), [__arg_0, __arg_1, __arg_2]);
 
 }
 
@@ -8171,10 +10143,6 @@
 
   ancestorOrigins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ancestorOrigins");
 
-  assign_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "assign", []);
-
-  assign_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "assign", [__arg_0]);
-
   hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
 
   hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
@@ -8205,18 +10173,24 @@
 
   protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
 
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+
+  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+
+  assign_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "assign", []);
+
+  assign_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "assign", [__arg_0]);
+
   reload_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reload", []);
 
   replace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replace", []);
 
   replace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replace", [__arg_0]);
 
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
-
-  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
-
   toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
 
+  valueOf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "valueOf", []);
+
 }
 
 class BlinkMIDIAccess extends BlinkEventTarget {
@@ -8224,13 +10198,9 @@
 
   inputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputs");
 
-  onconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onconnect");
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
 
-  onconnect_Setter_(mthis, __arg_0) => mthis["onconnect"] = __arg_0;
-
-  ondisconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondisconnect");
-
-  ondisconnect_Setter_(mthis, __arg_0) => mthis["ondisconnect"] = __arg_0;
+  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
 
   outputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outputs");
 
@@ -8241,6 +10211,10 @@
 class BlinkMIDIConnectionEvent extends BlinkEvent {
   static final instance = new BlinkMIDIConnectionEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIConnectionEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIConnectionEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIConnectionEvent"), [__arg_0, __arg_1]);
 
   port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
@@ -8259,27 +10233,17 @@
 class BlinkMIDIInputMap {
   static final instance = new BlinkMIDIInputMap();
 
-  entries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "entries", []);
-
-  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
-
-  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
-
-  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
-
-  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
-
-  keys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "keys", []);
-
   size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
 
-  values_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "values", []);
-
 }
 
 class BlinkMIDIMessageEvent extends BlinkEvent {
   static final instance = new BlinkMIDIMessageEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIMessageEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIMessageEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIMessageEvent"), [__arg_0, __arg_1]);
 
   data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
@@ -8302,50 +10266,44 @@
 class BlinkMIDIOutputMap {
   static final instance = new BlinkMIDIOutputMap();
 
-  entries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "entries", []);
-
-  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
-
-  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
-
-  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
-
-  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
-
-  keys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "keys", []);
-
   size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
 
-  values_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "values", []);
-
 }
 
 class BlinkMIDIPort extends BlinkEventTarget {
   static final instance = new BlinkMIDIPort();
 
+  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connection");
+
   id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
 
   manufacturer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "manufacturer");
 
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
-  ondisconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondisconnect");
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
 
-  ondisconnect_Setter_(mthis, __arg_0) => mthis["ondisconnect"] = __arg_0;
+  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
+
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
 
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
 
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+
 }
 
 class BlinkMediaController extends BlinkEventTarget {
   static final instance = new BlinkMediaController();
 
-  buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffered");
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaController"), []);
 
+  buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffered");
+
   currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
 
   currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
@@ -8360,12 +10318,8 @@
 
   muted_Setter_(mthis, __arg_0) => mthis["muted"] = __arg_0;
 
-  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
-
   paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "paused");
 
-  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
-
   playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
 
   playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
@@ -8376,12 +10330,16 @@
 
   seekable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "seekable");
 
-  unpause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unpause", []);
-
   volume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "volume");
 
   volume_Setter_(mthis, __arg_0) => mthis["volume"] = __arg_0;
 
+  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
+
+  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
+
+  unpause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unpause", []);
+
 }
 
 class BlinkMediaDeviceInfo {
@@ -8397,6 +10355,17 @@
 
 }
 
+class BlinkMediaDevices {
+  static final instance = new BlinkMediaDevices();
+
+  enumerateDevices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enumerateDevices", []);
+
+  getUserMedia_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUserMedia", []);
+
+  getUserMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUserMedia", [__arg_0]);
+
+}
+
 class BlinkMediaElementAudioSourceNode extends BlinkAudioSourceNode {
   static final instance = new BlinkMediaElementAudioSourceNode();
 
@@ -8404,6 +10373,21 @@
 
 }
 
+class BlinkMediaEncryptedEvent extends BlinkEvent {
+  static final instance = new BlinkMediaEncryptedEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaEncryptedEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaEncryptedEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaEncryptedEvent"), [__arg_0, __arg_1]);
+
+  initData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "initData");
+
+  initDataType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "initDataType");
+
+}
+
 class BlinkMediaError {
   static final instance = new BlinkMediaError();
 
@@ -8423,6 +10407,10 @@
 class BlinkMediaKeyEvent extends BlinkEvent {
   static final instance = new BlinkMediaKeyEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyEvent"), [__arg_0, __arg_1]);
 
   defaultURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultURL");
@@ -8444,22 +10432,15 @@
 class BlinkMediaKeyMessageEvent extends BlinkEvent {
   static final instance = new BlinkMediaKeyMessageEvent();
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyMessageEvent"), [__arg_0, __arg_1]);
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyMessageEvent"), []);
 
-  destinationURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "destinationURL");
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyMessageEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyMessageEvent"), [__arg_0, __arg_1]);
 
   message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
 
-}
-
-class BlinkMediaKeyNeededEvent extends BlinkEvent {
-  static final instance = new BlinkMediaKeyNeededEvent();
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyNeededEvent"), [__arg_0, __arg_1]);
-
-  contentType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentType");
-
-  initData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "initData");
+  messageType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "messageType");
 
 }
 
@@ -8468,7 +10449,13 @@
 
   closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
 
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+  expiration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "expiration");
+
+  keyStatuses_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyStatuses");
+
+  sessionId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sessionId");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
 
   generateRequest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateRequest", []);
 
@@ -8476,11 +10463,11 @@
 
   generateRequest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "generateRequest", [__arg_0, __arg_1]);
 
-  keySystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keySystem");
+  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
 
-  release_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "release", []);
+  load_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "load", [__arg_0]);
 
-  sessionId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sessionId");
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
 
   update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "update", []);
 
@@ -8488,6 +10475,24 @@
 
 }
 
+class BlinkMediaKeyStatusMap {
+  static final instance = new BlinkMediaKeyStatusMap();
+
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+
+}
+
+class BlinkMediaKeySystemAccess {
+  static final instance = new BlinkMediaKeySystemAccess();
+
+  keySystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keySystem");
+
+  createMediaKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createMediaKeys", []);
+
+  getConfiguration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getConfiguration", []);
+
+}
+
 class BlinkMediaKeys {
   static final instance = new BlinkMediaKeys();
 
@@ -8495,24 +10500,20 @@
 
   createSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSession", [__arg_0]);
 
-  create_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaKeys"), "create", []);
+  setServerCertificate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setServerCertificate", []);
 
-  create_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaKeys"), "create", [__arg_0]);
-
-  isTypeSupported_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaKeys"), "isTypeSupported", []);
-
-  isTypeSupported_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaKeys"), "isTypeSupported", [__arg_0]);
-
-  isTypeSupported_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaKeys"), "isTypeSupported", [__arg_0, __arg_1]);
-
-  keySystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keySystem");
+  setServerCertificate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setServerCertificate", [__arg_0]);
 
 }
 
 class BlinkMediaList {
   static final instance = new BlinkMediaList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  mediaText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaText");
+
+  mediaText_Setter_(mthis, __arg_0) => mthis["mediaText"] = __arg_0;
 
   appendMedium_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendMedium", []);
 
@@ -8526,21 +10527,11 @@
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  mediaText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaText");
-
-  mediaText_Setter_(mthis, __arg_0) => mthis["mediaText"] = __arg_0;
-
 }
 
 class BlinkMediaQueryList extends BlinkEventTarget {
   static final instance = new BlinkMediaQueryList();
 
-  addListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addListener", []);
-
-  addListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addListener", [__arg_0]);
-
   matches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "matches");
 
   media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
@@ -8549,6 +10540,10 @@
 
   onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
+  addListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addListener", []);
+
+  addListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addListener", [__arg_0]);
+
   removeListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeListener", []);
 
   removeListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeListener", [__arg_0]);
@@ -8558,6 +10553,10 @@
 class BlinkMediaQueryListEvent extends BlinkEvent {
   static final instance = new BlinkMediaQueryListEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaQueryListEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaQueryListEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaQueryListEvent"), [__arg_0, __arg_1]);
 
   matches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "matches");
@@ -8566,21 +10565,36 @@
 
 }
 
+class BlinkMediaSession {
+  static final instance = new BlinkMediaSession();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaSession"), []);
+
+  activate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activate", []);
+
+  deactivate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deactivate", []);
+
+}
+
 class BlinkMediaSource extends BlinkEventTarget {
   static final instance = new BlinkMediaSource();
 
-  activeSourceBuffers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeSourceBuffers");
-
-  addSourceBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addSourceBuffer", []);
-
-  addSourceBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addSourceBuffer", [__arg_0]);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaSource"), []);
 
+  activeSourceBuffers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeSourceBuffers");
+
   duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
 
   duration_Setter_(mthis, __arg_0) => mthis["duration"] = __arg_0;
 
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+
+  sourceBuffers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceBuffers");
+
+  addSourceBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addSourceBuffer", []);
+
+  addSourceBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addSourceBuffer", [__arg_0]);
+
   endOfStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endOfStream", []);
 
   endOfStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endOfStream", [__arg_0]);
@@ -8589,31 +10603,53 @@
 
   isTypeSupported_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaSource"), "isTypeSupported", [__arg_0]);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
-
   removeSourceBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeSourceBuffer", []);
 
   removeSourceBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeSourceBuffer", [__arg_0]);
 
-  sourceBuffers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceBuffers");
-
 }
 
 class BlinkMediaStream extends BlinkEventTarget {
   static final instance = new BlinkMediaStream();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStream"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStream"), [__arg_0]);
+
+  active_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "active");
+
+  ended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ended");
+
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+
+  onactive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onactive");
+
+  onactive_Setter_(mthis, __arg_0) => mthis["onactive"] = __arg_0;
+
+  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
+
+  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
+
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+
+  oninactive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninactive");
+
+  oninactive_Setter_(mthis, __arg_0) => mthis["oninactive"] = __arg_0;
+
+  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovetrack");
+
+  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
+
   addTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addTrack", []);
 
   addTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addTrack", [__arg_0]);
 
   clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStream"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStream"), [__arg_0]);
-
-  ended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ended");
-
   getAudioTracks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAudioTracks", []);
 
   getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
@@ -8624,22 +10660,6 @@
 
   getVideoTracks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVideoTracks", []);
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
-
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
-
-  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
-
-  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
-
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
-
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
-
-  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovetrack");
-
-  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
-
   removeTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeTrack", []);
 
   removeTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeTrack", [__arg_0]);
@@ -8665,6 +10685,10 @@
 class BlinkMediaStreamEvent extends BlinkEvent {
   static final instance = new BlinkMediaStreamEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamEvent"), [__arg_0, __arg_1]);
 
   stream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stream");
@@ -8674,16 +10698,10 @@
 class BlinkMediaStreamTrack extends BlinkEventTarget {
   static final instance = new BlinkMediaStreamTrack();
 
-  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
-
   enabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "enabled");
 
   enabled_Setter_(mthis, __arg_0) => mthis["enabled"] = __arg_0;
 
-  getSources_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamTrack"), "getSources", []);
-
-  getSources_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamTrack"), "getSources", [__arg_0]);
-
   id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
 
   kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
@@ -8706,6 +10724,12 @@
 
   readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
 
+  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
+
+  getSources_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamTrack"), "getSources", []);
+
+  getSources_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamTrack"), "getSources", [__arg_0]);
+
   stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
 
 }
@@ -8717,6 +10741,15 @@
 
 }
 
+class BlinkMediaStreamTrackSourcesCallback {
+  static final instance = new BlinkMediaStreamTrackSourcesCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkMemoryInfo {
   static final instance = new BlinkMemoryInfo();
 
@@ -8731,8 +10764,6 @@
 class BlinkMessageChannel {
   static final instance = new BlinkMessageChannel();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MessageChannel"), []);
-
   port1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port1");
 
   port2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port2");
@@ -8742,21 +10773,21 @@
 class BlinkMessageEvent extends BlinkEvent {
   static final instance = new BlinkMessageEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MessageEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MessageEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MessageEvent"), [__arg_0, __arg_1]);
 
   data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
 
-  initMessageEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", []);
+  lastEventId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastEventId");
 
-  initMessageEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0]);
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
 
-  initMessageEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1]);
+  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ports");
 
-  initMessageEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1, __arg_2]);
-
-  initMessageEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  initMessageEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
 
   initMessageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
@@ -8764,23 +10795,17 @@
 
   initMessageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  lastEventId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastEventId");
-
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
-
-  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
-
 }
 
 class BlinkMessagePort extends BlinkEventTarget {
   static final instance = new BlinkMessagePort();
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
   onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
 
   onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
   postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
 
   postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
@@ -8800,6 +10825,15 @@
 
 }
 
+class BlinkMetadataCallback {
+  static final instance = new BlinkMetadataCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkMimeType {
   static final instance = new BlinkMimeType();
 
@@ -8816,14 +10850,12 @@
 class BlinkMimeTypeArray {
   static final instance = new BlinkMimeTypeArray();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
   namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
 
   namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
@@ -8833,53 +10865,31 @@
 class BlinkMouseEvent extends BlinkUIEvent {
   static final instance = new BlinkMouseEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MouseEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MouseEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MouseEvent"), [__arg_0, __arg_1]);
+
   altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altKey");
 
   button_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "button");
 
+  buttons_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buttons");
+
   clientX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientX");
 
   clientY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientY");
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MouseEvent"), [__arg_0, __arg_1]);
-
   ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ctrlKey");
 
   dataTransfer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataTransfer");
 
   fromElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fromElement");
 
-  initMouseEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", []);
+  layerX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "layerX");
 
-  initMouseEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0]);
-
-  initMouseEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
-
-  initMouseEvent_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
-
-  initMouseEvent_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11]);
-
-  initMouseEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12]);
-
-  initMouseEvent_Callback_14_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13]);
-
-  initMouseEvent_Callback_15_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14]);
-
-  initMouseEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1]);
-
-  initMouseEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2]);
-
-  initMouseEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  initMouseEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  initMouseEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
-  initMouseEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
-
-  initMouseEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
-
-  initMouseEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  layerY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "layerY");
 
   metaKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "metaKey");
 
@@ -8891,6 +10901,10 @@
 
   offsetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetY");
 
+  pageX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageX");
+
+  pageY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageY");
+
   region_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "region");
 
   relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedTarget");
@@ -8907,6 +10921,29 @@
 
   webkitMovementY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitMovementY");
 
+  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "which");
+
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+
+  initMouseEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12]);
+
+  initMouseEvent_Callback_14_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13]);
+
+  initMouseEvent_Callback_15_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14]);
+
+}
+
+class BlinkMutationCallback {
+  static final instance = new BlinkMutationCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0, __arg_1]);
+
 }
 
 class BlinkMutationEvent extends BlinkEvent {
@@ -8916,17 +10953,11 @@
 
   attrName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "attrName");
 
-  initMutationEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", []);
+  newValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newValue");
 
-  initMutationEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0]);
+  prevValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "prevValue");
 
-  initMutationEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1]);
-
-  initMutationEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1, __arg_2]);
-
-  initMutationEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  initMutationEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  relatedNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedNode");
 
   initMutationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
@@ -8934,12 +10965,6 @@
 
   initMutationEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  newValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newValue");
-
-  prevValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "prevValue");
-
-  relatedNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedNode");
-
 }
 
 class BlinkMutationObserver {
@@ -8987,7 +11012,11 @@
 class BlinkNamedNodeMap {
   static final instance = new BlinkNamedNodeMap();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  getNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItem", []);
+
+  getNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItem", [__arg_0]);
 
   getNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItemNS", []);
 
@@ -8995,15 +11024,13 @@
 
   getNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItemNS", [__arg_0, __arg_1]);
 
-  getNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItem", []);
-
-  getNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItem", [__arg_0]);
-
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  removeNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItem", []);
+
+  removeNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItem", [__arg_0]);
 
   removeNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItemNS", []);
 
@@ -9011,50 +11038,62 @@
 
   removeNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItemNS", [__arg_0, __arg_1]);
 
-  removeNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItem", []);
+  setNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItem", []);
 
-  removeNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItem", [__arg_0]);
+  setNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItem", [__arg_0]);
 
   setNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItemNS", []);
 
   setNamedItemNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItemNS", [__arg_0]);
 
-  setNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItem", []);
-
-  setNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItem", [__arg_0]);
-
 }
 
 class BlinkNavigator {
   static final instance = new BlinkNavigator();
 
-  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appCodeName");
-
-  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appName");
-
-  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appVersion");
+  bluetooth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bluetooth");
 
   connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connection");
 
-  cookieEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cookieEnabled");
-
   credentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "credentials");
 
-  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dartEnabled");
-
   doNotTrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "doNotTrack");
 
-  geofencing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "geofencing");
-
   geolocation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "geolocation");
 
+  maxTouchPoints_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxTouchPoints");
+
+  mediaDevices_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaDevices");
+
+  mimeTypes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mimeTypes");
+
+  permissions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "permissions");
+
+  plugins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "plugins");
+
+  presentation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "presentation");
+
+  productSub_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "productSub");
+
+  serviceWorker_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "serviceWorker");
+
+  services_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "services");
+
+  storageQuota_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "storageQuota");
+
+  vendor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendor");
+
+  vendorSub_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendorSub");
+
+  webkitPersistentStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitPersistentStorage");
+
+  webkitTemporaryStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitTemporaryStorage");
+
   getBattery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBattery", []);
 
   getGamepads_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getGamepads", []);
 
-  getStorageUpdates_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStorageUpdates", []);
-
-  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareConcurrency");
+  getVRDevices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVRDevices", []);
 
   isProtocolHandlerRegistered_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProtocolHandlerRegistered", []);
 
@@ -9064,71 +11103,116 @@
 
   javaEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "javaEnabled", []);
 
-  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
-
-  languages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "languages");
-
-  maxTouchPoints_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxTouchPoints");
-
-  mimeTypes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mimeTypes");
-
-  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onLine");
-
-  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
-
-  plugins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "plugins");
-
-  presentation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "presentation");
-
-  productSub_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "productSub");
-
-  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "product");
-
-  push_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "push");
-
   registerProtocolHandler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "registerProtocolHandler", [__arg_0]);
 
   registerProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "registerProtocolHandler", [__arg_0, __arg_1]);
 
   registerProtocolHandler_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "registerProtocolHandler", [__arg_0, __arg_1, __arg_2]);
 
+  requestMIDIAccess_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestMIDIAccess", []);
+
+  requestMIDIAccess_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestMIDIAccess", [__arg_0]);
+
+  requestMediaKeySystemAccess_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestMediaKeySystemAccess", []);
+
+  requestMediaKeySystemAccess_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestMediaKeySystemAccess", [__arg_0]);
+
+  requestMediaKeySystemAccess_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "requestMediaKeySystemAccess", [__arg_0, __arg_1]);
+
   sendBeacon_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sendBeacon", []);
 
   sendBeacon_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sendBeacon", [__arg_0]);
 
   sendBeacon_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sendBeacon", [__arg_0, __arg_1]);
 
-  serviceWorker_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "serviceWorker");
-
-  storageQuota_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "storageQuota");
-
   unregisterProtocolHandler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregisterProtocolHandler", []);
 
   unregisterProtocolHandler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "unregisterProtocolHandler", [__arg_0]);
 
   unregisterProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "unregisterProtocolHandler", [__arg_0, __arg_1]);
 
-  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userAgent");
-
-  vendorSub_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendorSub");
-
-  vendor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendor");
-
-  vibrate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vibrate", []);
-
-  vibrate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vibrate", [__arg_0]);
-
-  webkitGetGamepads_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetGamepads", []);
-
   webkitGetUserMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetUserMedia", [__arg_0]);
 
   webkitGetUserMedia_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetUserMedia", [__arg_0, __arg_1]);
 
   webkitGetUserMedia_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetUserMedia", [__arg_0, __arg_1, __arg_2]);
 
-  webkitPersistentStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitPersistentStorage");
+  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareConcurrency");
 
-  webkitTemporaryStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitTemporaryStorage");
+  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appCodeName");
+
+  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appName");
+
+  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appVersion");
+
+  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dartEnabled");
+
+  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
+
+  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "product");
+
+  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userAgent");
+
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+
+  languages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "languages");
+
+  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onLine");
+
+  cookieEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cookieEnabled");
+
+  getStorageUpdates_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStorageUpdates", []);
+
+}
+
+class BlinkNavigatorCPU {
+  static final instance = new BlinkNavigatorCPU();
+
+  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareConcurrency");
+
+}
+
+class BlinkNavigatorID {
+  static final instance = new BlinkNavigatorID();
+
+  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appCodeName");
+
+  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appName");
+
+  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appVersion");
+
+  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dartEnabled");
+
+  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
+
+  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "product");
+
+  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userAgent");
+
+}
+
+class BlinkNavigatorLanguage {
+  static final instance = new BlinkNavigatorLanguage();
+
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+
+  languages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "languages");
+
+}
+
+class BlinkNavigatorOnLine {
+  static final instance = new BlinkNavigatorOnLine();
+
+  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onLine");
+
+}
+
+class BlinkNavigatorStorageUtils {
+  static final instance = new BlinkNavigatorStorageUtils();
+
+  cookieEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cookieEnabled");
+
+  getStorageUpdates_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStorageUpdates", []);
 
 }
 
@@ -9143,6 +11227,24 @@
 
 }
 
+class BlinkNavigatorUserMediaErrorCallback {
+  static final instance = new BlinkNavigatorUserMediaErrorCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkNavigatorUserMediaSuccessCallback {
+  static final instance = new BlinkNavigatorUserMediaSuccessCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkNetworkInformation extends BlinkEventTarget {
   static final instance = new BlinkNetworkInformation();
 
@@ -9157,32 +11259,12 @@
 class BlinkNode extends BlinkEventTarget {
   static final instance = new BlinkNode();
 
-  appendChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendChild", []);
-
-  appendChild_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendChild", [__arg_0]);
-
   baseURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseURI");
 
   childNodes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childNodes");
 
-  cloneNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", []);
-
-  cloneNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", [__arg_0]);
-
-  contains_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "contains", []);
-
-  contains_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "contains", [__arg_0]);
-
   firstChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstChild");
 
-  hasChildNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasChildNodes", []);
-
-  insertBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", []);
-
-  insertBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", [__arg_0]);
-
-  insertBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", [__arg_0, __arg_1]);
-
   lastChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastChild");
 
   localName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localName");
@@ -9207,6 +11289,56 @@
 
   previousSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousSibling");
 
+  textContent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textContent");
+
+  textContent_Setter_(mthis, __arg_0) => mthis["textContent"] = __arg_0;
+
+  appendChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendChild", []);
+
+  appendChild_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendChild", [__arg_0]);
+
+  cloneNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", []);
+
+  cloneNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", [__arg_0]);
+
+  compareDocumentPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compareDocumentPosition", []);
+
+  compareDocumentPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compareDocumentPosition", [__arg_0]);
+
+  contains_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "contains", []);
+
+  contains_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "contains", [__arg_0]);
+
+  hasChildNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasChildNodes", []);
+
+  insertBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", []);
+
+  insertBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", [__arg_0]);
+
+  insertBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", [__arg_0, __arg_1]);
+
+  isDefaultNamespace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isDefaultNamespace", []);
+
+  isDefaultNamespace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isDefaultNamespace", [__arg_0]);
+
+  isEqualNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEqualNode", []);
+
+  isEqualNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEqualNode", [__arg_0]);
+
+  isSameNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSameNode", []);
+
+  isSameNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSameNode", [__arg_0]);
+
+  lookupNamespaceURI_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lookupNamespaceURI", []);
+
+  lookupNamespaceURI_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lookupNamespaceURI", [__arg_0]);
+
+  lookupPrefix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lookupPrefix", []);
+
+  lookupPrefix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lookupPrefix", [__arg_0]);
+
+  normalize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "normalize", []);
+
   removeChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeChild", []);
 
   removeChild_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeChild", [__arg_0]);
@@ -9217,62 +11349,80 @@
 
   replaceChild_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceChild", [__arg_0, __arg_1]);
 
-  textContent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textContent");
-
-  textContent_Setter_(mthis, __arg_0) => mthis["textContent"] = __arg_0;
-
 }
 
 class BlinkNodeFilter {
   static final instance = new BlinkNodeFilter();
 
+  acceptNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "acceptNode", []);
+
+  acceptNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "acceptNode", [__arg_0]);
+
 }
 
 class BlinkNodeIterator {
   static final instance = new BlinkNodeIterator();
 
-  detach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detach", []);
-
-  nextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "nextNode", []);
+  filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filter");
 
   pointerBeforeReferenceNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerBeforeReferenceNode");
 
-  previousNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "previousNode", []);
-
   referenceNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "referenceNode");
 
   root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "root");
 
   whatToShow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "whatToShow");
 
+  detach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detach", []);
+
+  nextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "nextNode", []);
+
+  previousNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "previousNode", []);
+
 }
 
 class BlinkNodeList {
   static final instance = new BlinkNodeList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+}
+
+class BlinkNonDocumentTypeChildNode {
+  static final instance = new BlinkNonDocumentTypeChildNode();
+
+  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextElementSibling");
+
+  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousElementSibling");
+
+}
+
+class BlinkNonElementParentNode {
+  static final instance = new BlinkNonElementParentNode();
+
+  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
+
+  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
 
 }
 
 class BlinkNotification extends BlinkEventTarget {
   static final instance = new BlinkNotification();
 
-  body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "body");
-
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Notification"), []);
 
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Notification"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Notification"), [__arg_0, __arg_1]);
 
+  body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "body");
+
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+
   dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dir");
 
   icon_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "icon");
@@ -9297,14 +11447,42 @@
 
   permission_Getter_() => Blink_JsNative_DomException.getProperty(Blink_JsNative_DomException.getProperty(js.context, "Notification"), "permission");
 
-  requestPermission_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Notification"), "requestPermission", []);
-
-  requestPermission_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Notification"), "requestPermission", [__arg_0]);
+  silent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "silent");
 
   tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tag");
 
   title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "title");
 
+  vibrate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vibrate");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  requestPermission_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Notification"), "requestPermission", []);
+
+  requestPermission_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Notification"), "requestPermission", [__arg_0]);
+
+}
+
+class BlinkNotificationEvent extends BlinkExtendableEvent {
+  static final instance = new BlinkNotificationEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "NotificationEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "NotificationEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "NotificationEvent"), [__arg_0, __arg_1]);
+
+  notification_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "notification");
+
+}
+
+class BlinkNotificationPermissionCallback {
+  static final instance = new BlinkNotificationPermissionCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
 }
 
 class BlinkOESElementIndexUint {
@@ -9372,6 +11550,12 @@
 
   constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "OfflineAudioContext"), [__arg_0, __arg_1, __arg_2]);
 
+  oncomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncomplete");
+
+  oncomplete_Setter_(mthis, __arg_0) => mthis["oncomplete"] = __arg_0;
+
+  startRendering_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "startRendering", []);
+
 }
 
 class BlinkOscillatorNode extends BlinkAudioSourceNode {
@@ -9381,18 +11565,14 @@
 
   frequency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frequency");
 
-  noteOff_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "noteOff", []);
-
-  noteOff_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "noteOff", [__arg_0]);
-
-  noteOn_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "noteOn", []);
-
-  noteOn_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "noteOn", [__arg_0]);
-
   onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
 
   onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
 
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+
   setPeriodicWave_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setPeriodicWave", []);
 
   setPeriodicWave_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setPeriodicWave", [__arg_0]);
@@ -9405,23 +11585,6 @@
 
   stop_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stop", [__arg_0]);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
-
-}
-
-class BlinkOverflowEvent extends BlinkEvent {
-  static final instance = new BlinkOverflowEvent();
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "OverflowEvent"), [__arg_0, __arg_1]);
-
-  horizontalOverflow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "horizontalOverflow");
-
-  orient_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orient");
-
-  verticalOverflow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "verticalOverflow");
-
 }
 
 class BlinkPagePopupController {
@@ -9457,21 +11620,35 @@
 
   localizeNumberString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "localizeNumberString", [__arg_0]);
 
+  selectFontsFromOwnerDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectFontsFromOwnerDocument", []);
+
+  selectFontsFromOwnerDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectFontsFromOwnerDocument", [__arg_0]);
+
+  setValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setValue", []);
+
+  setValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setValue", [__arg_0]);
+
   setValueAndClosePopup_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setValueAndClosePopup", []);
 
   setValueAndClosePopup_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setValueAndClosePopup", [__arg_0]);
 
   setValueAndClosePopup_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setValueAndClosePopup", [__arg_0, __arg_1]);
 
-  setValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setValue", []);
+  setWindowRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setWindowRect", [__arg_0, __arg_1]);
 
-  setValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setValue", [__arg_0]);
+  setWindowRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setWindowRect", [__arg_0, __arg_1, __arg_2]);
+
+  setWindowRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setWindowRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkPageTransitionEvent extends BlinkEvent {
   static final instance = new BlinkPageTransitionEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PageTransitionEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PageTransitionEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PageTransitionEvent"), [__arg_0, __arg_1]);
 
   persisted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "persisted");
@@ -9533,29 +11710,79 @@
 
 }
 
+class BlinkParentNode {
+  static final instance = new BlinkParentNode();
+
+  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
+
+  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
+
+  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
+
+  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
+
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
+
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
+
+  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prepend", []);
+
+  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prepend", [__arg_0]);
+
+  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
+
+  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
+
+  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
+
+  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
+
+}
+
+class BlinkPasswordCredential extends BlinkCredential {
+  static final instance = new BlinkPasswordCredential();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), [__arg_0, __arg_1]);
+
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), [__arg_0, __arg_1, __arg_2]);
+
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  formData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formData");
+
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+
+}
+
 class BlinkPath2D {
   static final instance = new BlinkPath2D();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Path2D"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Path2D"), [__arg_0]);
+
   addPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addPath", []);
 
   addPath_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addPath", [__arg_0]);
 
   addPath_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addPath", [__arg_0, __arg_1]);
 
-  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2]);
-
-  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  arc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2]);
-
   arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
   arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
   arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2]);
+
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
   bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
   bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
@@ -9564,12 +11791,6 @@
 
   closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closePath", []);
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Path2D"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Path2D"), [__arg_0]);
-
-  ellipse_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
   ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
   ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
@@ -9605,6 +11826,22 @@
 class BlinkPerformance extends BlinkEventTarget {
   static final instance = new BlinkPerformance();
 
+  memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "memory");
+
+  navigation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "navigation");
+
+  onframetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onframetimingbufferfull");
+
+  onframetimingbufferfull_Setter_(mthis, __arg_0) => mthis["onframetimingbufferfull"] = __arg_0;
+
+  onwebkitresourcetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitresourcetimingbufferfull");
+
+  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => mthis["onwebkitresourcetimingbufferfull"] = __arg_0;
+
+  timing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timing");
+
+  clearFrameTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearFrameTimings", []);
+
   clearMarks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearMarks", []);
 
   clearMarks_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearMarks", [__arg_0]);
@@ -9613,6 +11850,8 @@
 
   clearMeasures_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearMeasures", [__arg_0]);
 
+  getEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntries", []);
+
   getEntriesByName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", []);
 
   getEntriesByName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", [__arg_0]);
@@ -9623,31 +11862,21 @@
 
   getEntriesByType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByType", [__arg_0]);
 
-  getEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntries", []);
-
   mark_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "mark", []);
 
   mark_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "mark", [__arg_0]);
 
-  measure_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "measure", []);
-
   measure_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0]);
 
   measure_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0, __arg_1]);
 
   measure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0, __arg_1, __arg_2]);
 
-  memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "memory");
-
-  navigation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "navigation");
-
   now_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "now", []);
 
-  onwebkitresourcetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitresourcetimingbufferfull");
+  setFrameTimingBufferSize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setFrameTimingBufferSize", []);
 
-  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => mthis["onwebkitresourcetimingbufferfull"] = __arg_0;
-
-  timing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timing");
+  setFrameTimingBufferSize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setFrameTimingBufferSize", [__arg_0]);
 
   webkitClearResourceTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitClearResourceTimings", []);
 
@@ -9657,6 +11886,13 @@
 
 }
 
+class BlinkPerformanceCompositeTiming extends BlinkPerformanceEntry {
+  static final instance = new BlinkPerformanceCompositeTiming();
+
+  sourceFrame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceFrame");
+
+}
+
 class BlinkPerformanceEntry {
   static final instance = new BlinkPerformanceEntry();
 
@@ -9689,6 +11925,13 @@
 
 }
 
+class BlinkPerformanceRenderTiming extends BlinkPerformanceEntry {
+  static final instance = new BlinkPerformanceRenderTiming();
+
+  sourceFrame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceFrame");
+
+}
+
 class BlinkPerformanceResourceTiming extends BlinkPerformanceEntry {
   static final instance = new BlinkPerformanceResourceTiming();
 
@@ -9716,6 +11959,8 @@
 
   secureConnectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "secureConnectionStart");
 
+  workerStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "workerStart");
+
 }
 
 class BlinkPerformanceTiming {
@@ -9765,28 +12010,95 @@
 
 }
 
+class BlinkPeriodicSyncEvent extends BlinkExtendableEvent {
+  static final instance = new BlinkPeriodicSyncEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PeriodicSyncEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PeriodicSyncEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PeriodicSyncEvent"), [__arg_0, __arg_1]);
+
+  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "registration");
+
+}
+
+class BlinkPeriodicSyncManager {
+  static final instance = new BlinkPeriodicSyncManager();
+
+  minPossiblePeriod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minPossiblePeriod");
+
+  getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", []);
+
+  getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", [__arg_0]);
+
+  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistrations", []);
+
+  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "permissionState", []);
+
+  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "register", []);
+
+  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "register", [__arg_0]);
+
+}
+
+class BlinkPeriodicSyncRegistration {
+  static final instance = new BlinkPeriodicSyncRegistration();
+
+  minPeriod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minPeriod");
+
+  networkState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "networkState");
+
+  powerState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "powerState");
+
+  tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tag");
+
+  unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregister", []);
+
+}
+
 class BlinkPeriodicWave {
   static final instance = new BlinkPeriodicWave();
 
 }
 
+class BlinkPermissionStatus extends BlinkEventTarget {
+  static final instance = new BlinkPermissionStatus();
+
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+
+}
+
+class BlinkPermissions {
+  static final instance = new BlinkPermissions();
+
+  query_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "query", []);
+
+  query_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "query", [__arg_0]);
+
+}
+
 class BlinkPlugin {
   static final instance = new BlinkPlugin();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
   description_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "description");
 
   filename_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filename");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
   length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
   namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
 
   namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
@@ -9796,14 +12108,12 @@
 class BlinkPluginArray {
   static final instance = new BlinkPluginArray();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
   namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
 
   namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
@@ -9817,23 +12127,67 @@
 class BlinkPluginPlaceholderElement extends BlinkHTMLDivElement {
   static final instance = new BlinkPluginPlaceholderElement();
 
-  createdCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createdCallback", []);
+  closeable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closeable");
+
+  closeable_Setter_(mthis, __arg_0) => mthis["closeable"] = __arg_0;
 
   message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
 
   message_Setter_(mthis, __arg_0) => mthis["message"] = __arg_0;
 
+  createdCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createdCallback", []);
+
+}
+
+class BlinkPointerEvent extends BlinkMouseEvent {
+  static final instance = new BlinkPointerEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PointerEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PointerEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PointerEvent"), [__arg_0, __arg_1]);
+
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  isPrimary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isPrimary");
+
+  pointerId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerId");
+
+  pointerType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerType");
+
+  pressure_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pressure");
+
+  tiltX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tiltX");
+
+  tiltY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tiltY");
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
 }
 
 class BlinkPopStateEvent extends BlinkEvent {
   static final instance = new BlinkPopStateEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PopStateEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PopStateEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PopStateEvent"), [__arg_0, __arg_1]);
 
   state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
 
 }
 
+class BlinkPositionCallback {
+  static final instance = new BlinkPositionCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkPositionError {
   static final instance = new BlinkPositionError();
 
@@ -9843,12 +12197,86 @@
 
 }
 
+class BlinkPositionErrorCallback {
+  static final instance = new BlinkPositionErrorCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkPositionSensorVRDevice extends BlinkVRDevice {
+  static final instance = new BlinkPositionSensorVRDevice();
+
+  getImmediateState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getImmediateState", []);
+
+  getState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getState", []);
+
+  resetSensor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resetSensor", []);
+
+}
+
 class BlinkPresentation extends BlinkEventTarget {
   static final instance = new BlinkPresentation();
 
-  onavailablechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onavailablechange");
+  ondefaultsessionstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondefaultsessionstart");
 
-  onavailablechange_Setter_(mthis, __arg_0) => mthis["onavailablechange"] = __arg_0;
+  ondefaultsessionstart_Setter_(mthis, __arg_0) => mthis["ondefaultsessionstart"] = __arg_0;
+
+  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "session");
+
+  getAvailability_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAvailability", []);
+
+  getAvailability_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAvailability", [__arg_0]);
+
+  joinSession_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "joinSession", []);
+
+  joinSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "joinSession", [__arg_0]);
+
+  joinSession_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "joinSession", [__arg_0, __arg_1]);
+
+  startSession_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "startSession", []);
+
+  startSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "startSession", [__arg_0]);
+
+}
+
+class BlinkPresentationAvailability extends BlinkEventTarget {
+  static final instance = new BlinkPresentationAvailability();
+
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+
+}
+
+class BlinkPresentationSession extends BlinkEventTarget {
+  static final instance = new BlinkPresentationSession();
+
+  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "binaryType");
+
+  binaryType_Setter_(mthis, __arg_0) => mthis["binaryType"] = __arg_0;
+
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
+
+  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
+
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
+
+  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
 
 }
 
@@ -9864,6 +12292,10 @@
 class BlinkProgressEvent extends BlinkEvent {
   static final instance = new BlinkProgressEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ProgressEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ProgressEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ProgressEvent"), [__arg_0, __arg_1]);
 
   lengthComputable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lengthComputable");
@@ -9874,9 +12306,28 @@
 
 }
 
-class BlinkPushEvent extends BlinkEvent {
+class BlinkPromiseRejectionEvent extends BlinkEvent {
+  static final instance = new BlinkPromiseRejectionEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PromiseRejectionEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PromiseRejectionEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PromiseRejectionEvent"), [__arg_0, __arg_1]);
+
+  promise_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "promise");
+
+  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reason");
+
+}
+
+class BlinkPushEvent extends BlinkExtendableEvent {
   static final instance = new BlinkPushEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushEvent"), [__arg_0, __arg_1]);
 
   data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
@@ -9886,29 +12337,41 @@
 class BlinkPushManager {
   static final instance = new BlinkPushManager();
 
-  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "register", []);
+  getSubscription_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSubscription", []);
 
-  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "register", [__arg_0]);
+  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "permissionState", []);
+
+  permissionState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "permissionState", [__arg_0]);
+
+  subscribe_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "subscribe", []);
+
+  subscribe_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "subscribe", [__arg_0]);
 
 }
 
-class BlinkPushRegistration {
-  static final instance = new BlinkPushRegistration();
+class BlinkPushMessageData {
+  static final instance = new BlinkPushMessageData();
 
-  pushEndpoint_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pushEndpoint");
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushMessageData"), []);
 
-  pushRegistrationId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pushRegistrationId");
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushMessageData"), [__arg_0]);
+
+  arrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "arrayBuffer", []);
+
+  blob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blob", []);
+
+  json_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "json", []);
+
+  text_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "text", []);
 
 }
 
-class BlinkRGBColor {
-  static final instance = new BlinkRGBColor();
+class BlinkPushSubscription {
+  static final instance = new BlinkPushSubscription();
 
-  blue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "blue");
+  endpoint_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endpoint");
 
-  green_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "green");
-
-  red_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "red");
+  unsubscribe_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unsubscribe", []);
 
 }
 
@@ -9919,14 +12382,6 @@
 
   duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
 
-  insertDTMF_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", []);
-
-  insertDTMF_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0]);
-
-  insertDTMF_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0, __arg_1]);
-
-  insertDTMF_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0, __arg_1, __arg_2]);
-
   interToneGap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "interToneGap");
 
   ontonechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontonechange");
@@ -9937,11 +12392,23 @@
 
   track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "track");
 
+  insertDTMF_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", []);
+
+  insertDTMF_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0]);
+
+  insertDTMF_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0, __arg_1]);
+
+  insertDTMF_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0, __arg_1, __arg_2]);
+
 }
 
 class BlinkRTCDTMFToneChangeEvent extends BlinkEvent {
   static final instance = new BlinkRTCDTMFToneChangeEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCDTMFToneChangeEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCDTMFToneChangeEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCDTMFToneChangeEvent"), [__arg_0, __arg_1]);
 
   tone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tone");
@@ -9957,8 +12424,6 @@
 
   bufferedAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bufferedAmount");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
   id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
 
   label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
@@ -9993,6 +12458,8 @@
 
   reliable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reliable");
 
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
   send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
 
   send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
@@ -10006,17 +12473,26 @@
 
 }
 
+class BlinkRTCErrorCallback {
+  static final instance = new BlinkRTCErrorCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkRTCIceCandidate {
   static final instance = new BlinkRTCIceCandidate();
 
-  candidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "candidate");
-
-  candidate_Setter_(mthis, __arg_0) => mthis["candidate"] = __arg_0;
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCIceCandidate"), []);
 
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCIceCandidate"), [__arg_0]);
 
+  candidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "candidate");
+
+  candidate_Setter_(mthis, __arg_0) => mthis["candidate"] = __arg_0;
+
   sdpMLineIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sdpMLineIndex");
 
   sdpMLineIndex_Setter_(mthis, __arg_0) => mthis["sdpMLineIndex"] = __arg_0;
@@ -10037,6 +12513,50 @@
 class BlinkRTCPeerConnection extends BlinkEventTarget {
   static final instance = new BlinkRTCPeerConnection();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), [__arg_0, __arg_1]);
+
+  iceConnectionState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iceConnectionState");
+
+  iceGatheringState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iceGatheringState");
+
+  localDescription_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localDescription");
+
+  onaddstream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddstream");
+
+  onaddstream_Setter_(mthis, __arg_0) => mthis["onaddstream"] = __arg_0;
+
+  ondatachannel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondatachannel");
+
+  ondatachannel_Setter_(mthis, __arg_0) => mthis["ondatachannel"] = __arg_0;
+
+  onicecandidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onicecandidate");
+
+  onicecandidate_Setter_(mthis, __arg_0) => mthis["onicecandidate"] = __arg_0;
+
+  oniceconnectionstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oniceconnectionstatechange");
+
+  oniceconnectionstatechange_Setter_(mthis, __arg_0) => mthis["oniceconnectionstatechange"] = __arg_0;
+
+  onnegotiationneeded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnegotiationneeded");
+
+  onnegotiationneeded_Setter_(mthis, __arg_0) => mthis["onnegotiationneeded"] = __arg_0;
+
+  onremovestream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovestream");
+
+  onremovestream_Setter_(mthis, __arg_0) => mthis["onremovestream"] = __arg_0;
+
+  onsignalingstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsignalingstatechange");
+
+  onsignalingstatechange_Setter_(mthis, __arg_0) => mthis["onsignalingstatechange"] = __arg_0;
+
+  remoteDescription_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "remoteDescription");
+
+  signalingState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "signalingState");
+
   addIceCandidate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addIceCandidate", [__arg_0]);
 
   addIceCandidate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addIceCandidate", [__arg_0, __arg_1]);
@@ -10051,12 +12571,6 @@
 
   close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), [__arg_0]);
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), [__arg_0, __arg_1]);
-
   createAnswer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createAnswer", []);
 
   createAnswer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createAnswer", [__arg_0]);
@@ -10097,42 +12611,6 @@
 
   getStreamById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getStreamById", [__arg_0]);
 
-  iceConnectionState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iceConnectionState");
-
-  iceGatheringState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iceGatheringState");
-
-  localDescription_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localDescription");
-
-  onaddstream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddstream");
-
-  onaddstream_Setter_(mthis, __arg_0) => mthis["onaddstream"] = __arg_0;
-
-  ondatachannel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondatachannel");
-
-  ondatachannel_Setter_(mthis, __arg_0) => mthis["ondatachannel"] = __arg_0;
-
-  onicecandidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onicecandidate");
-
-  onicecandidate_Setter_(mthis, __arg_0) => mthis["onicecandidate"] = __arg_0;
-
-  oniceconnectionstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oniceconnectionstatechange");
-
-  oniceconnectionstatechange_Setter_(mthis, __arg_0) => mthis["oniceconnectionstatechange"] = __arg_0;
-
-  onnegotiationneeded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnegotiationneeded");
-
-  onnegotiationneeded_Setter_(mthis, __arg_0) => mthis["onnegotiationneeded"] = __arg_0;
-
-  onremovestream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovestream");
-
-  onremovestream_Setter_(mthis, __arg_0) => mthis["onremovestream"] = __arg_0;
-
-  onsignalingstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsignalingstatechange");
-
-  onsignalingstatechange_Setter_(mthis, __arg_0) => mthis["onsignalingstatechange"] = __arg_0;
-
-  remoteDescription_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "remoteDescription");
-
   removeStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeStream", []);
 
   removeStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeStream", [__arg_0]);
@@ -10153,8 +12631,6 @@
 
   setRemoteDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setRemoteDescription", [__arg_0, __arg_1, __arg_2]);
 
-  signalingState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "signalingState");
-
   updateIce_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "updateIce", []);
 
   updateIce_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "updateIce", [__arg_0]);
@@ -10180,32 +12656,44 @@
 
 }
 
+class BlinkRTCSessionDescriptionCallback {
+  static final instance = new BlinkRTCSessionDescriptionCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkRTCStatsCallback {
+  static final instance = new BlinkRTCStatsCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkRTCStatsReport {
   static final instance = new BlinkRTCStatsReport();
 
   id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
 
-  local_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "local");
+  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   names_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "names", []);
 
-  remote_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "remote");
-
   stat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stat", []);
 
   stat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stat", [__arg_0]);
 
-  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
-
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
 }
 
 class BlinkRTCStatsResponse {
   static final instance = new BlinkRTCStatsResponse();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
   namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
 
   namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
@@ -10217,17 +12705,33 @@
 class BlinkRadioNodeList extends BlinkNodeList {
   static final instance = new BlinkRadioNodeList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
   value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
 
   value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
 }
 
 class BlinkRange {
   static final instance = new BlinkRange();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Range"), []);
+
+  collapsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "collapsed");
+
+  commonAncestorContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "commonAncestorContainer");
+
+  endContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endContainer");
+
+  endOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endOffset");
+
+  startContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startContainer");
+
+  startOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startOffset");
+
   cloneContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneContents", []);
 
   cloneRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneRange", []);
@@ -10236,28 +12740,18 @@
 
   collapse_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "collapse", [__arg_0]);
 
-  collapsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "collapsed");
-
-  commonAncestorContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "commonAncestorContainer");
-
   compareBoundaryPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compareBoundaryPoints", []);
 
   compareBoundaryPoints_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compareBoundaryPoints", [__arg_0]);
 
   compareBoundaryPoints_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "compareBoundaryPoints", [__arg_0, __arg_1]);
 
-  compareNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compareNode", []);
-
-  compareNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compareNode", [__arg_0]);
-
   comparePoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "comparePoint", []);
 
   comparePoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "comparePoint", [__arg_0]);
 
   comparePoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "comparePoint", [__arg_0, __arg_1]);
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Range"), []);
-
   createContextualFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createContextualFragment", []);
 
   createContextualFragment_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createContextualFragment", [__arg_0]);
@@ -10266,10 +12760,6 @@
 
   detach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detach", []);
 
-  endContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endContainer");
-
-  endOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endOffset");
-
   expand_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "expand", []);
 
   expand_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "expand", [__arg_0]);
@@ -10294,13 +12784,19 @@
 
   isPointInRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "isPointInRange", [__arg_0, __arg_1]);
 
+  selectNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectNode", []);
+
+  selectNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectNode", [__arg_0]);
+
   selectNodeContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectNodeContents", []);
 
   selectNodeContents_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectNodeContents", [__arg_0]);
 
-  selectNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectNode", []);
+  setEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", []);
 
-  selectNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectNode", [__arg_0]);
+  setEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", [__arg_0]);
+
+  setEnd_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", [__arg_0, __arg_1]);
 
   setEndAfter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setEndAfter", []);
 
@@ -10310,11 +12806,11 @@
 
   setEndBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setEndBefore", [__arg_0]);
 
-  setEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", []);
+  setStart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStart", []);
 
-  setEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", [__arg_0]);
+  setStart_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStart", [__arg_0]);
 
-  setEnd_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", [__arg_0, __arg_1]);
+  setStart_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setStart", [__arg_0, __arg_1]);
 
   setStartAfter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStartAfter", []);
 
@@ -10324,22 +12820,38 @@
 
   setStartBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStartBefore", [__arg_0]);
 
-  setStart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStart", []);
-
-  setStart_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStart", [__arg_0]);
-
-  setStart_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setStart", [__arg_0, __arg_1]);
-
-  startContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startContainer");
-
-  startOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startOffset");
-
   surroundContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "surroundContents", []);
 
   surroundContents_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "surroundContents", [__arg_0]);
 
 }
 
+class BlinkReadableByteStream {
+  static final instance = new BlinkReadableByteStream();
+
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+
+  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancel", [__arg_0]);
+
+  getReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getReader", []);
+
+}
+
+class BlinkReadableByteStreamReader {
+  static final instance = new BlinkReadableByteStreamReader();
+
+  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
+
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+
+  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancel", [__arg_0]);
+
+  read_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "read", []);
+
+  releaseLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseLock", []);
+
+}
+
 class BlinkReadableStream {
   static final instance = new BlinkReadableStream();
 
@@ -10347,32 +12859,32 @@
 
   cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancel", [__arg_0]);
 
-  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
-
-  read_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "read", []);
-
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
-
-  wait_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "wait", []);
+  getReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getReader", []);
 
 }
 
-class BlinkRect {
-  static final instance = new BlinkRect();
+class BlinkReadableStreamReader {
+  static final instance = new BlinkReadableStreamReader();
 
-  bottom_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bottom");
+  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
 
-  left_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "left");
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
 
-  right_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "right");
+  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancel", [__arg_0]);
 
-  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "top");
+  read_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "read", []);
+
+  releaseLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseLock", []);
 
 }
 
 class BlinkRelatedEvent extends BlinkEvent {
   static final instance = new BlinkRelatedEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RelatedEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RelatedEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RelatedEvent"), [__arg_0, __arg_1]);
 
   relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedTarget");
@@ -10382,36 +12894,35 @@
 class BlinkRequest {
   static final instance = new BlinkRequest();
 
-  arrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "arrayBuffer", []);
-
-  blob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blob", []);
-
-  bodyUsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bodyUsed");
-
-  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Request"), []);
 
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Request"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Request"), [__arg_0, __arg_1]);
 
+  context_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "context");
+
   credentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "credentials");
 
   headers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "headers");
 
-  json_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "json", []);
-
-  method_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "method");
-
   mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mode");
 
   referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "referrer");
 
-  text_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "text", []);
-
   url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
 
+  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
+
+}
+
+class BlinkRequestAnimationFrameCallback {
+  static final instance = new BlinkRequestAnimationFrameCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
 }
 
 class BlinkResourceProgressEvent extends BlinkProgressEvent {
@@ -10424,34 +12935,34 @@
 class BlinkResponse {
   static final instance = new BlinkResponse();
 
-  arrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "arrayBuffer", []);
-
-  blob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blob", []);
-
-  bodyUsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bodyUsed");
-
-  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Response"), []);
 
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Response"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Response"), [__arg_0, __arg_1]);
 
+  body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "body");
+
   headers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "headers");
 
-  json_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "json", []);
-
-  statusText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusText");
+  ok_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ok");
 
   status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
 
-  text_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "text", []);
-
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
 
+  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
+
+  error_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response"), "error", []);
+
+  redirect_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response"), "redirect", []);
+
+  redirect_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response"), "redirect", [__arg_0]);
+
+  redirect_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response"), "redirect", [__arg_0, __arg_1]);
+
 }
 
 class BlinkSQLError {
@@ -10468,20 +12979,42 @@
 
   insertId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "insertId");
 
-  rowsAffected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rowsAffected");
-
   rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
 
+  rowsAffected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rowsAffected");
+
 }
 
 class BlinkSQLResultSetRowList {
   static final instance = new BlinkSQLResultSetRowList();
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+}
+
+class BlinkSQLStatementCallback {
+  static final instance = new BlinkSQLStatementCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0, __arg_1]);
+
+}
+
+class BlinkSQLStatementErrorCallback {
+  static final instance = new BlinkSQLStatementErrorCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0, __arg_1]);
 
 }
 
@@ -10500,43 +13033,50 @@
 
 }
 
+class BlinkSQLTransactionCallback {
+  static final instance = new BlinkSQLTransactionCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkSQLTransactionErrorCallback {
+  static final instance = new BlinkSQLTransactionErrorCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkSVGAElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGAElement();
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
 
-}
-
-class BlinkSVGAltGlyphDefElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGAltGlyphDefElement();
-
-}
-
-class BlinkSVGAltGlyphElement extends BlinkSVGTextPositioningElement {
-  static final instance = new BlinkSVGAltGlyphElement();
-
-  format_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "format");
-
-  format_Setter_(mthis, __arg_0) => mthis["format"] = __arg_0;
-
-  glyphRef_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "glyphRef");
-
-  glyphRef_Setter_(mthis, __arg_0) => mthis["glyphRef"] = __arg_0;
-
   href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
 
 }
 
-class BlinkSVGAltGlyphItemElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGAltGlyphItemElement();
-
-}
-
 class BlinkSVGAngle {
   static final instance = new BlinkSVGAngle();
 
+  unitType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unitType");
+
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+
+  valueAsString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsString");
+
+  valueAsString_Setter_(mthis, __arg_0) => mthis["valueAsString"] = __arg_0;
+
+  valueInSpecifiedUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueInSpecifiedUnits");
+
+  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => mthis["valueInSpecifiedUnits"] = __arg_0;
+
   convertToSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "convertToSpecifiedUnits", []);
 
   convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "convertToSpecifiedUnits", [__arg_0]);
@@ -10547,20 +13087,6 @@
 
   newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "newValueSpecifiedUnits", [__arg_0, __arg_1]);
 
-  unitType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unitType");
-
-  valueAsString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsString");
-
-  valueAsString_Setter_(mthis, __arg_0) => mthis["valueAsString"] = __arg_0;
-
-  valueInSpecifiedUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueInSpecifiedUnits");
-
-  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => mthis["valueInSpecifiedUnits"] = __arg_0;
-
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
-
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
-
 }
 
 class BlinkSVGAnimateElement extends BlinkSVGAnimationElement {
@@ -10699,28 +13225,6 @@
 class BlinkSVGAnimationElement extends BlinkSVGElement {
   static final instance = new BlinkSVGAnimationElement();
 
-  beginElementAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginElementAt", []);
-
-  beginElementAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginElementAt", [__arg_0]);
-
-  beginElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginElement", []);
-
-  endElementAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endElementAt", []);
-
-  endElementAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endElementAt", [__arg_0]);
-
-  endElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endElement", []);
-
-  getCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentTime", []);
-
-  getSimpleDuration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSimpleDuration", []);
-
-  getStartTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStartTime", []);
-
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
-
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
-
   onbegin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbegin");
 
   onbegin_Setter_(mthis, __arg_0) => mthis["onbegin"] = __arg_0;
@@ -10733,13 +13237,35 @@
 
   onrepeat_Setter_(mthis, __arg_0) => mthis["onrepeat"] = __arg_0;
 
+  targetElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetElement");
+
+  beginElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginElement", []);
+
+  beginElementAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginElementAt", []);
+
+  beginElementAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginElementAt", [__arg_0]);
+
+  endElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endElement", []);
+
+  endElementAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endElementAt", []);
+
+  endElementAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endElementAt", [__arg_0]);
+
+  getCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentTime", []);
+
+  getSimpleDuration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSimpleDuration", []);
+
+  getStartTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStartTime", []);
+
   requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
 
   requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
 
   systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
 
-  targetElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetElement");
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
 
 }
 
@@ -10783,9 +13309,9 @@
 class BlinkSVGCursorElement extends BlinkSVGElement {
   static final instance = new BlinkSVGCursorElement();
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
 
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
   href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
 
@@ -10795,9 +13321,9 @@
 
   systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
 
 }
 
@@ -10821,6 +13347,20 @@
 
   className_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "className");
 
+  ownerSVGElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerSVGElement");
+
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+
+  tabIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tabIndex");
+
+  tabIndex_Setter_(mthis, __arg_0) => mthis["tabIndex"] = __arg_0;
+
+  viewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewportElement");
+
+  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blur", []);
+
+  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
+
   onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
 
   onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
@@ -11001,6 +13541,38 @@
 
   onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
 
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+
+  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+
+  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+
+  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+
+  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+
+  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+
+  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+
+  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+
+  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+
   onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
 
   onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
@@ -11065,28 +13637,6 @@
 
   onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
 
-  ownerSVGElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerSVGElement");
-
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
-
-  tabIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tabIndex");
-
-  tabIndex_Setter_(mthis, __arg_0) => mthis["tabIndex"] = __arg_0;
-
-  viewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewportElement");
-
-  xmlbase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlbase");
-
-  xmlbase_Setter_(mthis, __arg_0) => mthis["xmlbase"] = __arg_0;
-
-  xmllang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmllang");
-
-  xmllang_Setter_(mthis, __arg_0) => mthis["xmllang"] = __arg_0;
-
-  xmlspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlspace");
-
-  xmlspace_Setter_(mthis, __arg_0) => mthis["xmlspace"] = __arg_0;
-
 }
 
 class BlinkSVGEllipseElement extends BlinkSVGGeometryElement {
@@ -11105,14 +13655,14 @@
 class BlinkSVGFEBlendElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEBlendElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
   in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in2");
 
   mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mode");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
   result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
@@ -11126,16 +13676,16 @@
 class BlinkSVGFEColorMatrixElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEColorMatrixElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
-
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   values_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "values");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
@@ -11147,10 +13697,10 @@
 class BlinkSVGFEComponentTransferElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEComponentTransferElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
   result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
@@ -11164,8 +13714,6 @@
 class BlinkSVGFECompositeElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFECompositeElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
   in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in2");
@@ -11180,6 +13728,8 @@
 
   operator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "operator");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
   result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
@@ -11199,8 +13749,6 @@
 
   edgeMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "edgeMode");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
   kernelMatrix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelMatrix");
@@ -11215,12 +13763,14 @@
 
   preserveAlpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAlpha");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
-
   targetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetX");
 
   targetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetY");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
@@ -11234,18 +13784,18 @@
 
   diffuseConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "diffuseConstant");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
   kernelUnitLengthX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthX");
 
   kernelUnitLengthY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthY");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
-
   surfaceScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "surfaceScale");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
@@ -11257,24 +13807,24 @@
 class BlinkSVGFEDisplacementMapElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDisplacementMapElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
   in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in2");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
-
   scale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scale");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
-
   xChannelSelector_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xChannelSelector");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
-
   yChannelSelector_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "yChannelSelector");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+
   y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
 }
@@ -11295,11 +13845,11 @@
 
   dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dy");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  stdDeviationX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationX");
+
+  stdDeviationY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationY");
 
   setStdDeviation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", []);
 
@@ -11307,9 +13857,9 @@
 
   setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", [__arg_0, __arg_1]);
 
-  stdDeviationX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationX");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
-  stdDeviationY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationY");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
@@ -11357,11 +13907,11 @@
 class BlinkSVGFEGaussianBlurElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEGaussianBlurElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  stdDeviationX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationX");
+
+  stdDeviationY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationY");
 
   setStdDeviation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", []);
 
@@ -11369,9 +13919,9 @@
 
   setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", [__arg_0, __arg_1]);
 
-  stdDeviationX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationX");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
-  stdDeviationY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationY");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
@@ -11384,12 +13934,10 @@
 class BlinkSVGFEImageElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEImageElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
   result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
@@ -11398,6 +13946,8 @@
 
   y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
 }
 
 class BlinkSVGFEMergeElement extends BlinkSVGElement {
@@ -11425,8 +13975,6 @@
 class BlinkSVGFEMorphologyElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEMorphologyElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
   operator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "operator");
@@ -11435,6 +13983,8 @@
 
   radiusY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radiusY");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
   result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
@@ -11452,10 +14002,10 @@
 
   dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dy");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
   result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
@@ -11480,11 +14030,11 @@
 class BlinkSVGFESpecularLightingElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFESpecularLightingElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  kernelUnitLengthX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthX");
+
+  kernelUnitLengthY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthY");
 
   specularConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "specularConstant");
 
@@ -11492,6 +14042,10 @@
 
   surfaceScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "surfaceScale");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
@@ -11524,10 +14078,10 @@
 class BlinkSVGFETileElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFETileElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
   result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
@@ -11545,18 +14099,18 @@
 
   baseFrequencyY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseFrequencyY");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   numOctaves_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numOctaves");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
-
   seed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "seed");
 
   stitchTiles_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stitchTiles");
 
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
@@ -11568,23 +14122,28 @@
 class BlinkSVGFilterElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFilterElement();
 
-  filterResX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filterResX");
-
-  filterResY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filterResY");
-
   filterUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filterUnits");
 
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   primitiveUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "primitiveUnits");
 
-  setFilterRes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setFilterRes", []);
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
-  setFilterRes_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setFilterRes", [__arg_0]);
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
 
-  setFilterRes_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setFilterRes", [__arg_0, __arg_1]);
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
+}
+
+class BlinkSVGFilterPrimitiveStandardAttributes {
+  static final instance = new BlinkSVGFilterPrimitiveStandardAttributes();
+
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
@@ -11594,33 +14153,12 @@
 
 }
 
-class BlinkSVGFontElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGFontElement();
+class BlinkSVGFitToViewBox {
+  static final instance = new BlinkSVGFitToViewBox();
 
-}
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
 
-class BlinkSVGFontFaceElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGFontFaceElement();
-
-}
-
-class BlinkSVGFontFaceFormatElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGFontFaceFormatElement();
-
-}
-
-class BlinkSVGFontFaceNameElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGFontFaceNameElement();
-
-}
-
-class BlinkSVGFontFaceSrcElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGFontFaceSrcElement();
-
-}
-
-class BlinkSVGFontFaceUriElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGFontFaceUriElement();
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
 
 }
 
@@ -11655,42 +14193,6 @@
 
 }
 
-class BlinkSVGGlyphElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGGlyphElement();
-
-}
-
-class BlinkSVGGlyphRefElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGGlyphRefElement();
-
-  dx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dx");
-
-  dx_Setter_(mthis, __arg_0) => mthis["dx"] = __arg_0;
-
-  dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dy");
-
-  dy_Setter_(mthis, __arg_0) => mthis["dy"] = __arg_0;
-
-  format_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "format");
-
-  format_Setter_(mthis, __arg_0) => mthis["format"] = __arg_0;
-
-  glyphRef_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "glyphRef");
-
-  glyphRef_Setter_(mthis, __arg_0) => mthis["glyphRef"] = __arg_0;
-
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
-
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
-
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
-
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
-
-}
-
 class BlinkSVGGradientElement extends BlinkSVGElement {
   static final instance = new BlinkSVGGradientElement();
 
@@ -11698,10 +14200,10 @@
 
   gradientUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gradientUnits");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   spreadMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "spreadMethod");
 
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
 }
 
 class BlinkSVGGraphicsElement extends BlinkSVGElement {
@@ -11709,6 +14211,10 @@
 
   farthestViewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "farthestViewportElement");
 
+  nearestViewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nearestViewportElement");
+
+  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transform");
+
   getBBox_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBBox", []);
 
   getCTM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCTM", []);
@@ -11719,24 +14225,15 @@
 
   getTransformToElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTransformToElement", [__arg_0]);
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
-
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
-
-  nearestViewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nearestViewportElement");
-
   requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
 
   requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
 
   systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
 
-  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transform");
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
 
-}
-
-class BlinkSVGHKernElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGHKernElement();
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
 
 }
 
@@ -11745,8 +14242,6 @@
 
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
 
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
@@ -11755,11 +14250,27 @@
 
   y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
 }
 
 class BlinkSVGLength {
   static final instance = new BlinkSVGLength();
 
+  unitType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unitType");
+
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+
+  valueAsString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsString");
+
+  valueAsString_Setter_(mthis, __arg_0) => mthis["valueAsString"] = __arg_0;
+
+  valueInSpecifiedUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueInSpecifiedUnits");
+
+  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => mthis["valueInSpecifiedUnits"] = __arg_0;
+
   convertToSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "convertToSpecifiedUnits", []);
 
   convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "convertToSpecifiedUnits", [__arg_0]);
@@ -11770,26 +14281,14 @@
 
   newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "newValueSpecifiedUnits", [__arg_0, __arg_1]);
 
-  unitType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unitType");
-
-  valueAsString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsString");
-
-  valueAsString_Setter_(mthis, __arg_0) => mthis["valueAsString"] = __arg_0;
-
-  valueInSpecifiedUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueInSpecifiedUnits");
-
-  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => mthis["valueInSpecifiedUnits"] = __arg_0;
-
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
-
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
-
 }
 
 class BlinkSVGLengthList {
   static final instance = new BlinkSVGLengthList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
@@ -11813,10 +14312,6 @@
 
   insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
-
   removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
 
   removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
@@ -11875,8 +14370,6 @@
 
   orientType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientType");
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
-
   refX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "refX");
 
   refY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "refY");
@@ -11887,6 +14380,8 @@
 
   setOrientToAuto_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setOrientToAuto", []);
 
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+
   viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
 
 }
@@ -11894,27 +14389,27 @@
 class BlinkSVGMaskElement extends BlinkSVGElement {
   static final instance = new BlinkSVGMaskElement();
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
-
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
-
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
   maskContentUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maskContentUnits");
 
   maskUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maskUnits");
 
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+
   requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
 
   requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
 
   systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
-
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
 
 }
 
@@ -11955,15 +14450,19 @@
 
   multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "multiply", [__arg_0]);
 
+  rotate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "rotate", []);
+
+  rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0]);
+
   rotateFromVector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "rotateFromVector", []);
 
   rotateFromVector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotateFromVector", [__arg_0]);
 
   rotateFromVector_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rotateFromVector", [__arg_0, __arg_1]);
 
-  rotate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "rotate", []);
+  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale", []);
 
-  rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0]);
+  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
 
   scaleNonUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", []);
 
@@ -11971,10 +14470,6 @@
 
   scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0, __arg_1]);
 
-  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale", []);
-
-  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
-
   skewX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "skewX", []);
 
   skewX_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "skewX", [__arg_0]);
@@ -11996,11 +14491,6 @@
 
 }
 
-class BlinkSVGMissingGlyphElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGMissingGlyphElement();
-
-}
-
 class BlinkSVGNumber {
   static final instance = new BlinkSVGNumber();
 
@@ -12013,7 +14503,9 @@
 class BlinkSVGNumberList {
   static final instance = new BlinkSVGNumberList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
@@ -12037,10 +14529,6 @@
 
   insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
-
   removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
 
   removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
@@ -12060,6 +14548,12 @@
 
   animatedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animatedPathSegList");
 
+  normalizedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "normalizedPathSegList");
+
+  pathLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathLength");
+
+  pathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathSegList");
+
   createSVGPathSegArcAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegArcAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
   createSVGPathSegArcAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegArcAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
@@ -12172,21 +14666,15 @@
 
   getTotalLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTotalLength", []);
 
-  normalizedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "normalizedPathSegList");
-
-  pathLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathLength");
-
-  pathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathSegList");
-
 }
 
 class BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSeg();
 
-  pathSegTypeAsLetter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathSegTypeAsLetter");
-
   pathSegType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathSegType");
 
+  pathSegTypeAsLetter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathSegTypeAsLetter");
+
 }
 
 class BlinkSVGPathSegArcAbs extends BlinkSVGPathSeg {
@@ -12263,6 +14751,10 @@
 class BlinkSVGPathSegCurvetoCubicAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicAbs();
 
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+
   x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
 
   x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
@@ -12271,9 +14763,9 @@
 
   x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
   y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
 
@@ -12283,15 +14775,15 @@
 
   y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
-
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
-
 }
 
 class BlinkSVGPathSegCurvetoCubicRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicRel();
 
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+
   x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
 
   x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
@@ -12300,9 +14792,9 @@
 
   x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
   y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
 
@@ -12312,94 +14804,90 @@
 
   y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
-
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
-
 }
 
 class BlinkSVGPathSegCurvetoCubicSmoothAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicSmoothAbs();
 
-  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
-
-  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
-
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
 
   x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
 
-  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
+  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
 
   y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
   y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
+  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+
+  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
+
 }
 
 class BlinkSVGPathSegCurvetoCubicSmoothRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicSmoothRel();
 
-  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
-
-  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
-
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
 
   x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
 
-  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
+  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
 
   y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
   y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
+  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+
+  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
+
 }
 
 class BlinkSVGPathSegCurvetoQuadraticAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticAbs();
 
-  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
-
-  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
-
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
 
   x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
 
-  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
+  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
 
   y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
   y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
+  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+
+  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
+
 }
 
 class BlinkSVGPathSegCurvetoQuadraticRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticRel();
 
-  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
-
-  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
-
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
 
   x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
 
-  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
+  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
 
   y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
   y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
+  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+
+  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
+
 }
 
 class BlinkSVGPathSegCurvetoQuadraticSmoothAbs extends BlinkSVGPathSeg {
@@ -12493,7 +14981,9 @@
 class BlinkSVGPathSegList {
   static final instance = new BlinkSVGPathSegList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
@@ -12517,10 +15007,6 @@
 
   insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
-
   removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
 
   removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
@@ -12562,45 +15048,41 @@
 class BlinkSVGPatternElement extends BlinkSVGElement {
   static final instance = new BlinkSVGPatternElement();
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
-
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
-
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   patternContentUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "patternContentUnits");
 
   patternTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "patternTransform");
 
   patternUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "patternUnits");
 
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+
   preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
 
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
   requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
 
   requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
 
   systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
-
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
-
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
 
 }
 
 class BlinkSVGPoint {
   static final instance = new BlinkSVGPoint();
 
-  matrixTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matrixTransform", []);
-
-  matrixTransform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matrixTransform", [__arg_0]);
-
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
 
   x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
@@ -12609,12 +15091,18 @@
 
   y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
+  matrixTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matrixTransform", []);
+
+  matrixTransform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matrixTransform", [__arg_0]);
+
 }
 
 class BlinkSVGPointList {
   static final instance = new BlinkSVGPointList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
@@ -12638,10 +15126,6 @@
 
   insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
-
   removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
 
   removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
@@ -12740,14 +15224,37 @@
 
 }
 
-class BlinkSVGRenderingIntent {
-  static final instance = new BlinkSVGRenderingIntent();
-
-}
-
 class BlinkSVGSVGElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGSVGElement();
 
+  currentScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentScale");
+
+  currentScale_Setter_(mthis, __arg_0) => mthis["currentScale"] = __arg_0;
+
+  currentTranslate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTranslate");
+
+  currentView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentView");
+
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+
+  pixelUnitToMillimeterX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pixelUnitToMillimeterX");
+
+  pixelUnitToMillimeterY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pixelUnitToMillimeterY");
+
+  screenPixelToMillimeterX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenPixelToMillimeterX");
+
+  screenPixelToMillimeterY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenPixelToMillimeterY");
+
+  useCurrentView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "useCurrentView");
+
+  viewport_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewport");
+
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+
   animationsPaused_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "animationsPaused", []);
 
   checkEnclosure_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkEnclosure", []);
@@ -12774,20 +15281,12 @@
 
   createSVGRect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGRect", []);
 
+  createSVGTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransform", []);
+
   createSVGTransformFromMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransformFromMatrix", []);
 
   createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransformFromMatrix", [__arg_0]);
 
-  createSVGTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransform", []);
-
-  currentScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentScale");
-
-  currentScale_Setter_(mthis, __arg_0) => mthis["currentScale"] = __arg_0;
-
-  currentTranslate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTranslate");
-
-  currentView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentView");
-
   deselectAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deselectAll", []);
 
   forceRedraw_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "forceRedraw", []);
@@ -12810,20 +15309,8 @@
 
   getIntersectionList_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getIntersectionList", [__arg_0, __arg_1]);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
-
   pauseAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pauseAnimations", []);
 
-  pixelUnitToMillimeterX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pixelUnitToMillimeterX");
-
-  pixelUnitToMillimeterY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pixelUnitToMillimeterY");
-
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
-
-  screenPixelToMillimeterX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenPixelToMillimeterX");
-
-  screenPixelToMillimeterY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenPixelToMillimeterY");
-
   setCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCurrentTime", []);
 
   setCurrentTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCurrentTime", [__arg_0]);
@@ -12834,24 +15321,16 @@
 
   unpauseAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unpauseAnimations", []);
 
-  unsuspendRedrawAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unsuspendRedrawAll", []);
-
   unsuspendRedraw_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unsuspendRedraw", []);
 
   unsuspendRedraw_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "unsuspendRedraw", [__arg_0]);
 
-  useCurrentView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "useCurrentView");
+  unsuspendRedrawAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unsuspendRedrawAll", []);
+
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
 
   viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
 
-  viewport_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewport");
-
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
-
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
-
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
-
   zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomAndPan");
 
   zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
@@ -12861,12 +15340,12 @@
 class BlinkSVGScriptElement extends BlinkSVGElement {
   static final instance = new BlinkSVGScriptElement();
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
   type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
 }
 
 class BlinkSVGSetElement extends BlinkSVGAnimationElement {
@@ -12884,7 +15363,9 @@
 class BlinkSVGStringList {
   static final instance = new BlinkSVGStringList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
@@ -12908,10 +15389,6 @@
 
   insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
-
   removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
 
   removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
@@ -12966,9 +15443,28 @@
 
 }
 
+class BlinkSVGTests {
+  static final instance = new BlinkSVGTests();
+
+  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
+
+  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
+
+  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
+
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
+
+}
+
 class BlinkSVGTextContentElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGTextContentElement();
 
+  lengthAdjust_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lengthAdjust");
+
+  textLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textLength");
+
   getCharNumAtPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCharNumAtPosition", []);
 
   getCharNumAtPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getCharNumAtPosition", [__arg_0]);
@@ -12999,16 +15495,12 @@
 
   getSubStringLength_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSubStringLength", [__arg_0, __arg_1]);
 
-  lengthAdjust_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lengthAdjust");
-
   selectSubString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectSubString", []);
 
   selectSubString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectSubString", [__arg_0]);
 
   selectSubString_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "selectSubString", [__arg_0, __arg_1]);
 
-  textLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textLength");
-
 }
 
 class BlinkSVGTextElement extends BlinkSVGTextPositioningElement {
@@ -13019,14 +15511,14 @@
 class BlinkSVGTextPathElement extends BlinkSVGTextContentElement {
   static final instance = new BlinkSVGTextPathElement();
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   method_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "method");
 
   spacing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "spacing");
 
   startOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startOffset");
 
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
 }
 
 class BlinkSVGTextPositioningElement extends BlinkSVGTextContentElement {
@@ -13056,6 +15548,8 @@
 
   matrix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "matrix");
 
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
   setMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setMatrix", []);
 
   setMatrix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setMatrix", [__arg_0]);
@@ -13086,14 +15580,14 @@
 
   setTranslate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTranslate", [__arg_0, __arg_1]);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
 }
 
 class BlinkSVGTransformList {
   static final instance = new BlinkSVGTransformList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
 
   $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
 
@@ -13123,10 +15617,6 @@
 
   insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
-
   removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
 
   removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
@@ -13139,6 +15629,13 @@
 
 }
 
+class BlinkSVGURIReference {
+  static final instance = new BlinkSVGURIReference();
+
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
+}
+
 class BlinkSVGUnitTypes {
   static final instance = new BlinkSVGUnitTypes();
 
@@ -13149,30 +15646,25 @@
 
   height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
-
   width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
 
   x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
 
   y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
 
-}
-
-class BlinkSVGVKernElement extends BlinkSVGElement {
-  static final instance = new BlinkSVGVKernElement();
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
 
 }
 
 class BlinkSVGViewElement extends BlinkSVGElement {
   static final instance = new BlinkSVGViewElement();
 
+  viewTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewTarget");
+
   preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
 
   viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
 
-  viewTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewTarget");
-
   zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomAndPan");
 
   zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
@@ -13184,19 +15676,28 @@
 
   preserveAspectRatioString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatioString");
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transform");
 
   transformString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transformString");
 
-  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transform");
-
   viewBoxString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBoxString");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  viewTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewTarget");
 
   viewTargetString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewTargetString");
 
-  viewTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewTarget");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+
+  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomAndPan");
+
+  zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
+
+}
+
+class BlinkSVGZoomAndPan {
+  static final instance = new BlinkSVGZoomAndPan();
 
   zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomAndPan");
 
@@ -13247,16 +15748,16 @@
 
   angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angle");
 
-  lock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lock", []);
-
-  lock_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lock", [__arg_0]);
-
   onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
 
   onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
   type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
 
+  lock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lock", []);
+
+  lock_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lock", [__arg_0]);
+
   unlock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unlock", []);
 
 }
@@ -13276,15 +15777,68 @@
 
 }
 
+class BlinkScrollState {
+  static final instance = new BlinkScrollState();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1]);
+
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2]);
+
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  constructorCallback_7_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  constructorCallback_8_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  deltaGranularity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaGranularity");
+
+  deltaX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaX");
+
+  deltaY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaY");
+
+  fromUserInput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fromUserInput");
+
+  inInertialPhase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inInertialPhase");
+
+  isBeginning_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isBeginning");
+
+  isEnding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isEnding");
+
+  shouldPropagate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shouldPropagate");
+
+  velocityX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "velocityX");
+
+  velocityY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "velocityY");
+
+  consumeDelta_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "consumeDelta", []);
+
+  consumeDelta_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "consumeDelta", [__arg_0]);
+
+  consumeDelta_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "consumeDelta", [__arg_0, __arg_1]);
+
+}
+
 class BlinkSecurityPolicyViolationEvent extends BlinkEvent {
   static final instance = new BlinkSecurityPolicyViolationEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SecurityPolicyViolationEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SecurityPolicyViolationEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SecurityPolicyViolationEvent"), [__arg_0, __arg_1]);
+
   blockedURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "blockedURI");
 
   columnNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "columnNumber");
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SecurityPolicyViolationEvent"), [__arg_0, __arg_1]);
-
   documentURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "documentURI");
 
   effectiveDirective_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "effectiveDirective");
@@ -13306,10 +15860,6 @@
 class BlinkSelection {
   static final instance = new BlinkSelection();
 
-  addRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addRange", []);
-
-  addRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addRange", [__arg_0]);
-
   anchorNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "anchorNode");
 
   anchorOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "anchorOffset");
@@ -13318,9 +15868,23 @@
 
   baseOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseOffset");
 
-  collapseToEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapseToEnd", []);
+  extentNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extentNode");
 
-  collapseToStart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapseToStart", []);
+  extentOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extentOffset");
+
+  focusNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "focusNode");
+
+  focusOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "focusOffset");
+
+  isCollapsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isCollapsed");
+
+  rangeCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rangeCount");
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+  addRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addRange", []);
+
+  addRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addRange", [__arg_0]);
 
   collapse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapse", []);
 
@@ -13328,6 +15892,10 @@
 
   collapse_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "collapse", [__arg_0, __arg_1]);
 
+  collapseToEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapseToEnd", []);
+
+  collapseToStart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapseToStart", []);
+
   containsNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "containsNode", []);
 
   containsNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "containsNode", [__arg_0]);
@@ -13344,40 +15912,22 @@
 
   extend_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "extend", [__arg_0, __arg_1]);
 
-  extentNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extentNode");
-
-  extentOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extentOffset");
-
-  focusNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "focusNode");
-
-  focusOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "focusOffset");
-
   getRangeAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRangeAt", []);
 
   getRangeAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRangeAt", [__arg_0]);
 
-  isCollapsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isCollapsed");
-
-  modify_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "modify", []);
-
   modify_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "modify", [__arg_0]);
 
   modify_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "modify", [__arg_0, __arg_1]);
 
   modify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "modify", [__arg_0, __arg_1, __arg_2]);
 
-  rangeCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rangeCount");
-
   removeAllRanges_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAllRanges", []);
 
   selectAllChildren_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectAllChildren", []);
 
   selectAllChildren_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectAllChildren", [__arg_0]);
 
-  setBaseAndExtent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setBaseAndExtent", []);
-
-  setBaseAndExtent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setBaseAndExtent", [__arg_0]);
-
   setBaseAndExtent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setBaseAndExtent", [__arg_0, __arg_1]);
 
   setBaseAndExtent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setBaseAndExtent", [__arg_0, __arg_1, __arg_2]);
@@ -13390,67 +15940,120 @@
 
   setPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0, __arg_1]);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+}
+
+class BlinkServicePort {
+  static final instance = new BlinkServicePort();
+
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  targetURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetURL");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+
+}
+
+class BlinkServicePortCollection extends BlinkEventTarget {
+  static final instance = new BlinkServicePortCollection();
+
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+
+  onconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onconnect");
+
+  onconnect_Setter_(mthis, __arg_0) => mthis["onconnect"] = __arg_0;
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  connect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "connect", []);
+
+  connect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0]);
+
+  connect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0, __arg_1]);
+
+  match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "match", []);
+
+  match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0]);
+
+  matchAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", []);
+
+  matchAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", [__arg_0]);
+
+}
+
+class BlinkServicePortConnectEvent extends BlinkExtendableEvent {
+  static final instance = new BlinkServicePortConnectEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServicePortConnectEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServicePortConnectEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServicePortConnectEvent"), [__arg_0, __arg_1]);
+
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+
+  targetURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetURL");
+
+  respondWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", []);
+
+  respondWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", [__arg_0]);
 
 }
 
 class BlinkServiceWorker extends BlinkEventTarget {
   static final instance = new BlinkServiceWorker();
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
-
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
-
   onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
 
   onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
-
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
-
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
-
   scriptURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scriptURL");
 
   state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
 
-  terminate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "terminate", []);
-
-}
-
-class BlinkServiceWorkerClient {
-  static final instance = new BlinkServiceWorkerClient();
-
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
-
   postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
 
   postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
 
   postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
 
-}
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
 
-class BlinkServiceWorkerClients {
-  static final instance = new BlinkServiceWorkerClients();
-
-  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAll", []);
-
-  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0]);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
 }
 
-class BlinkServiceWorkerContainer {
+class BlinkServiceWorkerContainer extends BlinkEventTarget {
   static final instance = new BlinkServiceWorkerContainer();
 
   controller_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "controller");
 
+  oncontrollerchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontrollerchange");
+
+  oncontrollerchange_Setter_(mthis, __arg_0) => mthis["oncontrollerchange"] = __arg_0;
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ready");
+
   getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", []);
 
   getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", [__arg_0]);
 
-  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ready");
+  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistrations", []);
 
   register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "register", []);
 
@@ -13463,26 +16066,32 @@
 class BlinkServiceWorkerGlobalScope extends BlinkWorkerGlobalScope {
   static final instance = new BlinkServiceWorkerGlobalScope();
 
-  caches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "caches");
-
   clients_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clients");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
-  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fetch", []);
-
-  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0]);
-
-  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0, __arg_1]);
-
   onactivate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onactivate");
 
   onactivate_Setter_(mthis, __arg_0) => mthis["onactivate"] = __arg_0;
 
+  oncrossoriginconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncrossoriginconnect");
+
+  oncrossoriginconnect_Setter_(mthis, __arg_0) => mthis["oncrossoriginconnect"] = __arg_0;
+
+  oncrossoriginmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncrossoriginmessage");
+
+  oncrossoriginmessage_Setter_(mthis, __arg_0) => mthis["oncrossoriginmessage"] = __arg_0;
+
   onfetch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfetch");
 
   onfetch_Setter_(mthis, __arg_0) => mthis["onfetch"] = __arg_0;
 
+  ongeofenceenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ongeofenceenter");
+
+  ongeofenceenter_Setter_(mthis, __arg_0) => mthis["ongeofenceenter"] = __arg_0;
+
+  ongeofenceleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ongeofenceleave");
+
+  ongeofenceleave_Setter_(mthis, __arg_0) => mthis["ongeofenceleave"] = __arg_0;
+
   oninstall_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninstall");
 
   oninstall_Setter_(mthis, __arg_0) => mthis["oninstall"] = __arg_0;
@@ -13491,6 +16100,18 @@
 
   onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
+  onnotificationclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnotificationclick");
+
+  onnotificationclick_Setter_(mthis, __arg_0) => mthis["onnotificationclick"] = __arg_0;
+
+  onnotificationerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnotificationerror");
+
+  onnotificationerror_Setter_(mthis, __arg_0) => mthis["onnotificationerror"] = __arg_0;
+
+  onperiodicsync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onperiodicsync");
+
+  onperiodicsync_Setter_(mthis, __arg_0) => mthis["onperiodicsync"] = __arg_0;
+
   onpush_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpush");
 
   onpush_Setter_(mthis, __arg_0) => mthis["onpush"] = __arg_0;
@@ -13499,7 +16120,40 @@
 
   onsync_Setter_(mthis, __arg_0) => mthis["onsync"] = __arg_0;
 
-  scope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scope");
+  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ports");
+
+  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "registration");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fetch", []);
+
+  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0]);
+
+  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0, __arg_1]);
+
+  skipWaiting_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "skipWaiting", []);
+
+}
+
+class BlinkServiceWorkerMessageEvent extends BlinkEvent {
+  static final instance = new BlinkServiceWorkerMessageEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServiceWorkerMessageEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServiceWorkerMessageEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServiceWorkerMessageEvent"), [__arg_0, __arg_1]);
+
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+
+  lastEventId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastEventId");
+
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+
+  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ports");
+
+  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
 
 }
 
@@ -13508,17 +16162,37 @@
 
   active_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "active");
 
+  geofencing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "geofencing");
+
   installing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "installing");
 
   onupdatefound_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onupdatefound");
 
   onupdatefound_Setter_(mthis, __arg_0) => mthis["onupdatefound"] = __arg_0;
 
+  periodicSync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "periodicSync");
+
+  pushManager_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pushManager");
+
   scope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scope");
 
+  sync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sync");
+
+  waiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "waiting");
+
+  getNotifications_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getNotifications", []);
+
+  getNotifications_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getNotifications", [__arg_0]);
+
+  showNotification_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "showNotification", []);
+
+  showNotification_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "showNotification", [__arg_0]);
+
+  showNotification_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "showNotification", [__arg_0, __arg_1]);
+
   unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregister", []);
 
-  waiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "waiting");
+  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "update", []);
 
 }
 
@@ -13527,6 +16201,18 @@
 
   activeElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeElement");
 
+  delegatesFocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "delegatesFocus");
+
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+
+  innerHTML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerHTML");
+
+  innerHTML_Setter_(mthis, __arg_0) => mthis["innerHTML"] = __arg_0;
+
+  olderShadowRoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "olderShadowRoot");
+
+  styleSheets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleSheets");
+
   cloneNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", []);
 
   cloneNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", [__arg_0]);
@@ -13537,29 +16223,20 @@
 
   elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", [__arg_0, __arg_1]);
 
-  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
+  elementsFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", []);
 
-  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
+  elementsFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", [__arg_0]);
 
-  getElementsByClassName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", []);
-
-  getElementsByClassName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", [__arg_0]);
-
-  getElementsByTagName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", []);
-
-  getElementsByTagName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", [__arg_0]);
+  elementsFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", [__arg_0, __arg_1]);
 
   getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelection", []);
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+}
 
-  innerHTML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerHTML");
+class BlinkSharedArrayBuffer {
+  static final instance = new BlinkSharedArrayBuffer();
 
-  innerHTML_Setter_(mthis, __arg_0) => mthis["innerHTML"] = __arg_0;
-
-  olderShadowRoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "olderShadowRoot");
-
-  styleSheets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleSheets");
+  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteLength");
 
 }
 
@@ -13572,14 +16249,14 @@
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SharedWorker"), [__arg_0, __arg_1]);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
-
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
-
   port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
 
   workerStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "workerStart");
 
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
 }
 
 class BlinkSharedWorkerGlobalScope extends BlinkWorkerGlobalScope {
@@ -13596,18 +16273,6 @@
 class BlinkSourceBuffer extends BlinkEventTarget {
   static final instance = new BlinkSourceBuffer();
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
-
-  appendBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendBuffer", []);
-
-  appendBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendBuffer", [__arg_0]);
-
-  appendStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", []);
-
-  appendStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", [__arg_0]);
-
-  appendStream_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", [__arg_0, __arg_1]);
-
   appendWindowEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appendWindowEnd");
 
   appendWindowEnd_Setter_(mthis, __arg_0) => mthis["appendWindowEnd"] = __arg_0;
@@ -13622,31 +16287,45 @@
 
   mode_Setter_(mthis, __arg_0) => mthis["mode"] = __arg_0;
 
+  timestampOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestampOffset");
+
+  timestampOffset_Setter_(mthis, __arg_0) => mthis["timestampOffset"] = __arg_0;
+
+  trackDefaults_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "trackDefaults");
+
+  trackDefaults_Setter_(mthis, __arg_0) => mthis["trackDefaults"] = __arg_0;
+
+  updating_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "updating");
+
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+
+  appendBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendBuffer", []);
+
+  appendBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendBuffer", [__arg_0]);
+
+  appendStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", []);
+
+  appendStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", [__arg_0]);
+
+  appendStream_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", [__arg_0, __arg_1]);
+
   remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
 
   remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
 
   remove_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0, __arg_1]);
 
-  timestampOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestampOffset");
-
-  timestampOffset_Setter_(mthis, __arg_0) => mthis["timestampOffset"] = __arg_0;
-
-  updating_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "updating");
-
 }
 
 class BlinkSourceBufferList extends BlinkEventTarget {
   static final instance = new BlinkSourceBufferList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkSourceInfo {
@@ -13680,7 +16359,9 @@
 class BlinkSpeechGrammarList {
   static final instance = new BlinkSpeechGrammarList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechGrammarList"), []);
+
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   addFromString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addFromString", []);
 
@@ -13694,23 +16375,21 @@
 
   addFromUri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addFromUri", [__arg_0, __arg_1]);
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechGrammarList"), []);
-
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkSpeechRecognition extends BlinkEventTarget {
   static final instance = new BlinkSpeechRecognition();
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitSpeechRecognition"), []);
 
+  audioTrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "audioTrack");
+
+  audioTrack_Setter_(mthis, __arg_0) => mthis["audioTrack"] = __arg_0;
+
   continuous_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "continuous");
 
   continuous_Setter_(mthis, __arg_0) => mthis["continuous"] = __arg_0;
@@ -13775,6 +16454,12 @@
 
   onstart_Setter_(mthis, __arg_0) => mthis["onstart"] = __arg_0;
 
+  serviceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "serviceURI");
+
+  serviceURI_Setter_(mthis, __arg_0) => mthis["serviceURI"] = __arg_0;
+
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+
   start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
 
   stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
@@ -13793,6 +16478,10 @@
 class BlinkSpeechRecognitionError extends BlinkEvent {
   static final instance = new BlinkSpeechRecognitionError();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionError"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionError"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionError"), [__arg_0, __arg_1]);
 
   error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
@@ -13804,6 +16493,10 @@
 class BlinkSpeechRecognitionEvent extends BlinkEvent {
   static final instance = new BlinkSpeechRecognitionEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionEvent"), [__arg_0, __arg_1]);
 
   emma_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "emma");
@@ -13819,56 +16512,52 @@
 class BlinkSpeechRecognitionResult {
   static final instance = new BlinkSpeechRecognitionResult();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
   isFinal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isFinal");
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkSpeechRecognitionResultList {
   static final instance = new BlinkSpeechRecognitionResultList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkSpeechSynthesis extends BlinkEventTarget {
   static final instance = new BlinkSpeechSynthesis();
 
-  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
-
-  getVoices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVoices", []);
-
   onvoiceschanged_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvoiceschanged");
 
   onvoiceschanged_Setter_(mthis, __arg_0) => mthis["onvoiceschanged"] = __arg_0;
 
-  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
-
   paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "paused");
 
   pending_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pending");
 
+  speaking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speaking");
+
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+
+  getVoices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVoices", []);
+
+  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
+
   resume_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resume", []);
 
   speak_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "speak", []);
 
   speak_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "speak", [__arg_0]);
 
-  speaking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speaking");
-
 }
 
 class BlinkSpeechSynthesisEvent extends BlinkEvent {
@@ -13880,6 +16569,8 @@
 
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
+  utterance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "utterance");
+
 }
 
 class BlinkSpeechSynthesisUtterance extends BlinkEventTarget {
@@ -13958,9 +16649,40 @@
 
 }
 
+class BlinkStashedMessagePort extends BlinkMessagePort {
+  static final instance = new BlinkStashedMessagePort();
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+}
+
+class BlinkStashedPortCollection extends BlinkEventTarget {
+  static final instance = new BlinkStashedPortCollection();
+
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+
+  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
+
+}
+
+class BlinkStereoPannerNode extends BlinkAudioNode {
+  static final instance = new BlinkStereoPannerNode();
+
+  pan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pan");
+
+}
+
 class BlinkStorage {
   static final instance = new BlinkStorage();
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
   $__delete___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__delete__", [__arg_0]);
 
   $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
@@ -13977,8 +16699,6 @@
 
   key_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "key", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
   removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
 
   removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
@@ -13991,29 +16711,24 @@
 
 }
 
+class BlinkStorageErrorCallback {
+  static final instance = new BlinkStorageErrorCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkStorageEvent extends BlinkEvent {
   static final instance = new BlinkStorageEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "StorageEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "StorageEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "StorageEvent"), [__arg_0, __arg_1]);
 
-  initStorageEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", []);
-
-  initStorageEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0]);
-
-  initStorageEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1]);
-
-  initStorageEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2]);
-
-  initStorageEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  initStorageEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  initStorageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
-  initStorageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
-
-  initStorageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
-
   key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "key");
 
   newValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newValue");
@@ -14024,6 +16739,12 @@
 
   url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
 
+  initStorageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  initStorageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  initStorageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
 }
 
 class BlinkStorageInfo {
@@ -14038,6 +16759,8 @@
 class BlinkStorageQuota {
   static final instance = new BlinkStorageQuota();
 
+  supportedTypes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "supportedTypes");
+
   queryInfo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryInfo", []);
 
   queryInfo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryInfo", [__arg_0]);
@@ -14046,7 +16769,25 @@
 
   requestPersistentQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestPersistentQuota", [__arg_0]);
 
-  supportedTypes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "supportedTypes");
+}
+
+class BlinkStorageQuotaCallback {
+  static final instance = new BlinkStorageQuotaCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
+class BlinkStorageUsageCallback {
+  static final instance = new BlinkStorageUsageCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0, __arg_1]);
 
 }
 
@@ -14057,15 +16798,24 @@
 
 }
 
+class BlinkStringCallback {
+  static final instance = new BlinkStringCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+
+}
+
 class BlinkStyleMedia {
   static final instance = new BlinkStyleMedia();
 
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
   matchMedium_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchMedium", []);
 
   matchMedium_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchMedium", [__arg_0]);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
 }
 
 class BlinkStyleSheet {
@@ -14092,14 +16842,14 @@
 class BlinkStyleSheetList {
   static final instance = new BlinkStyleSheetList();
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
   $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkSubtleCrypto {
@@ -14111,6 +16861,12 @@
 
   decrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "decrypt", [__arg_0, __arg_1, __arg_2]);
 
+  deriveBits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deriveBits", [__arg_0]);
+
+  deriveBits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "deriveBits", [__arg_0, __arg_1]);
+
+  deriveBits_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "deriveBits", [__arg_0, __arg_1, __arg_2]);
+
   digest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "digest", []);
 
   digest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "digest", [__arg_0]);
@@ -14129,30 +16885,12 @@
 
   exportKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "exportKey", [__arg_0, __arg_1]);
 
-  generateKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateKey", [__arg_0]);
-
-  generateKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "generateKey", [__arg_0, __arg_1]);
-
-  generateKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "generateKey", [__arg_0, __arg_1, __arg_2]);
-
-  importKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "importKey", [__arg_0, __arg_1, __arg_2]);
-
-  importKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "importKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  importKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "importKey", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
   sign_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sign", [__arg_0]);
 
   sign_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sign", [__arg_0, __arg_1]);
 
   sign_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "sign", [__arg_0, __arg_1, __arg_2]);
 
-  unwrapKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "unwrapKey", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  unwrapKey_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "unwrapKey", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
-  unwrapKey_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "unwrapKey", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
-
   verify_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "verify", [__arg_0, __arg_1]);
 
   verify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "verify", [__arg_0, __arg_1, __arg_2]);
@@ -14167,63 +16905,58 @@
 
 }
 
+class BlinkSyncEvent extends BlinkExtendableEvent {
+  static final instance = new BlinkSyncEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SyncEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SyncEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SyncEvent"), [__arg_0, __arg_1]);
+
+  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "registration");
+
+}
+
+class BlinkSyncManager {
+  static final instance = new BlinkSyncManager();
+
+  getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", []);
+
+  getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", [__arg_0]);
+
+  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistrations", []);
+
+  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "permissionState", []);
+
+  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "register", []);
+
+  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "register", [__arg_0]);
+
+}
+
+class BlinkSyncRegistration {
+  static final instance = new BlinkSyncRegistration();
+
+  tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tag");
+
+  unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregister", []);
+
+}
+
 class BlinkText extends BlinkCharacterData {
   static final instance = new BlinkText();
 
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Text"), []);
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Text"), [__arg_0]);
+  wholeText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wholeText");
 
   getDestinationInsertionPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDestinationInsertionPoints", []);
 
-  replaceWholeText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWholeText", []);
-
-  replaceWholeText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWholeText", [__arg_0]);
-
   splitText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "splitText", []);
 
   splitText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "splitText", [__arg_0]);
 
-  wholeText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wholeText");
-
-}
-
-class BlinkTextDecoder {
-  static final instance = new BlinkTextDecoder();
-
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TextDecoder"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TextDecoder"), [__arg_0]);
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TextDecoder"), [__arg_0, __arg_1]);
-
-  decode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "decode", []);
-
-  decode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "decode", [__arg_0]);
-
-  decode_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "decode", [__arg_0, __arg_1]);
-
-  encoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "encoding");
-
-  fatal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fatal");
-
-  ignoreBOM_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ignoreBOM");
-
-}
-
-class BlinkTextEncoder {
-  static final instance = new BlinkTextEncoder();
-
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TextEncoder"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TextEncoder"), [__arg_0]);
-
-  encode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "encode", []);
-
-  encode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "encode", [__arg_0]);
-
-  encoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "encoding");
-
 }
 
 class BlinkTextEvent extends BlinkUIEvent {
@@ -14231,12 +16964,6 @@
 
   data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
 
-  initTextEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initTextEvent", []);
-
-  initTextEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initTextEvent", [__arg_0]);
-
-  initTextEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initTextEvent", [__arg_0, __arg_1]);
-
   initTextEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initTextEvent", [__arg_0, __arg_1, __arg_2]);
 
   initTextEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initTextEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
@@ -14279,14 +17006,6 @@
 
   activeCues_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeCues");
 
-  addCue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addCue", []);
-
-  addCue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addCue", [__arg_0]);
-
-  addRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addRegion", []);
-
-  addRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addRegion", [__arg_0]);
-
   cues_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cues");
 
   id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
@@ -14307,6 +17026,14 @@
 
   regions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "regions");
 
+  addCue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addCue", []);
+
+  addCue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addCue", [__arg_0]);
+
+  addRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addRegion", []);
+
+  addRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addRegion", [__arg_0]);
+
   removeCue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeCue", []);
 
   removeCue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeCue", [__arg_0]);
@@ -14351,7 +17078,7 @@
 class BlinkTextTrackCueList {
   static final instance = new BlinkTextTrackCueList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   getCueById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCueById", []);
 
@@ -14361,23 +17088,11 @@
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkTextTrackList extends BlinkEventTarget {
   static final instance = new BlinkTextTrackList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
-
-  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
-
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
   length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
@@ -14392,61 +17107,35 @@
 
   onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
 
+  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
+
+  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
+
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
 }
 
 class BlinkTimeRanges {
   static final instance = new BlinkTimeRanges();
 
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+
   end_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "end", []);
 
   end_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "end", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
   start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
 
   start_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "start", [__arg_0]);
 
 }
 
-class BlinkTiming {
-  static final instance = new BlinkTiming();
+class BlinkTimeoutHandler {
+  static final instance = new BlinkTimeoutHandler();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
-
-  delay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "delay");
-
-  delay_Setter_(mthis, __arg_0) => mthis["delay"] = __arg_0;
-
-  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
-
-  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
-
-  easing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "easing");
-
-  easing_Setter_(mthis, __arg_0) => mthis["easing"] = __arg_0;
-
-  endDelay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endDelay");
-
-  endDelay_Setter_(mthis, __arg_0) => mthis["endDelay"] = __arg_0;
-
-  fill_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fill");
-
-  fill_Setter_(mthis, __arg_0) => mthis["fill"] = __arg_0;
-
-  iterationStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iterationStart");
-
-  iterationStart_Setter_(mthis, __arg_0) => mthis["iterationStart"] = __arg_0;
-
-  iterations_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iterations");
-
-  iterations_Setter_(mthis, __arg_0) => mthis["iterations"] = __arg_0;
-
-  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
-
-  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
 
 }
 
@@ -14469,6 +17158,8 @@
 
   radiusY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radiusY");
 
+  rotationAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rotationAngle");
+
   screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenX");
 
   screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenY");
@@ -14494,34 +17185,6 @@
 
   ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ctrlKey");
 
-  initTouchEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", []);
-
-  initTouchEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0]);
-
-  initTouchEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
-
-  initTouchEvent_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
-
-  initTouchEvent_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11]);
-
-  initTouchEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12]);
-
-  initTouchEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1]);
-
-  initTouchEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2]);
-
-  initTouchEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  initTouchEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  initTouchEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
-  initTouchEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
-
-  initTouchEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
-
-  initTouchEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
-
   metaKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "metaKey");
 
   shiftKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shiftKey");
@@ -14530,24 +17193,70 @@
 
   touches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "touches");
 
+  initTouchEvent_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
+
+  initTouchEvent_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11]);
+
+  initTouchEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12]);
+
 }
 
 class BlinkTouchList {
   static final instance = new BlinkTouchList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
+}
+
+class BlinkTrackDefault {
+  static final instance = new BlinkTrackDefault();
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefault"), [__arg_0, __arg_1]);
+
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefault"), [__arg_0, __arg_1, __arg_2]);
+
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefault"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefault"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  byteStreamTrackID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteStreamTrackID");
+
+  kinds_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kinds");
+
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+}
+
+class BlinkTrackDefaultList {
+  static final instance = new BlinkTrackDefaultList();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefaultList"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefaultList"), [__arg_0]);
+
   length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+
 }
 
 class BlinkTrackEvent extends BlinkEvent {
   static final instance = new BlinkTrackEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackEvent"), [__arg_0, __arg_1]);
 
   track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "track");
@@ -14557,6 +17266,10 @@
 class BlinkTransitionEvent extends BlinkEvent {
   static final instance = new BlinkTransitionEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TransitionEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TransitionEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TransitionEvent"), [__arg_0, __arg_1]);
 
   elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elapsedTime");
@@ -14574,10 +17287,12 @@
 
   currentNode_Setter_(mthis, __arg_0) => mthis["currentNode"] = __arg_0;
 
-  expandEntityReferences_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "expandEntityReferences");
-
   filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filter");
 
+  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "root");
+
+  whatToShow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "whatToShow");
+
   firstChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "firstChild", []);
 
   lastChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lastChild", []);
@@ -14592,26 +17307,28 @@
 
   previousSibling_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "previousSibling", []);
 
-  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "root");
-
-  whatToShow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "whatToShow");
-
 }
 
 class BlinkUIEvent extends BlinkEvent {
   static final instance = new BlinkUIEvent();
 
-  charCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charCode");
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "UIEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "UIEvent"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "UIEvent"), [__arg_0, __arg_1]);
 
+  charCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charCode");
+
   detail_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "detail");
 
-  initUIEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initUIEvent", []);
+  keyCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyCode");
 
-  initUIEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initUIEvent", [__arg_0]);
+  sourceDevice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceDevice");
 
-  initUIEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initUIEvent", [__arg_0, __arg_1]);
+  view_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "view");
+
+  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "which");
 
   initUIEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initUIEvent", [__arg_0, __arg_1, __arg_2]);
 
@@ -14619,20 +17336,6 @@
 
   initUIEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initUIEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  keyCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyCode");
-
-  layerX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "layerX");
-
-  layerY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "layerY");
-
-  pageX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageX");
-
-  pageY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageY");
-
-  view_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "view");
-
-  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "which");
-
 }
 
 class BlinkURL {
@@ -14648,6 +17351,10 @@
 
   createObjectURL_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "createObjectURL", [__arg_0]);
 
+  revokeObjectURL_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "revokeObjectURL", []);
+
+  revokeObjectURL_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "revokeObjectURL", [__arg_0]);
+
   hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
 
   hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
@@ -14682,36 +17389,196 @@
 
   protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
 
-  revokeObjectURL_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "revokeObjectURL", []);
-
-  revokeObjectURL_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "revokeObjectURL", [__arg_0]);
-
   search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
 
   search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
-
   username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
 
   username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
 
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+
+}
+
+class BlinkURLUtils {
+  static final instance = new BlinkURLUtils();
+
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+
+  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
+
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+
+  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
+
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+
+  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
+
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+
+  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
+
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+
+  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
+
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+
+  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
+
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+
+  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
+
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+
+  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+
+  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
+
+  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
+
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+
+}
+
+class BlinkURLUtilsReadOnly {
+  static final instance = new BlinkURLUtilsReadOnly();
+
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+
+}
+
+class BlinkUint16Array extends BlinkArrayBufferView {
+  static final instance = new BlinkUint16Array();
+
+}
+
+class BlinkUint32Array extends BlinkArrayBufferView {
+  static final instance = new BlinkUint32Array();
+
+}
+
+class BlinkUint8Array extends BlinkArrayBufferView {
+  static final instance = new BlinkUint8Array();
+
+}
+
+class BlinkUint8ClampedArray extends BlinkArrayBufferView {
+  static final instance = new BlinkUint8ClampedArray();
+
+}
+
+class BlinkVRDevice {
+  static final instance = new BlinkVRDevice();
+
+  deviceId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deviceId");
+
+  deviceName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deviceName");
+
+  hardwareUnitId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareUnitId");
+
+}
+
+class BlinkVREyeParameters {
+  static final instance = new BlinkVREyeParameters();
+
+  currentFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentFieldOfView");
+
+  eyeTranslation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "eyeTranslation");
+
+  maximumFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maximumFieldOfView");
+
+  minimumFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minimumFieldOfView");
+
+  recommendedFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "recommendedFieldOfView");
+
+  renderRect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "renderRect");
+
+}
+
+class BlinkVRFieldOfView {
+  static final instance = new BlinkVRFieldOfView();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VRFieldOfView"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VRFieldOfView"), [__arg_0]);
+
+  downDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "downDegrees");
+
+  downDegrees_Setter_(mthis, __arg_0) => mthis["downDegrees"] = __arg_0;
+
+  leftDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "leftDegrees");
+
+  leftDegrees_Setter_(mthis, __arg_0) => mthis["leftDegrees"] = __arg_0;
+
+  rightDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rightDegrees");
+
+  rightDegrees_Setter_(mthis, __arg_0) => mthis["rightDegrees"] = __arg_0;
+
+  upDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upDegrees");
+
+  upDegrees_Setter_(mthis, __arg_0) => mthis["upDegrees"] = __arg_0;
+
+}
+
+class BlinkVRPositionState {
+  static final instance = new BlinkVRPositionState();
+
+  angularAcceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angularAcceleration");
+
+  angularVelocity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angularVelocity");
+
+  linearAcceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "linearAcceleration");
+
+  linearVelocity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "linearVelocity");
+
+  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientation");
+
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+
+  timeStamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeStamp");
+
 }
 
 class BlinkVTTCue extends BlinkTextTrackCue {
   static final instance = new BlinkVTTCue();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
-
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
-
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VTTCue"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VTTCue"), [__arg_0, __arg_1]);
 
   constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VTTCue"), [__arg_0, __arg_1, __arg_2]);
 
-  getCueAsHTML_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCueAsHTML", []);
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
 
   line_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "line");
 
@@ -14741,6 +17608,8 @@
 
   vertical_Setter_(mthis, __arg_0) => mthis["vertical"] = __arg_0;
 
+  getCueAsHTML_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCueAsHTML", []);
+
 }
 
 class BlinkVTTRegion {
@@ -14787,7 +17656,7 @@
 class BlinkVTTRegionList {
   static final instance = new BlinkVTTRegionList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   getRegionById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegionById", []);
 
@@ -14797,8 +17666,6 @@
 
   item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
 }
 
 class BlinkValidityState {
@@ -14818,6 +17685,8 @@
 
   tooLong_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tooLong");
 
+  tooShort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tooShort");
+
   typeMismatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "typeMismatch");
 
   valid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valid");
@@ -14859,12 +17728,6 @@
 class BlinkVideoTrackList extends BlinkEventTarget {
   static final instance = new BlinkVideoTrackList();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
-
-  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
-
   length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
 
   onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
@@ -14881,6 +17744,19 @@
 
   selectedIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedIndex");
 
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+
+  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
+
+  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
+
+}
+
+class BlinkVoidCallback {
+  static final instance = new BlinkVoidCallback();
+
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+
 }
 
 class BlinkWaveShaperNode extends BlinkAudioNode {
@@ -14896,138 +17772,14 @@
 
 }
 
-class BlinkWebGLActiveInfo {
-  static final instance = new BlinkWebGLActiveInfo();
+class BlinkWebGL2RenderingContext {
+  static final instance = new BlinkWebGL2RenderingContext();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
-
-}
-
-class BlinkWebGLBuffer {
-  static final instance = new BlinkWebGLBuffer();
-
-}
-
-class BlinkWebGLCompressedTextureATC {
-  static final instance = new BlinkWebGLCompressedTextureATC();
-
-}
-
-class BlinkWebGLCompressedTextureETC1 {
-  static final instance = new BlinkWebGLCompressedTextureETC1();
-
-}
-
-class BlinkWebGLCompressedTexturePVRTC {
-  static final instance = new BlinkWebGLCompressedTexturePVRTC();
-
-}
-
-class BlinkWebGLCompressedTextureS3TC {
-  static final instance = new BlinkWebGLCompressedTextureS3TC();
-
-}
-
-class BlinkWebGLContextAttributes {
-  static final instance = new BlinkWebGLContextAttributes();
-
-  alpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alpha");
-
-  alpha_Setter_(mthis, __arg_0) => mthis["alpha"] = __arg_0;
-
-  antialias_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "antialias");
-
-  antialias_Setter_(mthis, __arg_0) => mthis["antialias"] = __arg_0;
-
-  depth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "depth");
-
-  depth_Setter_(mthis, __arg_0) => mthis["depth"] = __arg_0;
-
-  failIfMajorPerformanceCaveat_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "failIfMajorPerformanceCaveat");
-
-  failIfMajorPerformanceCaveat_Setter_(mthis, __arg_0) => mthis["failIfMajorPerformanceCaveat"] = __arg_0;
-
-  premultipliedAlpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "premultipliedAlpha");
-
-  premultipliedAlpha_Setter_(mthis, __arg_0) => mthis["premultipliedAlpha"] = __arg_0;
-
-  preserveDrawingBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveDrawingBuffer");
-
-  preserveDrawingBuffer_Setter_(mthis, __arg_0) => mthis["preserveDrawingBuffer"] = __arg_0;
-
-  stencil_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stencil");
-
-  stencil_Setter_(mthis, __arg_0) => mthis["stencil"] = __arg_0;
-
-}
-
-class BlinkWebGLContextEvent extends BlinkEvent {
-  static final instance = new BlinkWebGLContextEvent();
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebGLContextEvent"), [__arg_0, __arg_1]);
-
-  statusMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusMessage");
-
-}
-
-class BlinkWebGLDebugRendererInfo {
-  static final instance = new BlinkWebGLDebugRendererInfo();
-
-}
-
-class BlinkWebGLDebugShaders {
-  static final instance = new BlinkWebGLDebugShaders();
-
-  getTranslatedShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTranslatedShaderSource", []);
-
-  getTranslatedShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTranslatedShaderSource", [__arg_0]);
-
-}
-
-class BlinkWebGLDepthTexture {
-  static final instance = new BlinkWebGLDepthTexture();
-
-}
-
-class BlinkWebGLDrawBuffers {
-  static final instance = new BlinkWebGLDrawBuffers();
-
-  drawBuffersWEBGL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffersWEBGL", []);
-
-  drawBuffersWEBGL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffersWEBGL", [__arg_0]);
-
-}
-
-class BlinkWebGLFramebuffer {
-  static final instance = new BlinkWebGLFramebuffer();
-
-}
-
-class BlinkWebGLLoseContext {
-  static final instance = new BlinkWebGLLoseContext();
-
-  loseContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "loseContext", []);
-
-  restoreContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "restoreContext", []);
-
-}
-
-class BlinkWebGLProgram {
-  static final instance = new BlinkWebGLProgram();
-
-}
-
-class BlinkWebGLRenderbuffer {
-  static final instance = new BlinkWebGLRenderbuffer();
-
-}
-
-class BlinkWebGLRenderingContext {
-  static final instance = new BlinkWebGLRenderingContext();
+  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
 
   activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", []);
 
@@ -15075,15 +17827,21 @@
 
   blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
+  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+
+  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+
   blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", []);
 
   blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0]);
 
   blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0, __arg_1]);
 
-  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
 
-  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
+
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
 
   blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1]);
 
@@ -15091,12 +17849,6 @@
 
   blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
-
-  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
-
-  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
-
   bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0]);
 
   bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1]);
@@ -15109,12 +17861,14 @@
 
   bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
-
   checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", []);
 
   checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", [__arg_0]);
 
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+
   clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1]);
 
   clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2]);
@@ -15129,10 +17883,6 @@
 
   clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
-
-  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
-
   colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1]);
 
   colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2]);
@@ -15229,14 +17979,14 @@
 
   detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0, __arg_1]);
 
-  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
-
-  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
-
   disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disable", []);
 
   disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disable", [__arg_0]);
 
+  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
+
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
+
   drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0]);
 
   drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1]);
@@ -15249,18 +17999,14 @@
 
   drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
+  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
 
-  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
+  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
 
   enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", []);
 
   enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", [__arg_0]);
 
-  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
-
-  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
-
   finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
 
   flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flush", []);
@@ -15375,23 +18121,17 @@
 
   getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0, __arg_1]);
 
-  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
-
-  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
-
-  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
-
   getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", []);
 
   getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0]);
 
   getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0, __arg_1]);
 
-  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
 
-  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
 
-  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
 
   getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", []);
 
@@ -15399,6 +18139,12 @@
 
   getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0, __arg_1]);
 
+  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+
   hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hint", []);
 
   hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0]);
@@ -15485,17 +18231,21 @@
 
   shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0, __arg_1]);
 
+  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
+
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+
   stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1]);
 
   stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
   stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
 
-  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
-
-  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
 
   stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", []);
 
@@ -15503,9 +18253,11 @@
 
   stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0, __arg_1]);
 
-  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
+  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0]);
 
-  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1]);
+
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1, __arg_2]);
 
   stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1]);
 
@@ -15513,12 +18265,1669 @@
 
   stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0]);
+
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1]);
+
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1, __arg_2]);
+
+  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0]);
+
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1]);
+
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1, __arg_2]);
+
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", []);
+
+  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0]);
+
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0, __arg_1]);
+
+  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", []);
+
+  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0]);
+
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0, __arg_1]);
+
+  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", []);
+
+  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0]);
+
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0, __arg_1]);
+
+  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", []);
+
+  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0]);
+
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0, __arg_1]);
+
+  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0]);
+
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1]);
+
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", []);
+
+  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0]);
+
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0, __arg_1]);
+
+  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0]);
+
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1]);
+
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", []);
+
+  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0]);
+
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0, __arg_1]);
+
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1]);
+
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", []);
+
+  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0]);
+
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0, __arg_1]);
+
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1]);
+
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", []);
+
+  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0]);
+
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0, __arg_1]);
+
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", []);
+
+  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0]);
+
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0, __arg_1]);
+
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", []);
+
+  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0]);
+
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0, __arg_1]);
+
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0]);
+
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1]);
+
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0]);
+
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1]);
+
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0]);
+
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1]);
+
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
+
+  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", []);
+
+  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", [__arg_0]);
+
+  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", []);
+
+  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", [__arg_0]);
+
+  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", []);
+
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0]);
+
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0, __arg_1]);
+
+  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", []);
+
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0]);
+
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0, __arg_1]);
+
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0]);
+
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1]);
+
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", []);
+
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0]);
+
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0, __arg_1]);
+
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1]);
+
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", []);
+
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0]);
+
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0, __arg_1]);
+
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", []);
+
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0]);
+
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0, __arg_1]);
+
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1]);
+
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2]);
+
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  beginQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", []);
+
+  beginQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", [__arg_0]);
+
+  beginQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", [__arg_0, __arg_1]);
+
+  beginTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginTransformFeedback", []);
+
+  beginTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginTransformFeedback", [__arg_0]);
+
+  bindBufferBase_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0]);
+
+  bindBufferBase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0, __arg_1]);
+
+  bindBufferBase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0, __arg_1, __arg_2]);
+
+  bindBufferRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2]);
+
+  bindBufferRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  bindBufferRange_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  bindSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", []);
+
+  bindSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", [__arg_0]);
+
+  bindSampler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", [__arg_0, __arg_1]);
+
+  bindTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", []);
+
+  bindTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", [__arg_0]);
+
+  bindTransformFeedback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", [__arg_0, __arg_1]);
+
+  bindVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArray", []);
+
+  bindVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArray", [__arg_0]);
+
+  blitFramebuffer_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  blitFramebuffer_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  blitFramebuffer_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  clearBufferfi_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1]);
+
+  clearBufferfi_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1, __arg_2]);
+
+  clearBufferfi_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  clearBufferfv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0]);
+
+  clearBufferfv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0, __arg_1]);
+
+  clearBufferfv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0, __arg_1, __arg_2]);
+
+  clearBufferiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0]);
+
+  clearBufferiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0, __arg_1]);
+
+  clearBufferiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0, __arg_1, __arg_2]);
+
+  clearBufferuiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0]);
+
+  clearBufferuiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0, __arg_1]);
+
+  clearBufferuiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0, __arg_1, __arg_2]);
+
+  clientWaitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0]);
+
+  clientWaitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0, __arg_1]);
+
+  clientWaitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0, __arg_1, __arg_2]);
+
+  compressedTexImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  compressedTexImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  compressedTexImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  compressedTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  compressedTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  compressedTexSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  copyBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2]);
+
+  copyBufferSubData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  copyBufferSubData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  copyTexSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  copyTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  copyTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  createQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createQuery", []);
+
+  createSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSampler", []);
+
+  createTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTransformFeedback", []);
+
+  createVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createVertexArray", []);
+
+  deleteQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteQuery", []);
+
+  deleteQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteQuery", [__arg_0]);
+
+  deleteSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteSampler", []);
+
+  deleteSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteSampler", [__arg_0]);
+
+  deleteSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteSync", []);
+
+  deleteSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteSync", [__arg_0]);
+
+  deleteTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTransformFeedback", []);
+
+  deleteTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTransformFeedback", [__arg_0]);
+
+  deleteVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArray", []);
+
+  deleteVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArray", [__arg_0]);
+
+  drawArraysInstanced_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1]);
+
+  drawArraysInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2]);
+
+  drawArraysInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  drawBuffers_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffers", []);
+
+  drawBuffers_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffers", [__arg_0]);
+
+  drawElementsInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2]);
+
+  drawElementsInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  drawElementsInstanced_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  drawRangeElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  drawRangeElements_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  drawRangeElements_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  endQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endQuery", []);
+
+  endQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endQuery", [__arg_0]);
+
+  endTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endTransformFeedback", []);
+
+  fenceSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", []);
+
+  fenceSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", [__arg_0]);
+
+  fenceSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", [__arg_0, __arg_1]);
+
+  framebufferTextureLayer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2]);
+
+  framebufferTextureLayer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  framebufferTextureLayer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  getActiveUniformBlockName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", []);
+
+  getActiveUniformBlockName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", [__arg_0]);
+
+  getActiveUniformBlockName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", [__arg_0, __arg_1]);
+
+  getActiveUniformBlockParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0]);
+
+  getActiveUniformBlockParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0, __arg_1]);
+
+  getActiveUniformBlockParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0, __arg_1, __arg_2]);
+
+  getActiveUniforms_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0]);
+
+  getActiveUniforms_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0, __arg_1]);
+
+  getActiveUniforms_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0, __arg_1, __arg_2]);
+
+  getBufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0]);
+
+  getBufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0, __arg_1]);
+
+  getBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0, __arg_1, __arg_2]);
+
+  getFragDataLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", []);
+
+  getFragDataLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", [__arg_0]);
+
+  getFragDataLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", [__arg_0, __arg_1]);
+
+  getIndexedParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", []);
+
+  getIndexedParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", [__arg_0]);
+
+  getIndexedParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", [__arg_0, __arg_1]);
+
+  getInternalformatParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0]);
+
+  getInternalformatParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0, __arg_1]);
+
+  getInternalformatParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0, __arg_1, __arg_2]);
+
+  getQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", []);
+
+  getQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", [__arg_0]);
+
+  getQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", [__arg_0, __arg_1]);
+
+  getQueryParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", []);
+
+  getQueryParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", [__arg_0]);
+
+  getQueryParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", [__arg_0, __arg_1]);
+
+  getSamplerParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", []);
+
+  getSamplerParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", [__arg_0]);
+
+  getSamplerParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", [__arg_0, __arg_1]);
+
+  getSyncParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", []);
+
+  getSyncParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", [__arg_0]);
+
+  getSyncParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", [__arg_0, __arg_1]);
+
+  getTransformFeedbackVarying_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", []);
+
+  getTransformFeedbackVarying_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", [__arg_0]);
+
+  getTransformFeedbackVarying_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", [__arg_0, __arg_1]);
+
+  getUniformBlockIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", []);
+
+  getUniformBlockIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", [__arg_0]);
+
+  getUniformBlockIndex_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", [__arg_0, __arg_1]);
+
+  getUniformIndices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", []);
+
+  getUniformIndices_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", [__arg_0]);
+
+  getUniformIndices_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", [__arg_0, __arg_1]);
+
+  invalidateFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", []);
+
+  invalidateFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", [__arg_0]);
+
+  invalidateFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", [__arg_0, __arg_1]);
+
+  invalidateSubFramebuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  invalidateSubFramebuffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  invalidateSubFramebuffer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  isQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isQuery", []);
+
+  isQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isQuery", [__arg_0]);
+
+  isSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSampler", []);
+
+  isSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSampler", [__arg_0]);
+
+  isSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSync", []);
+
+  isSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSync", [__arg_0]);
+
+  isTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTransformFeedback", []);
+
+  isTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTransformFeedback", [__arg_0]);
+
+  isVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArray", []);
+
+  isVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArray", [__arg_0]);
+
+  pauseTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pauseTransformFeedback", []);
+
+  readBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readBuffer", []);
+
+  readBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readBuffer", [__arg_0]);
+
+  renderbufferStorageMultisample_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2]);
+
+  renderbufferStorageMultisample_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  renderbufferStorageMultisample_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  resumeTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resumeTransformFeedback", []);
+
+  samplerParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0]);
+
+  samplerParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0, __arg_1]);
+
+  samplerParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0, __arg_1, __arg_2]);
+
+  samplerParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0]);
+
+  samplerParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0, __arg_1]);
+
+  samplerParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0, __arg_1, __arg_2]);
+
+  texImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  texImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  texStorage2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2]);
+
+  texStorage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texStorage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texStorage3D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texStorage3D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texStorage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texSubImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  texSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  texSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  texSubImage3D_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
+
+  transformFeedbackVaryings_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0]);
+
+  transformFeedbackVaryings_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0, __arg_1]);
+
+  transformFeedbackVaryings_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0, __arg_1, __arg_2]);
+
+  uniform1ui_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", []);
+
+  uniform1ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", [__arg_0]);
+
+  uniform1ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", [__arg_0, __arg_1]);
+
+  uniform1uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", []);
+
+  uniform1uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", [__arg_0]);
+
+  uniform1uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", [__arg_0, __arg_1]);
+
+  uniform2ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0]);
+
+  uniform2ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0, __arg_1]);
+
+  uniform2ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0, __arg_1, __arg_2]);
+
+  uniform2uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", []);
+
+  uniform2uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", [__arg_0]);
+
+  uniform2uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", [__arg_0, __arg_1]);
+
+  uniform3ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1]);
+
+  uniform3ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1, __arg_2]);
+
+  uniform3ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform3uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", []);
+
+  uniform3uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", [__arg_0]);
+
+  uniform3uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", [__arg_0, __arg_1]);
+
+  uniform4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2]);
+
+  uniform4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  uniform4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", []);
+
+  uniform4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", [__arg_0]);
+
+  uniform4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", [__arg_0, __arg_1]);
+
+  uniformBlockBinding_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0]);
+
+  uniformBlockBinding_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0, __arg_1]);
+
+  uniformBlockBinding_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix2x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0]);
+
+  uniformMatrix2x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0, __arg_1]);
+
+  uniformMatrix2x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix2x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0]);
+
+  uniformMatrix2x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0, __arg_1]);
+
+  uniformMatrix2x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix3x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0]);
+
+  uniformMatrix3x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0, __arg_1]);
+
+  uniformMatrix3x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix3x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0]);
+
+  uniformMatrix3x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0, __arg_1]);
+
+  uniformMatrix3x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix4x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0]);
+
+  uniformMatrix4x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0, __arg_1]);
+
+  uniformMatrix4x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix4x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0]);
+
+  uniformMatrix4x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0, __arg_1]);
+
+  uniformMatrix4x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttribDivisor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", []);
+
+  vertexAttribDivisor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", [__arg_0]);
+
+  vertexAttribDivisor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", [__arg_0, __arg_1]);
+
+  vertexAttribI4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttribI4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribI4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttribI4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", []);
+
+  vertexAttribI4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", [__arg_0]);
+
+  vertexAttribI4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", [__arg_0, __arg_1]);
+
+  vertexAttribI4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttribI4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribI4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttribI4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", []);
+
+  vertexAttribI4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", [__arg_0]);
+
+  vertexAttribI4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", [__arg_0, __arg_1]);
+
+  vertexAttribIPointer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttribIPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribIPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  waitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0]);
+
+  waitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0, __arg_1]);
+
+  waitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0, __arg_1, __arg_2]);
+
+}
+
+class BlinkWebGL2RenderingContextBase {
+  static final instance = new BlinkWebGL2RenderingContextBase();
+
+  beginQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", []);
+
+  beginQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", [__arg_0]);
+
+  beginQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", [__arg_0, __arg_1]);
+
+  beginTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginTransformFeedback", []);
+
+  beginTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginTransformFeedback", [__arg_0]);
+
+  bindBufferBase_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0]);
+
+  bindBufferBase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0, __arg_1]);
+
+  bindBufferBase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0, __arg_1, __arg_2]);
+
+  bindBufferRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2]);
+
+  bindBufferRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  bindBufferRange_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  bindSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", []);
+
+  bindSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", [__arg_0]);
+
+  bindSampler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", [__arg_0, __arg_1]);
+
+  bindTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", []);
+
+  bindTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", [__arg_0]);
+
+  bindTransformFeedback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", [__arg_0, __arg_1]);
+
+  bindVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArray", []);
+
+  bindVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArray", [__arg_0]);
+
+  blitFramebuffer_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  blitFramebuffer_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  blitFramebuffer_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  clearBufferfi_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1]);
+
+  clearBufferfi_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1, __arg_2]);
+
+  clearBufferfi_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  clearBufferfv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0]);
+
+  clearBufferfv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0, __arg_1]);
+
+  clearBufferfv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0, __arg_1, __arg_2]);
+
+  clearBufferiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0]);
+
+  clearBufferiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0, __arg_1]);
+
+  clearBufferiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0, __arg_1, __arg_2]);
+
+  clearBufferuiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0]);
+
+  clearBufferuiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0, __arg_1]);
+
+  clearBufferuiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0, __arg_1, __arg_2]);
+
+  clientWaitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0]);
+
+  clientWaitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0, __arg_1]);
+
+  clientWaitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0, __arg_1, __arg_2]);
+
+  compressedTexImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  compressedTexImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  compressedTexImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  compressedTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  compressedTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  compressedTexSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  copyBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2]);
+
+  copyBufferSubData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  copyBufferSubData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  copyTexSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  copyTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  copyTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  createQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createQuery", []);
+
+  createSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSampler", []);
+
+  createTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTransformFeedback", []);
+
+  createVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createVertexArray", []);
+
+  deleteQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteQuery", []);
+
+  deleteQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteQuery", [__arg_0]);
+
+  deleteSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteSampler", []);
+
+  deleteSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteSampler", [__arg_0]);
+
+  deleteSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteSync", []);
+
+  deleteSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteSync", [__arg_0]);
+
+  deleteTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTransformFeedback", []);
+
+  deleteTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTransformFeedback", [__arg_0]);
+
+  deleteVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArray", []);
+
+  deleteVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArray", [__arg_0]);
+
+  drawArraysInstanced_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1]);
+
+  drawArraysInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2]);
+
+  drawArraysInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  drawBuffers_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffers", []);
+
+  drawBuffers_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffers", [__arg_0]);
+
+  drawElementsInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2]);
+
+  drawElementsInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  drawElementsInstanced_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  drawRangeElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  drawRangeElements_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  drawRangeElements_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  endQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endQuery", []);
+
+  endQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endQuery", [__arg_0]);
+
+  endTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endTransformFeedback", []);
+
+  fenceSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", []);
+
+  fenceSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", [__arg_0]);
+
+  fenceSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", [__arg_0, __arg_1]);
+
+  framebufferTextureLayer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2]);
+
+  framebufferTextureLayer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  framebufferTextureLayer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  getActiveUniformBlockName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", []);
+
+  getActiveUniformBlockName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", [__arg_0]);
+
+  getActiveUniformBlockName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", [__arg_0, __arg_1]);
+
+  getActiveUniformBlockParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0]);
+
+  getActiveUniformBlockParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0, __arg_1]);
+
+  getActiveUniformBlockParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0, __arg_1, __arg_2]);
+
+  getActiveUniforms_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0]);
+
+  getActiveUniforms_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0, __arg_1]);
+
+  getActiveUniforms_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0, __arg_1, __arg_2]);
+
+  getBufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0]);
+
+  getBufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0, __arg_1]);
+
+  getBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0, __arg_1, __arg_2]);
+
+  getFragDataLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", []);
+
+  getFragDataLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", [__arg_0]);
+
+  getFragDataLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", [__arg_0, __arg_1]);
+
+  getIndexedParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", []);
+
+  getIndexedParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", [__arg_0]);
+
+  getIndexedParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", [__arg_0, __arg_1]);
+
+  getInternalformatParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0]);
+
+  getInternalformatParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0, __arg_1]);
+
+  getInternalformatParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0, __arg_1, __arg_2]);
+
+  getQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", []);
+
+  getQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", [__arg_0]);
+
+  getQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", [__arg_0, __arg_1]);
+
+  getQueryParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", []);
+
+  getQueryParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", [__arg_0]);
+
+  getQueryParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", [__arg_0, __arg_1]);
+
+  getSamplerParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", []);
+
+  getSamplerParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", [__arg_0]);
+
+  getSamplerParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", [__arg_0, __arg_1]);
+
+  getSyncParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", []);
+
+  getSyncParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", [__arg_0]);
+
+  getSyncParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", [__arg_0, __arg_1]);
+
+  getTransformFeedbackVarying_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", []);
+
+  getTransformFeedbackVarying_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", [__arg_0]);
+
+  getTransformFeedbackVarying_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", [__arg_0, __arg_1]);
+
+  getUniformBlockIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", []);
+
+  getUniformBlockIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", [__arg_0]);
+
+  getUniformBlockIndex_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", [__arg_0, __arg_1]);
+
+  getUniformIndices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", []);
+
+  getUniformIndices_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", [__arg_0]);
+
+  getUniformIndices_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", [__arg_0, __arg_1]);
+
+  invalidateFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", []);
+
+  invalidateFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", [__arg_0]);
+
+  invalidateFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", [__arg_0, __arg_1]);
+
+  invalidateSubFramebuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  invalidateSubFramebuffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  invalidateSubFramebuffer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  isQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isQuery", []);
+
+  isQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isQuery", [__arg_0]);
+
+  isSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSampler", []);
+
+  isSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSampler", [__arg_0]);
+
+  isSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSync", []);
+
+  isSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSync", [__arg_0]);
+
+  isTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTransformFeedback", []);
+
+  isTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTransformFeedback", [__arg_0]);
+
+  isVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArray", []);
+
+  isVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArray", [__arg_0]);
+
+  pauseTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pauseTransformFeedback", []);
+
+  readBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readBuffer", []);
+
+  readBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readBuffer", [__arg_0]);
+
+  renderbufferStorageMultisample_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2]);
+
+  renderbufferStorageMultisample_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  renderbufferStorageMultisample_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  resumeTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resumeTransformFeedback", []);
+
+  samplerParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0]);
+
+  samplerParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0, __arg_1]);
+
+  samplerParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0, __arg_1, __arg_2]);
+
+  samplerParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0]);
+
+  samplerParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0, __arg_1]);
+
+  samplerParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0, __arg_1, __arg_2]);
+
+  texImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  texImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  texStorage2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2]);
+
+  texStorage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texStorage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texStorage3D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texStorage3D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texStorage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texSubImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  texSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  texSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+
+  texSubImage3D_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
+
+  transformFeedbackVaryings_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0]);
+
+  transformFeedbackVaryings_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0, __arg_1]);
+
+  transformFeedbackVaryings_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0, __arg_1, __arg_2]);
+
+  uniform1ui_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", []);
+
+  uniform1ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", [__arg_0]);
+
+  uniform1ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", [__arg_0, __arg_1]);
+
+  uniform1uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", []);
+
+  uniform1uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", [__arg_0]);
+
+  uniform1uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", [__arg_0, __arg_1]);
+
+  uniform2ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0]);
+
+  uniform2ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0, __arg_1]);
+
+  uniform2ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0, __arg_1, __arg_2]);
+
+  uniform2uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", []);
+
+  uniform2uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", [__arg_0]);
+
+  uniform2uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", [__arg_0, __arg_1]);
+
+  uniform3ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1]);
+
+  uniform3ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1, __arg_2]);
+
+  uniform3ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform3uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", []);
+
+  uniform3uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", [__arg_0]);
+
+  uniform3uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", [__arg_0, __arg_1]);
+
+  uniform4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2]);
+
+  uniform4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  uniform4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", []);
+
+  uniform4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", [__arg_0]);
+
+  uniform4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", [__arg_0, __arg_1]);
+
+  uniformBlockBinding_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0]);
+
+  uniformBlockBinding_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0, __arg_1]);
+
+  uniformBlockBinding_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix2x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0]);
+
+  uniformMatrix2x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0, __arg_1]);
+
+  uniformMatrix2x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix2x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0]);
+
+  uniformMatrix2x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0, __arg_1]);
+
+  uniformMatrix2x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix3x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0]);
+
+  uniformMatrix3x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0, __arg_1]);
+
+  uniformMatrix3x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix3x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0]);
+
+  uniformMatrix3x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0, __arg_1]);
+
+  uniformMatrix3x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix4x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0]);
+
+  uniformMatrix4x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0, __arg_1]);
+
+  uniformMatrix4x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix4x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0]);
+
+  uniformMatrix4x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0, __arg_1]);
+
+  uniformMatrix4x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttribDivisor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", []);
+
+  vertexAttribDivisor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", [__arg_0]);
+
+  vertexAttribDivisor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", [__arg_0, __arg_1]);
+
+  vertexAttribI4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttribI4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribI4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttribI4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", []);
+
+  vertexAttribI4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", [__arg_0]);
+
+  vertexAttribI4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", [__arg_0, __arg_1]);
+
+  vertexAttribI4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttribI4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribI4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttribI4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", []);
+
+  vertexAttribI4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", [__arg_0]);
+
+  vertexAttribI4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", [__arg_0, __arg_1]);
+
+  vertexAttribIPointer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttribIPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribIPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  waitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0]);
+
+  waitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0, __arg_1]);
+
+  waitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0, __arg_1, __arg_2]);
+
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+
+  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
+
+  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
+
+  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", []);
+
+  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", [__arg_0]);
+
+  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", []);
+
+  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0]);
+
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0, __arg_1]);
+
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0]);
+
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1]);
+
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
+
+  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", []);
+
+  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0]);
+
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0, __arg_1]);
+
+  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", []);
+
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0]);
+
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0, __arg_1]);
+
+  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", []);
+
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0]);
+
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0, __arg_1]);
+
+  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", []);
+
+  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0]);
+
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0, __arg_1]);
+
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1]);
+
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2]);
+
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+
+  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+
+  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", []);
+
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0]);
+
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0, __arg_1]);
+
+  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
+
+  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
+
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
+
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1]);
+
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0]);
+
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1]);
+
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1, __arg_2]);
+
+  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0]);
+
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1]);
+
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
+
+  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", []);
+
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", [__arg_0]);
+
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1]);
+
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2]);
+
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", []);
+
+  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", [__arg_0]);
+
+  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", []);
+
+  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", [__arg_0]);
+
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1]);
+
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2]);
+
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", []);
+
+  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", [__arg_0]);
+
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", []);
+
+  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createFramebuffer", []);
+
+  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProgram", []);
+
+  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRenderbuffer", []);
+
+  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShader", []);
+
+  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShader", [__arg_0]);
+
+  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTexture", []);
+
+  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", []);
+
+  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", [__arg_0]);
+
+  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", []);
+
+  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", [__arg_0]);
+
+  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", []);
+
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", [__arg_0]);
+
+  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", []);
+
+  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", [__arg_0]);
+
+  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", []);
+
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", [__arg_0]);
+
+  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", []);
+
+  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", [__arg_0]);
+
+  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", []);
+
+  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", [__arg_0]);
+
+  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", []);
+
+  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", [__arg_0]);
+
+  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", []);
+
+  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", [__arg_0]);
+
+  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", []);
+
+  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0]);
+
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0, __arg_1]);
+
+  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", []);
+
+  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0]);
+
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0, __arg_1]);
+
+  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disable", []);
+
+  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disable", [__arg_0]);
+
+  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
+
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
+
+  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0]);
+
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1]);
+
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1, __arg_2]);
+
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1]);
+
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2]);
+
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
+
+  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
+
+  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", []);
+
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", [__arg_0]);
+
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+
+  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flush", []);
+
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1]);
+
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
+
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
+
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", []);
+
+  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", [__arg_0]);
+
+  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", []);
+
+  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", [__arg_0]);
+
+  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", []);
+
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0]);
+
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0, __arg_1]);
+
+  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", []);
+
+  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0]);
+
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0, __arg_1]);
+
+  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", []);
+
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", [__arg_0]);
+
+  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", []);
+
+  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0]);
+
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0, __arg_1]);
+
+  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", []);
+
+  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0]);
+
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0, __arg_1]);
+
+  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
+
+  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getError", []);
+
+  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", []);
+
+  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", [__arg_0]);
+
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0]);
+
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
+
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
+
+  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
+
+  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
+
+  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", []);
+
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", [__arg_0]);
+
+  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", []);
+
+  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0]);
+
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0, __arg_1]);
+
+  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", []);
+
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0]);
+
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0, __arg_1]);
+
+  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", []);
+
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", [__arg_0]);
+
+  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", []);
+
+  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0]);
+
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0, __arg_1]);
+
+  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", []);
+
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0]);
+
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
+
+  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", []);
+
+  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", [__arg_0]);
+
+  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSupportedExtensions", []);
+
+  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", []);
+
+  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0]);
+
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0, __arg_1]);
+
+  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", []);
+
+  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0]);
+
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0, __arg_1]);
+
+  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
+
+  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
+
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
+
+  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", []);
+
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0]);
+
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0, __arg_1]);
+
+  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+
+  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hint", []);
+
+  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0]);
+
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0, __arg_1]);
+
+  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", []);
+
+  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", [__arg_0]);
+
+  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
+
+  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", []);
+
+  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", [__arg_0]);
+
+  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", []);
+
+  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", [__arg_0]);
+
+  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", []);
+
+  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", [__arg_0]);
+
+  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", []);
+
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", [__arg_0]);
+
+  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isShader", []);
+
+  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isShader", [__arg_0]);
+
+  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", []);
+
+  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", [__arg_0]);
+
+  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", []);
+
+  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", [__arg_0]);
+
+  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", []);
+
+  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", [__arg_0]);
+
+  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", []);
+
+  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0]);
+
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0, __arg_1]);
+
+  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", []);
+
+  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0]);
+
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0, __arg_1]);
+
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1]);
+
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
+
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", []);
+
+  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0]);
+
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0, __arg_1]);
+
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1]);
+
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2]);
+
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", []);
+
+  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0]);
+
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0, __arg_1]);
+
+  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
+
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1]);
+
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
+
+  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
+
+  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", []);
+
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0]);
+
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0, __arg_1]);
+
   stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0]);
 
   stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1]);
 
   stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1, __arg_2]);
 
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1]);
+
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
   texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
   texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
@@ -15737,6 +20146,1539 @@
 
 }
 
+class BlinkWebGLActiveInfo {
+  static final instance = new BlinkWebGLActiveInfo();
+
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+
+}
+
+class BlinkWebGLBuffer {
+  static final instance = new BlinkWebGLBuffer();
+
+}
+
+class BlinkWebGLCompressedTextureATC {
+  static final instance = new BlinkWebGLCompressedTextureATC();
+
+}
+
+class BlinkWebGLCompressedTextureETC1 {
+  static final instance = new BlinkWebGLCompressedTextureETC1();
+
+}
+
+class BlinkWebGLCompressedTexturePVRTC {
+  static final instance = new BlinkWebGLCompressedTexturePVRTC();
+
+}
+
+class BlinkWebGLCompressedTextureS3TC {
+  static final instance = new BlinkWebGLCompressedTextureS3TC();
+
+}
+
+class BlinkWebGLContextEvent extends BlinkEvent {
+  static final instance = new BlinkWebGLContextEvent();
+
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebGLContextEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebGLContextEvent"), [__arg_0]);
+
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebGLContextEvent"), [__arg_0, __arg_1]);
+
+  statusMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusMessage");
+
+}
+
+class BlinkWebGLDebugRendererInfo {
+  static final instance = new BlinkWebGLDebugRendererInfo();
+
+}
+
+class BlinkWebGLDebugShaders {
+  static final instance = new BlinkWebGLDebugShaders();
+
+  getTranslatedShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTranslatedShaderSource", []);
+
+  getTranslatedShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTranslatedShaderSource", [__arg_0]);
+
+}
+
+class BlinkWebGLDepthTexture {
+  static final instance = new BlinkWebGLDepthTexture();
+
+}
+
+class BlinkWebGLDrawBuffers {
+  static final instance = new BlinkWebGLDrawBuffers();
+
+  drawBuffersWEBGL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffersWEBGL", []);
+
+  drawBuffersWEBGL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffersWEBGL", [__arg_0]);
+
+}
+
+class BlinkWebGLFramebuffer {
+  static final instance = new BlinkWebGLFramebuffer();
+
+}
+
+class BlinkWebGLLoseContext {
+  static final instance = new BlinkWebGLLoseContext();
+
+  loseContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "loseContext", []);
+
+  restoreContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "restoreContext", []);
+
+}
+
+class BlinkWebGLProgram {
+  static final instance = new BlinkWebGLProgram();
+
+}
+
+class BlinkWebGLQuery {
+  static final instance = new BlinkWebGLQuery();
+
+}
+
+class BlinkWebGLRenderbuffer {
+  static final instance = new BlinkWebGLRenderbuffer();
+
+}
+
+class BlinkWebGLRenderingContext {
+  static final instance = new BlinkWebGLRenderingContext();
+
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+
+  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
+
+  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
+
+  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", []);
+
+  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", [__arg_0]);
+
+  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", []);
+
+  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0]);
+
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0, __arg_1]);
+
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0]);
+
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1]);
+
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
+
+  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", []);
+
+  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0]);
+
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0, __arg_1]);
+
+  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", []);
+
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0]);
+
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0, __arg_1]);
+
+  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", []);
+
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0]);
+
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0, __arg_1]);
+
+  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", []);
+
+  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0]);
+
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0, __arg_1]);
+
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1]);
+
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2]);
+
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+
+  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+
+  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", []);
+
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0]);
+
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0, __arg_1]);
+
+  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
+
+  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
+
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
+
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1]);
+
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0]);
+
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1]);
+
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1, __arg_2]);
+
+  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0]);
+
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1]);
+
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
+
+  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", []);
+
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", [__arg_0]);
+
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1]);
+
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2]);
+
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", []);
+
+  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", [__arg_0]);
+
+  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", []);
+
+  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", [__arg_0]);
+
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1]);
+
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2]);
+
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", []);
+
+  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", [__arg_0]);
+
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", []);
+
+  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createFramebuffer", []);
+
+  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProgram", []);
+
+  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRenderbuffer", []);
+
+  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShader", []);
+
+  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShader", [__arg_0]);
+
+  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTexture", []);
+
+  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", []);
+
+  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", [__arg_0]);
+
+  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", []);
+
+  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", [__arg_0]);
+
+  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", []);
+
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", [__arg_0]);
+
+  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", []);
+
+  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", [__arg_0]);
+
+  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", []);
+
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", [__arg_0]);
+
+  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", []);
+
+  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", [__arg_0]);
+
+  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", []);
+
+  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", [__arg_0]);
+
+  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", []);
+
+  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", [__arg_0]);
+
+  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", []);
+
+  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", [__arg_0]);
+
+  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", []);
+
+  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0]);
+
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0, __arg_1]);
+
+  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", []);
+
+  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0]);
+
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0, __arg_1]);
+
+  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disable", []);
+
+  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disable", [__arg_0]);
+
+  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
+
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
+
+  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0]);
+
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1]);
+
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1, __arg_2]);
+
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1]);
+
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2]);
+
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
+
+  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
+
+  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", []);
+
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", [__arg_0]);
+
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+
+  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flush", []);
+
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1]);
+
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
+
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
+
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", []);
+
+  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", [__arg_0]);
+
+  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", []);
+
+  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", [__arg_0]);
+
+  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", []);
+
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0]);
+
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0, __arg_1]);
+
+  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", []);
+
+  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0]);
+
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0, __arg_1]);
+
+  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", []);
+
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", [__arg_0]);
+
+  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", []);
+
+  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0]);
+
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0, __arg_1]);
+
+  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", []);
+
+  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0]);
+
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0, __arg_1]);
+
+  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
+
+  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getError", []);
+
+  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", []);
+
+  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", [__arg_0]);
+
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0]);
+
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
+
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
+
+  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
+
+  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
+
+  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", []);
+
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", [__arg_0]);
+
+  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", []);
+
+  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0]);
+
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0, __arg_1]);
+
+  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", []);
+
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0]);
+
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0, __arg_1]);
+
+  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", []);
+
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", [__arg_0]);
+
+  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", []);
+
+  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0]);
+
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0, __arg_1]);
+
+  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", []);
+
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0]);
+
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
+
+  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", []);
+
+  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", [__arg_0]);
+
+  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSupportedExtensions", []);
+
+  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", []);
+
+  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0]);
+
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0, __arg_1]);
+
+  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", []);
+
+  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0]);
+
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0, __arg_1]);
+
+  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
+
+  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
+
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
+
+  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", []);
+
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0]);
+
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0, __arg_1]);
+
+  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+
+  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hint", []);
+
+  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0]);
+
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0, __arg_1]);
+
+  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", []);
+
+  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", [__arg_0]);
+
+  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
+
+  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", []);
+
+  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", [__arg_0]);
+
+  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", []);
+
+  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", [__arg_0]);
+
+  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", []);
+
+  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", [__arg_0]);
+
+  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", []);
+
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", [__arg_0]);
+
+  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isShader", []);
+
+  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isShader", [__arg_0]);
+
+  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", []);
+
+  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", [__arg_0]);
+
+  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", []);
+
+  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", [__arg_0]);
+
+  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", []);
+
+  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", [__arg_0]);
+
+  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", []);
+
+  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0]);
+
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0, __arg_1]);
+
+  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", []);
+
+  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0]);
+
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0, __arg_1]);
+
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1]);
+
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
+
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", []);
+
+  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0]);
+
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0, __arg_1]);
+
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1]);
+
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2]);
+
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", []);
+
+  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0]);
+
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0, __arg_1]);
+
+  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
+
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1]);
+
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
+
+  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
+
+  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", []);
+
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0]);
+
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0, __arg_1]);
+
+  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0]);
+
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1]);
+
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1, __arg_2]);
+
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1]);
+
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0]);
+
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1]);
+
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1, __arg_2]);
+
+  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0]);
+
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1]);
+
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1, __arg_2]);
+
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", []);
+
+  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0]);
+
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0, __arg_1]);
+
+  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", []);
+
+  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0]);
+
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0, __arg_1]);
+
+  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", []);
+
+  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0]);
+
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0, __arg_1]);
+
+  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", []);
+
+  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0]);
+
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0, __arg_1]);
+
+  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0]);
+
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1]);
+
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", []);
+
+  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0]);
+
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0, __arg_1]);
+
+  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0]);
+
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1]);
+
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", []);
+
+  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0]);
+
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0, __arg_1]);
+
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1]);
+
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", []);
+
+  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0]);
+
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0, __arg_1]);
+
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1]);
+
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", []);
+
+  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0]);
+
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0, __arg_1]);
+
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", []);
+
+  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0]);
+
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0, __arg_1]);
+
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", []);
+
+  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0]);
+
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0, __arg_1]);
+
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0]);
+
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1]);
+
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0]);
+
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1]);
+
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0]);
+
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1]);
+
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
+
+  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", []);
+
+  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", [__arg_0]);
+
+  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", []);
+
+  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", [__arg_0]);
+
+  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", []);
+
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0]);
+
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0, __arg_1]);
+
+  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", []);
+
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0]);
+
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0, __arg_1]);
+
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0]);
+
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1]);
+
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", []);
+
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0]);
+
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0, __arg_1]);
+
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1]);
+
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", []);
+
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0]);
+
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0, __arg_1]);
+
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", []);
+
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0]);
+
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0, __arg_1]);
+
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1]);
+
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2]);
+
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+}
+
+class BlinkWebGLRenderingContextBase {
+  static final instance = new BlinkWebGLRenderingContextBase();
+
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+
+  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
+
+  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
+
+  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", []);
+
+  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", [__arg_0]);
+
+  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", []);
+
+  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0]);
+
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0, __arg_1]);
+
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0]);
+
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1]);
+
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
+
+  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", []);
+
+  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0]);
+
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0, __arg_1]);
+
+  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", []);
+
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0]);
+
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0, __arg_1]);
+
+  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", []);
+
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0]);
+
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0, __arg_1]);
+
+  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", []);
+
+  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0]);
+
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0, __arg_1]);
+
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1]);
+
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2]);
+
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+
+  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+
+  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", []);
+
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0]);
+
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0, __arg_1]);
+
+  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
+
+  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
+
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
+
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1]);
+
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0]);
+
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1]);
+
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1, __arg_2]);
+
+  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0]);
+
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1]);
+
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
+
+  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", []);
+
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", [__arg_0]);
+
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1]);
+
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2]);
+
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", []);
+
+  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", [__arg_0]);
+
+  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", []);
+
+  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", [__arg_0]);
+
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1]);
+
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2]);
+
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", []);
+
+  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", [__arg_0]);
+
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", []);
+
+  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createFramebuffer", []);
+
+  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProgram", []);
+
+  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRenderbuffer", []);
+
+  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShader", []);
+
+  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShader", [__arg_0]);
+
+  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTexture", []);
+
+  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", []);
+
+  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", [__arg_0]);
+
+  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", []);
+
+  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", [__arg_0]);
+
+  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", []);
+
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", [__arg_0]);
+
+  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", []);
+
+  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", [__arg_0]);
+
+  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", []);
+
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", [__arg_0]);
+
+  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", []);
+
+  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", [__arg_0]);
+
+  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", []);
+
+  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", [__arg_0]);
+
+  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", []);
+
+  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", [__arg_0]);
+
+  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", []);
+
+  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", [__arg_0]);
+
+  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", []);
+
+  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0]);
+
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0, __arg_1]);
+
+  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", []);
+
+  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0]);
+
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0, __arg_1]);
+
+  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disable", []);
+
+  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disable", [__arg_0]);
+
+  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
+
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
+
+  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0]);
+
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1]);
+
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1, __arg_2]);
+
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1]);
+
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2]);
+
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
+
+  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
+
+  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", []);
+
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", [__arg_0]);
+
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+
+  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flush", []);
+
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1]);
+
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
+
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
+
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", []);
+
+  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", [__arg_0]);
+
+  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", []);
+
+  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", [__arg_0]);
+
+  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", []);
+
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0]);
+
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0, __arg_1]);
+
+  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", []);
+
+  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0]);
+
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0, __arg_1]);
+
+  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", []);
+
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", [__arg_0]);
+
+  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", []);
+
+  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0]);
+
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0, __arg_1]);
+
+  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", []);
+
+  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0]);
+
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0, __arg_1]);
+
+  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
+
+  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getError", []);
+
+  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", []);
+
+  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", [__arg_0]);
+
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0]);
+
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
+
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
+
+  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
+
+  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
+
+  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", []);
+
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", [__arg_0]);
+
+  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", []);
+
+  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0]);
+
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0, __arg_1]);
+
+  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", []);
+
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0]);
+
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0, __arg_1]);
+
+  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", []);
+
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", [__arg_0]);
+
+  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", []);
+
+  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0]);
+
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0, __arg_1]);
+
+  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", []);
+
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0]);
+
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
+
+  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", []);
+
+  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", [__arg_0]);
+
+  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSupportedExtensions", []);
+
+  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", []);
+
+  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0]);
+
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0, __arg_1]);
+
+  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", []);
+
+  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0]);
+
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0, __arg_1]);
+
+  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
+
+  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
+
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
+
+  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", []);
+
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0]);
+
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0, __arg_1]);
+
+  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+
+  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hint", []);
+
+  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0]);
+
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0, __arg_1]);
+
+  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", []);
+
+  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", [__arg_0]);
+
+  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
+
+  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", []);
+
+  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", [__arg_0]);
+
+  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", []);
+
+  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", [__arg_0]);
+
+  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", []);
+
+  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", [__arg_0]);
+
+  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", []);
+
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", [__arg_0]);
+
+  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isShader", []);
+
+  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isShader", [__arg_0]);
+
+  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", []);
+
+  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", [__arg_0]);
+
+  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", []);
+
+  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", [__arg_0]);
+
+  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", []);
+
+  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", [__arg_0]);
+
+  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", []);
+
+  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0]);
+
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0, __arg_1]);
+
+  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", []);
+
+  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0]);
+
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0, __arg_1]);
+
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1]);
+
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
+
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", []);
+
+  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0]);
+
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0, __arg_1]);
+
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1]);
+
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2]);
+
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", []);
+
+  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0]);
+
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0, __arg_1]);
+
+  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
+
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1]);
+
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
+
+  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
+
+  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", []);
+
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0]);
+
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0, __arg_1]);
+
+  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0]);
+
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1]);
+
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1, __arg_2]);
+
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1]);
+
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
+
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0]);
+
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1]);
+
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1, __arg_2]);
+
+  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0]);
+
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1]);
+
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1, __arg_2]);
+
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+
+  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", []);
+
+  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0]);
+
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0, __arg_1]);
+
+  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", []);
+
+  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0]);
+
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0, __arg_1]);
+
+  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", []);
+
+  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0]);
+
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0, __arg_1]);
+
+  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", []);
+
+  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0]);
+
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0, __arg_1]);
+
+  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0]);
+
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1]);
+
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", []);
+
+  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0]);
+
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0, __arg_1]);
+
+  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0]);
+
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1]);
+
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", []);
+
+  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0]);
+
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0, __arg_1]);
+
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1]);
+
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", []);
+
+  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0]);
+
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0, __arg_1]);
+
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1]);
+
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", []);
+
+  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0]);
+
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0, __arg_1]);
+
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2]);
+
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", []);
+
+  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0]);
+
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0, __arg_1]);
+
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2]);
+
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", []);
+
+  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0]);
+
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0, __arg_1]);
+
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0]);
+
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1]);
+
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0]);
+
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1]);
+
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
+
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0]);
+
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1]);
+
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
+
+  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", []);
+
+  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", [__arg_0]);
+
+  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", []);
+
+  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", [__arg_0]);
+
+  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", []);
+
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0]);
+
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0, __arg_1]);
+
+  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", []);
+
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0]);
+
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0, __arg_1]);
+
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0]);
+
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1]);
+
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", []);
+
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0]);
+
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0, __arg_1]);
+
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1]);
+
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", []);
+
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0]);
+
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0, __arg_1]);
+
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
+
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", []);
+
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0]);
+
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0, __arg_1]);
+
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1]);
+
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2]);
+
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+}
+
+class BlinkWebGLSampler {
+  static final instance = new BlinkWebGLSampler();
+
+}
+
 class BlinkWebGLShader {
   static final instance = new BlinkWebGLShader();
 
@@ -15753,51 +21695,43 @@
 
 }
 
+class BlinkWebGLSync {
+  static final instance = new BlinkWebGLSync();
+
+}
+
 class BlinkWebGLTexture {
   static final instance = new BlinkWebGLTexture();
 
 }
 
+class BlinkWebGLTransformFeedback {
+  static final instance = new BlinkWebGLTransformFeedback();
+
+}
+
 class BlinkWebGLUniformLocation {
   static final instance = new BlinkWebGLUniformLocation();
 
 }
 
+class BlinkWebGLVertexArrayObject {
+  static final instance = new BlinkWebGLVertexArrayObject();
+
+}
+
 class BlinkWebGLVertexArrayObjectOES {
   static final instance = new BlinkWebGLVertexArrayObjectOES();
 
 }
 
-class BlinkWebKitAnimationEvent extends BlinkEvent {
-  static final instance = new BlinkWebKitAnimationEvent();
-
-  animationName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animationName");
-
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebKitAnimationEvent"), [__arg_0, __arg_1]);
-
-  elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elapsedTime");
-
-}
-
-class BlinkWebKitCSSFilterRule extends BlinkCSSRule {
-  static final instance = new BlinkWebKitCSSFilterRule();
-
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
-
-}
-
-class BlinkWebKitCSSFilterValue extends BlinkCSSValueList {
-  static final instance = new BlinkWebKitCSSFilterValue();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  operationType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "operationType");
-
-}
-
 class BlinkWebKitCSSMatrix {
   static final instance = new BlinkWebKitCSSMatrix();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebKitCSSMatrix"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebKitCSSMatrix"), [__arg_0]);
+
   a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "a");
 
   a_Setter_(mthis, __arg_0) => mthis["a"] = __arg_0;
@@ -15810,10 +21744,6 @@
 
   c_Setter_(mthis, __arg_0) => mthis["c"] = __arg_0;
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebKitCSSMatrix"), []);
-
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebKitCSSMatrix"), [__arg_0]);
-
   d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "d");
 
   d_Setter_(mthis, __arg_0) => mthis["d"] = __arg_0;
@@ -15826,8 +21756,6 @@
 
   f_Setter_(mthis, __arg_0) => mthis["f"] = __arg_0;
 
-  inverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "inverse", []);
-
   m11_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m11");
 
   m11_Setter_(mthis, __arg_0) => mthis["m11"] = __arg_0;
@@ -15892,29 +21820,23 @@
 
   m44_Setter_(mthis, __arg_0) => mthis["m44"] = __arg_0;
 
+  inverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "inverse", []);
+
   multiply_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "multiply", []);
 
   multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "multiply", [__arg_0]);
 
-  rotateAxisAngle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", []);
-
-  rotateAxisAngle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0]);
-
-  rotateAxisAngle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1]);
-
-  rotateAxisAngle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1, __arg_2]);
-
-  rotateAxisAngle_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  rotate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "rotate", []);
-
   rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0]);
 
   rotate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0, __arg_1]);
 
   rotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0, __arg_1, __arg_2]);
 
-  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale", []);
+  rotateAxisAngle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1]);
+
+  rotateAxisAngle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1, __arg_2]);
+
+  rotateAxisAngle_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
   scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
 
@@ -15934,8 +21856,6 @@
 
   skewY_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "skewY", [__arg_0]);
 
-  translate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "translate", []);
-
   translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0]);
 
   translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0, __arg_1]);
@@ -15944,70 +21864,21 @@
 
 }
 
-class BlinkWebKitCSSTransformValue extends BlinkCSSValueList {
-  static final instance = new BlinkWebKitCSSTransformValue();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  operationType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "operationType");
-
-}
-
-class BlinkWebKitGamepad {
-  static final instance = new BlinkWebKitGamepad();
-
-  axes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "axes");
-
-  buttons_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buttons");
-
-  connected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connected");
-
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
-
-  index_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "index");
-
-  mapping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mapping");
-
-  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
-
-}
-
-class BlinkWebKitGamepadList {
-  static final instance = new BlinkWebKitGamepadList();
-
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
-
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
-
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
-
-}
-
 class BlinkWebSocket extends BlinkEventTarget {
   static final instance = new BlinkWebSocket();
 
-  URL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "URL");
-
-  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "binaryType");
-
-  binaryType_Setter_(mthis, __arg_0) => mthis["binaryType"] = __arg_0;
-
-  bufferedAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bufferedAmount");
-
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
-  close_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0]);
-
-  close_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0, __arg_1]);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebSocket"), []);
 
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebSocket"), [__arg_0]);
 
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebSocket"), [__arg_0, __arg_1]);
 
+  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "binaryType");
+
+  binaryType_Setter_(mthis, __arg_0) => mthis["binaryType"] = __arg_0;
+
+  bufferedAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bufferedAmount");
+
   extensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extensions");
 
   onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
@@ -16030,17 +21901,27 @@
 
   readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
 
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  close_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0]);
+
+  close_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0, __arg_1]);
+
   send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
 
   send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
-
 }
 
 class BlinkWheelEvent extends BlinkMouseEvent {
   static final instance = new BlinkWheelEvent();
 
+  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WheelEvent"), []);
+
+  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WheelEvent"), [__arg_0]);
+
   constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WheelEvent"), [__arg_0, __arg_1]);
 
   deltaMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaMode");
@@ -16051,6 +21932,8 @@
 
   deltaZ_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaZ");
 
+  wheelDelta_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wheelDelta");
+
   wheelDeltaX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wheelDeltaX");
 
   wheelDeltaY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wheelDeltaY");
@@ -16060,48 +21943,14 @@
 class BlinkWindow extends BlinkEventTarget {
   static final instance = new BlinkWindow();
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
-
-  CSS_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "CSS");
-
-  alert_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "alert", []);
-
-  alert_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "alert", [__arg_0]);
-
   applicationCache_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "applicationCache");
 
-  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "atob", []);
+  caches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "caches");
 
-  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "atob", [__arg_0]);
-
-  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blur", []);
-
-  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "btoa", []);
-
-  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "btoa", [__arg_0]);
-
-  cancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", []);
-
-  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", [__arg_0]);
-
-  captureEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "captureEvents", []);
-
-  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", []);
-
-  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", [__arg_0]);
-
-  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", []);
-
-  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", [__arg_0]);
-
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  clientInformation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientInformation");
 
   closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
 
-  confirm_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "confirm", []);
-
-  confirm_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "confirm", [__arg_0]);
-
   console_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "console");
 
   crypto_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crypto");
@@ -16122,42 +21971,10 @@
 
   event_Setter_(mthis, __arg_0) => mthis["event"] = __arg_0;
 
-  find_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "find", []);
-
-  find_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0]);
-
-  find_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1]);
-
-  find_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2]);
-
-  find_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  find_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  find_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
-
-  find_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
-
-  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
-
   frameElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frameElement");
 
   frames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frames");
 
-  getComputedStyle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", []);
-
-  getComputedStyle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", [__arg_0]);
-
-  getComputedStyle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", [__arg_0, __arg_1]);
-
-  getMatchedCSSRules_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", []);
-
-  getMatchedCSSRules_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", [__arg_0]);
-
-  getMatchedCSSRules_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", [__arg_0, __arg_1]);
-
-  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelection", []);
-
   history_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "history");
 
   indexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indexedDB");
@@ -16172,28 +21989,10 @@
 
   location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "location");
 
-  location_Setter_(mthis, __arg_0) => mthis["location"] = __arg_0;
-
   locationbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "locationbar");
 
-  matchMedia_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchMedia", []);
-
-  matchMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchMedia", [__arg_0]);
-
   menubar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "menubar");
 
-  moveBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", []);
-
-  moveBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", [__arg_0]);
-
-  moveBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", [__arg_0, __arg_1]);
-
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
-
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
-
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
-
   name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
 
   name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
@@ -16202,10 +22001,6 @@
 
   offscreenBuffering_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offscreenBuffering");
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
-
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
-
   onanimationend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onanimationend");
 
   onanimationend_Setter_(mthis, __arg_0) => mthis["onanimationend"] = __arg_0;
@@ -16218,6 +22013,310 @@
 
   onanimationstart_Setter_(mthis, __arg_0) => mthis["onanimationstart"] = __arg_0;
 
+  ondevicelight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondevicelight");
+
+  ondevicelight_Setter_(mthis, __arg_0) => mthis["ondevicelight"] = __arg_0;
+
+  ondevicemotion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondevicemotion");
+
+  ondevicemotion_Setter_(mthis, __arg_0) => mthis["ondevicemotion"] = __arg_0;
+
+  ondeviceorientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondeviceorientation");
+
+  ondeviceorientation_Setter_(mthis, __arg_0) => mthis["ondeviceorientation"] = __arg_0;
+
+  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onorientationchange");
+
+  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
+
+  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsearch");
+
+  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
+
+  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchcancel");
+
+  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
+
+  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchend");
+
+  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
+
+  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchmove");
+
+  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
+
+  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchstart");
+
+  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
+
+  ontransitionend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontransitionend");
+
+  ontransitionend_Setter_(mthis, __arg_0) => mthis["ontransitionend"] = __arg_0;
+
+  onwebkitanimationend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationend");
+
+  onwebkitanimationend_Setter_(mthis, __arg_0) => mthis["onwebkitanimationend"] = __arg_0;
+
+  onwebkitanimationiteration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationiteration");
+
+  onwebkitanimationiteration_Setter_(mthis, __arg_0) => mthis["onwebkitanimationiteration"] = __arg_0;
+
+  onwebkitanimationstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationstart");
+
+  onwebkitanimationstart_Setter_(mthis, __arg_0) => mthis["onwebkitanimationstart"] = __arg_0;
+
+  onwebkittransitionend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkittransitionend");
+
+  onwebkittransitionend_Setter_(mthis, __arg_0) => mthis["onwebkittransitionend"] = __arg_0;
+
+  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwheel");
+
+  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
+
+  opener_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "opener");
+
+  opener_Setter_(mthis, __arg_0) => mthis["opener"] = __arg_0;
+
+  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientation");
+
+  outerHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerHeight");
+
+  outerWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerWidth");
+
+  pageXOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageXOffset");
+
+  pageYOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageYOffset");
+
+  parent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parent");
+
+  performance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "performance");
+
+  personalbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "personalbar");
+
+  screen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screen");
+
+  screenLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenLeft");
+
+  screenTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenTop");
+
+  screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenX");
+
+  screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenY");
+
+  scrollX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollX");
+
+  scrollY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollY");
+
+  scrollbars_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollbars");
+
+  self_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "self");
+
+  sessionStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sessionStorage");
+
+  speechSynthesis_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speechSynthesis");
+
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+
+  status_Setter_(mthis, __arg_0) => mthis["status"] = __arg_0;
+
+  statusbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusbar");
+
+  styleMedia_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleMedia");
+
+  toolbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "toolbar");
+
+  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "top");
+
+  webkitIndexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitIndexedDB");
+
+  webkitStorageInfo_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitStorageInfo");
+
+  window_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "window");
+
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+
+  alert_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "alert", []);
+
+  alert_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "alert", [__arg_0]);
+
+  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blur", []);
+
+  cancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", []);
+
+  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", [__arg_0]);
+
+  captureEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "captureEvents", []);
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  confirm_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "confirm", []);
+
+  confirm_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "confirm", [__arg_0]);
+
+  createImageBitmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", []);
+
+  createImageBitmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0]);
+
+  createImageBitmap_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1]);
+
+  createImageBitmap_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2]);
+
+  createImageBitmap_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  createImageBitmap_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fetch", []);
+
+  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0]);
+
+  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0, __arg_1]);
+
+  find_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  find_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+
+  find_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+
+  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
+
+  getComputedStyle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", []);
+
+  getComputedStyle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", [__arg_0]);
+
+  getComputedStyle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", [__arg_0, __arg_1]);
+
+  getMatchedCSSRules_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", []);
+
+  getMatchedCSSRules_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", [__arg_0]);
+
+  getMatchedCSSRules_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", [__arg_0, __arg_1]);
+
+  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelection", []);
+
+  matchMedia_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchMedia", []);
+
+  matchMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchMedia", [__arg_0]);
+
+  moveBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", []);
+
+  moveBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", [__arg_0]);
+
+  moveBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", [__arg_0, __arg_1]);
+
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+
+  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0]);
+
+  open_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1]);
+
+  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1, __arg_2]);
+
+  openDatabase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1]);
+
+  openDatabase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2]);
+
+  openDatabase_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  openDatabase_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1, __arg_2]);
+
+  print_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "print", []);
+
+  prompt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prompt", []);
+
+  prompt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prompt", [__arg_0]);
+
+  prompt_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "prompt", [__arg_0, __arg_1]);
+
+  releaseEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseEvents", []);
+
+  requestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", []);
+
+  requestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", [__arg_0]);
+
+  resizeBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", []);
+
+  resizeBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", [__arg_0]);
+
+  resizeBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", [__arg_0, __arg_1]);
+
+  resizeTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", []);
+
+  resizeTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", [__arg_0]);
+
+  resizeTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", [__arg_0, __arg_1]);
+
+  scroll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scroll", []);
+
+  scroll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0]);
+
+  scroll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0, __arg_1]);
+
+  scroll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0, __arg_1, __arg_2]);
+
+  scrollBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", []);
+
+  scrollBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0]);
+
+  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0, __arg_1]);
+
+  scrollBy_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0, __arg_1, __arg_2]);
+
+  scrollTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", []);
+
+  scrollTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0]);
+
+  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0, __arg_1]);
+
+  scrollTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0, __arg_1, __arg_2]);
+
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+
+  webkitCancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelAnimationFrame", []);
+
+  webkitCancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelAnimationFrame", [__arg_0]);
+
+  webkitCancelRequestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelRequestAnimationFrame", []);
+
+  webkitCancelRequestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelRequestAnimationFrame", [__arg_0]);
+
+  webkitRequestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestAnimationFrame", []);
+
+  webkitRequestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestAnimationFrame", [__arg_0]);
+
+  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0]);
+
+  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1]);
+
+  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
+
+  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", []);
+
+  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0]);
+
+  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
+
+  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
+
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+
   onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
 
   onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
@@ -16226,10 +22325,6 @@
 
   onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
 
-  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
-
-  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
-
   onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
 
   onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
@@ -16270,18 +22365,6 @@
 
   ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
 
-  ondevicelight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondevicelight");
-
-  ondevicelight_Setter_(mthis, __arg_0) => mthis["ondevicelight"] = __arg_0;
-
-  ondevicemotion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondevicemotion");
-
-  ondevicemotion_Setter_(mthis, __arg_0) => mthis["ondevicemotion"] = __arg_0;
-
-  ondeviceorientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondeviceorientation");
-
-  ondeviceorientation_Setter_(mthis, __arg_0) => mthis["ondeviceorientation"] = __arg_0;
-
   ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
 
   ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
@@ -16330,10 +22413,6 @@
 
   onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
 
-  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
-
-  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
-
   oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
 
   oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
@@ -16354,10 +22433,6 @@
 
   onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
 
-  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
-
-  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
-
   onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
 
   onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
@@ -16374,10 +22449,6 @@
 
   onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
-
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
-
   onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
 
   onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
@@ -16410,26 +22481,6 @@
 
   onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
 
-  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
-
-  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
-
-  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
-
-  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
-
-  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onorientationchange");
-
-  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
-
-  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
-
-  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
-
-  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
-
-  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
-
   onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
 
   onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
@@ -16442,9 +22493,37 @@
 
   onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
 
-  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
 
-  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
+  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+
+  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+
+  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+
+  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+
+  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+
+  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+
+  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+
+  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
 
   onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
 
@@ -16466,10 +22545,6 @@
 
   onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
 
-  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsearch");
-
-  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
-
   onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
 
   onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
@@ -16490,10 +22565,6 @@
 
   onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
 
-  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
-
-  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
-
   onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
 
   onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
@@ -16510,30 +22581,6 @@
 
   ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
 
-  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchcancel");
-
-  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
-
-  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchend");
-
-  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
-
-  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchmove");
-
-  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
-
-  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchstart");
-
-  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
-
-  ontransitionend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontransitionend");
-
-  ontransitionend_Setter_(mthis, __arg_0) => mthis["ontransitionend"] = __arg_0;
-
-  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
-
-  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
-
   onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
 
   onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
@@ -16542,133 +22589,73 @@
 
   onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
 
-  onwebkitanimationend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationend");
+  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "atob", []);
 
-  onwebkitanimationend_Setter_(mthis, __arg_0) => mthis["onwebkitanimationend"] = __arg_0;
+  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "atob", [__arg_0]);
 
-  onwebkitanimationiteration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationiteration");
+  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "btoa", []);
 
-  onwebkitanimationiteration_Setter_(mthis, __arg_0) => mthis["onwebkitanimationiteration"] = __arg_0;
+  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "btoa", [__arg_0]);
 
-  onwebkitanimationstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationstart");
+  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
 
-  onwebkitanimationstart_Setter_(mthis, __arg_0) => mthis["onwebkitanimationstart"] = __arg_0;
+  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
 
-  onwebkittransitionend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkittransitionend");
+  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
 
-  onwebkittransitionend_Setter_(mthis, __arg_0) => mthis["onwebkittransitionend"] = __arg_0;
+  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
 
-  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwheel");
+  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
 
-  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
+  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
 
-  openDatabase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1]);
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
 
-  openDatabase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2]);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  openDatabase_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
 
-  openDatabase_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
 
-  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
 
-  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0]);
+  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
 
-  open_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1]);
+  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
 
-  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1, __arg_2]);
+  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
 
-  opener_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "opener");
+  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
 
-  opener_Setter_(mthis, __arg_0) => mthis["opener"] = __arg_0;
+  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
 
-  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientation");
+  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
 
-  outerHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerHeight");
+  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
 
-  outerWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerWidth");
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
 
-  pageXOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageXOffset");
+  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
 
-  pageYOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageYOffset");
+  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
 
-  parent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parent");
+  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
 
-  performance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "performance");
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
 
-  personalbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "personalbar");
+  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", []);
 
-  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1, __arg_2]);
+  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", [__arg_0]);
 
-  print_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "print", []);
+  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", []);
 
-  releaseEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseEvents", []);
-
-  requestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", []);
-
-  requestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", [__arg_0]);
-
-  resizeBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", []);
-
-  resizeBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", [__arg_0]);
-
-  resizeBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", [__arg_0, __arg_1]);
-
-  resizeTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", []);
-
-  resizeTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", [__arg_0]);
-
-  resizeTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", [__arg_0, __arg_1]);
-
-  screenLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenLeft");
-
-  screenTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenTop");
-
-  screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenX");
-
-  screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenY");
-
-  screen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screen");
-
-  scrollBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", []);
-
-  scrollBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0]);
-
-  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0, __arg_1]);
-
-  scrollBy_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0, __arg_1, __arg_2]);
-
-  scrollTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", []);
-
-  scrollTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0]);
-
-  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0, __arg_1]);
-
-  scrollTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0, __arg_1, __arg_2]);
-
-  scrollX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollX");
-
-  scrollY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollY");
-
-  scroll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scroll", []);
-
-  scroll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0]);
-
-  scroll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0, __arg_1]);
-
-  scroll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0, __arg_1, __arg_2]);
-
-  scrollbars_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollbars");
-
-  self_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "self");
-
-  sessionStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sessionStorage");
+  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", [__arg_0]);
 
   setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", []);
 
@@ -16676,55 +22663,125 @@
 
   setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1]);
 
+  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1, __arg_2]);
+
   setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", []);
 
   setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0]);
 
   setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1]);
 
-  showModalDialog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "showModalDialog", []);
+  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1, __arg_2]);
 
-  showModalDialog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "showModalDialog", [__arg_0]);
+}
 
-  showModalDialog_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "showModalDialog", [__arg_0, __arg_1]);
+class BlinkWindowBase64 {
+  static final instance = new BlinkWindowBase64();
 
-  showModalDialog_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "showModalDialog", [__arg_0, __arg_1, __arg_2]);
+  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "atob", []);
 
-  speechSynthesis_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speechSynthesis");
+  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "atob", [__arg_0]);
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "btoa", []);
 
-  status_Setter_(mthis, __arg_0) => mthis["status"] = __arg_0;
+  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "btoa", [__arg_0]);
 
-  statusbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusbar");
+}
 
-  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+class BlinkWindowClient extends BlinkClient {
+  static final instance = new BlinkWindowClient();
 
-  styleMedia_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleMedia");
+  focused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "focused");
 
-  toolbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "toolbar");
+  visibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "visibilityState");
 
-  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "top");
+  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
 
-  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0]);
+}
 
-  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1]);
+class BlinkWindowEventHandlers {
+  static final instance = new BlinkWindowEventHandlers();
 
-  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
+  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
 
-  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
 
-  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", []);
+  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
 
-  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0]);
+  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
 
-  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
+  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
 
-  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
+  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
 
-  webkitStorageInfo_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitStorageInfo");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
 
-  window_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "window");
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+
+  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
+
+  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
+
+  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
+
+  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
+
+  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
+
+  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
+
+  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
+
+  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
+
+  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
+
+  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
+
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+
+  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+
+  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
+
+  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
+
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+
+  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+
+  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
+
+  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
+
+}
+
+class BlinkWindowTimers {
+  static final instance = new BlinkWindowTimers();
+
+  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", []);
+
+  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", [__arg_0]);
+
+  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", []);
+
+  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", [__arg_0]);
+
+  setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", []);
+
+  setInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0]);
+
+  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1]);
+
+  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1, __arg_2]);
+
+  setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", []);
+
+  setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0]);
+
+  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1]);
+
+  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1, __arg_2]);
 
 }
 
@@ -16735,10 +22792,6 @@
 
   constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Worker"), [__arg_0]);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
-
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
-
   onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
 
   onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
@@ -16751,6 +22804,10 @@
 
   terminate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "terminate", []);
 
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
 }
 
 class BlinkWorkerConsole extends BlinkConsoleBase {
@@ -16761,6 +22818,76 @@
 class BlinkWorkerGlobalScope extends BlinkEventTarget {
   static final instance = new BlinkWorkerGlobalScope();
 
+  caches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "caches");
+
+  console_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "console");
+
+  crypto_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crypto");
+
+  indexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indexedDB");
+
+  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "location");
+
+  navigator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "navigator");
+
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+
+  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+
+  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+
+  performance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "performance");
+
+  self_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "self");
+
+  webkitIndexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitIndexedDB");
+
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+
+  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fetch", []);
+
+  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0]);
+
+  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0, __arg_1]);
+
+  importScripts_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "importScripts", []);
+
+  importScripts_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "importScripts", [__arg_0]);
+
+  webkitRequestFileSystem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", []);
+
+  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0]);
+
+  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1]);
+
+  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
+
+  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
+
+  webkitRequestFileSystemSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", []);
+
+  webkitRequestFileSystemSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", [__arg_0]);
+
+  webkitRequestFileSystemSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", [__arg_0, __arg_1]);
+
+  webkitResolveLocalFileSystemSyncURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemSyncURL", []);
+
+  webkitResolveLocalFileSystemSyncURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemSyncURL", [__arg_0]);
+
+  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", []);
+
+  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0]);
+
+  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
+
+  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
+
   atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "atob", []);
 
   atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "atob", [__arg_0]);
@@ -16777,79 +22904,21 @@
 
   clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", [__arg_0]);
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
-
-  console_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "console");
-
-  createImageBitmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", []);
-
-  createImageBitmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0]);
-
-  createImageBitmap_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2]);
-
-  createImageBitmap_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  createImageBitmap_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
-
-  crypto_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crypto");
-
-  importScripts_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "importScripts", []);
-
-  importScripts_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "importScripts", [__arg_0]);
-
-  indexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indexedDB");
-
-  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "location");
-
-  navigator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "navigator");
-
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
-
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
-
-  performance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "performance");
-
-  self_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "self");
-
   setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", []);
 
   setInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0]);
 
   setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1]);
 
+  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1, __arg_2]);
+
   setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", []);
 
   setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0]);
 
   setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1]);
 
-  webkitRequestFileSystemSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", []);
-
-  webkitRequestFileSystemSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", [__arg_0]);
-
-  webkitRequestFileSystemSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", [__arg_0, __arg_1]);
-
-  webkitRequestFileSystem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", []);
-
-  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0]);
-
-  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1]);
-
-  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
-
-  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
-
-  webkitResolveLocalFileSystemSyncURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemSyncURL", []);
-
-  webkitResolveLocalFileSystemSyncURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemSyncURL", [__arg_0]);
-
-  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", []);
-
-  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0]);
-
-  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
-
-  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
+  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1, __arg_2]);
 
 }
 
@@ -16881,41 +22950,85 @@
 class BlinkWorkerNavigator {
   static final instance = new BlinkWorkerNavigator();
 
+  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connection");
+
+  geofencing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "geofencing");
+
+  permissions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "permissions");
+
+  services_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "services");
+
+  webkitPersistentStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitPersistentStorage");
+
+  webkitTemporaryStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitTemporaryStorage");
+
+  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareConcurrency");
+
   appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appCodeName");
 
   appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appName");
 
   appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appVersion");
 
-  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connection");
-
   dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dartEnabled");
 
-  geofencing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "geofencing");
-
-  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareConcurrency");
-
-  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onLine");
-
   platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
 
   product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "product");
 
   userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userAgent");
 
-  webkitPersistentStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitPersistentStorage");
-
-  webkitTemporaryStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitTemporaryStorage");
+  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onLine");
 
 }
 
-class BlinkWorkerPerformance {
+class BlinkWorkerPerformance extends BlinkEventTarget {
   static final instance = new BlinkWorkerPerformance();
 
   memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "memory");
 
+  onwebkitresourcetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitresourcetimingbufferfull");
+
+  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => mthis["onwebkitresourcetimingbufferfull"] = __arg_0;
+
+  clearMarks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearMarks", []);
+
+  clearMarks_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearMarks", [__arg_0]);
+
+  clearMeasures_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearMeasures", []);
+
+  clearMeasures_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearMeasures", [__arg_0]);
+
+  getEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntries", []);
+
+  getEntriesByName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", []);
+
+  getEntriesByName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", [__arg_0]);
+
+  getEntriesByName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", [__arg_0, __arg_1]);
+
+  getEntriesByType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByType", []);
+
+  getEntriesByType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByType", [__arg_0]);
+
+  mark_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "mark", []);
+
+  mark_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "mark", [__arg_0]);
+
+  measure_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0]);
+
+  measure_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0, __arg_1]);
+
+  measure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0, __arg_1, __arg_2]);
+
   now_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "now", []);
 
+  webkitClearResourceTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitClearResourceTimings", []);
+
+  webkitSetResourceTimingBufferSize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitSetResourceTimingBufferSize", []);
+
+  webkitSetResourceTimingBufferSize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitSetResourceTimingBufferSize", [__arg_0]);
+
 }
 
 class BlinkXMLDocument extends BlinkDocument {
@@ -16926,11 +23039,41 @@
 class BlinkXMLHttpRequest extends BlinkXMLHttpRequestEventTarget {
   static final instance = new BlinkXMLHttpRequest();
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "XMLHttpRequest"), []);
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "XMLHttpRequest"), [__arg_0]);
+  onreadystatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreadystatechange");
+
+  onreadystatechange_Setter_(mthis, __arg_0) => mthis["onreadystatechange"] = __arg_0;
+
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+
+  response_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "response");
+
+  responseText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseText");
+
+  responseType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseType");
+
+  responseType_Setter_(mthis, __arg_0) => mthis["responseType"] = __arg_0;
+
+  responseURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseURL");
+
+  responseXML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseXML");
+
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+
+  statusText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusText");
+
+  timeout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeout");
+
+  timeout_Setter_(mthis, __arg_0) => mthis["timeout"] = __arg_0;
+
+  upload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upload");
+
+  withCredentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "withCredentials");
+
+  withCredentials_Setter_(mthis, __arg_0) => mthis["withCredentials"] = __arg_0;
+
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
 
   getAllResponseHeaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAllResponseHeaders", []);
 
@@ -16938,10 +23081,6 @@
 
   getResponseHeader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getResponseHeader", [__arg_0]);
 
-  onreadystatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreadystatechange");
-
-  onreadystatechange_Setter_(mthis, __arg_0) => mthis["onreadystatechange"] = __arg_0;
-
   open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
 
   open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0]);
@@ -16958,20 +23097,6 @@
 
   overrideMimeType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "overrideMimeType", [__arg_0]);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
-
-  responseText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseText");
-
-  responseType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseType");
-
-  responseType_Setter_(mthis, __arg_0) => mthis["responseType"] = __arg_0;
-
-  responseURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseURL");
-
-  responseXML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseXML");
-
-  response_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "response");
-
   send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
 
   send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
@@ -16982,20 +23107,6 @@
 
   setRequestHeader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setRequestHeader", [__arg_0, __arg_1]);
 
-  statusText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusText");
-
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
-
-  timeout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeout");
-
-  timeout_Setter_(mthis, __arg_0) => mthis["timeout"] = __arg_0;
-
-  upload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upload");
-
-  withCredentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "withCredentials");
-
-  withCredentials_Setter_(mthis, __arg_0) => mthis["withCredentials"] = __arg_0;
-
 }
 
 class BlinkXMLHttpRequestEventTarget extends BlinkEventTarget {
@@ -17071,8 +23182,6 @@
 
   createNSResolver_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createNSResolver", [__arg_0]);
 
-  evaluate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", []);
-
   evaluate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0]);
 
   evaluate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1]);
@@ -17114,31 +23223,31 @@
 
   invalidIteratorState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "invalidIteratorState");
 
-  iterateNext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "iterateNext", []);
-
   numberValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberValue");
 
   resultType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "resultType");
 
   singleNodeValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "singleNodeValue");
 
-  snapshotItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "snapshotItem", []);
-
-  snapshotItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "snapshotItem", [__arg_0]);
-
   snapshotLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "snapshotLength");
 
   stringValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stringValue");
 
+  iterateNext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "iterateNext", []);
+
+  snapshotItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "snapshotItem", []);
+
+  snapshotItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "snapshotItem", [__arg_0]);
+
 }
 
 class BlinkXSLTProcessor {
   static final instance = new BlinkXSLTProcessor();
 
-  clearParameters_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearParameters", []);
-
   constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "XSLTProcessor"), []);
 
+  clearParameters_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearParameters", []);
+
   getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
 
   getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
@@ -17262,5 +23371,4 @@
       throw new DomException.jsInterop(e);
     }
   }
-}
-
+}
\ No newline at end of file
diff --git a/sdk/lib/convert/line_splitter.dart b/sdk/lib/convert/line_splitter.dart
index b5ec32b..b9023f4 100644
--- a/sdk/lib/convert/line_splitter.dart
+++ b/sdk/lib/convert/line_splitter.dart
@@ -49,7 +49,29 @@
     }
   }
 
-  List<String> convert(String data) => split(data).toList();
+  List<String> convert(String data) {
+    List<String> lines = <String>[];
+    int end = data.length;
+    int sliceStart = 0;
+    int char = 0;
+    for (int i = 0; i < end; i++) {
+      int previousChar = char;
+      char = data.codeUnitAt(i);
+      if (char != _CR) {
+        if (char != _LF) continue;
+        if (previousChar == _CR) {
+          sliceStart = i + 1;
+          continue;
+        }
+      }
+      lines.add(data.substring(sliceStart, i));
+      sliceStart = i + 1;
+    }
+    if (sliceStart < end) {
+      lines.add(data.substring(sliceStart, end));
+    }
+    return lines;
+  }
 
   StringConversionSink startChunkedConversion(Sink<String> sink) {
     if (sink is! StringConversionSink) {
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 25dce9d..dc2593b 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -187,11 +187,6 @@
   @DocsEditable()
   String hreflang;
 
-  @DomName('HTMLAnchorElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String integrity;
-
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
   String rel;
@@ -268,180 +263,79 @@
 @DomName('Animation')
 @Experimental() // untriaged
 @Native("Animation")
-class Animation extends AnimationNode {
+class Animation extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory Animation._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Animation.Animation')
-  @DocsEditable()
-  factory Animation(Element target, List<Map> keyframes, [timingInput]) {
-    if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
-      return Animation._create_1(target, keyframes);
-    }
-    if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return Animation._create_2(target, keyframes, timingInput);
-    }
-    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      var timingInput_1 = convertDartToNative_Dictionary(timingInput);
-      return Animation._create_3(target, keyframes, timingInput_1);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-  static Animation _create_1(target, keyframes) => JS('Animation', 'new Animation(#,#)', target, keyframes);
-  static Animation _create_2(target, keyframes, timingInput) => JS('Animation', 'new Animation(#,#,#)', target, keyframes, timingInput);
-  static Animation _create_3(target, keyframes, timingInput) => JS('Animation', 'new Animation(#,#,#)', target, keyframes, timingInput);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('AnimationEffect')
-@Experimental() // untriaged
-@Native("AnimationEffect")
-class AnimationEffect extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory AnimationEffect._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('WebKitAnimationEvent')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-@Native("WebKitAnimationEvent")
-class AnimationEvent extends Event {
-  // To suppress missing implicit constructor warnings.
-  factory AnimationEvent._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('WebKitAnimationEvent.animationName')
-  @DocsEditable()
-  final String animationName;
-
-  @DomName('WebKitAnimationEvent.elapsedTime')
-  @DocsEditable()
-  final double elapsedTime;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('AnimationNode')
-@Experimental() // untriaged
-@Native("AnimationNode")
-class AnimationNode extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory AnimationNode._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('AnimationNode.activeDuration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double activeDuration;
-
-  @DomName('AnimationNode.currentIteration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int currentIteration;
-
-  @DomName('AnimationNode.duration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double duration;
-
-  @DomName('AnimationNode.endTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double endTime;
-
-  @DomName('AnimationNode.localTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double localTime;
-
-  @DomName('AnimationNode.player')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final AnimationPlayer player;
-
-  @DomName('AnimationNode.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double startTime;
-
-  @DomName('AnimationNode.timing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final Timing timing;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('AnimationPlayer')
-@Experimental() // untriaged
-@Native("AnimationPlayer")
-class AnimationPlayer extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory AnimationPlayer._() { throw new UnsupportedError("Not supported"); }
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(document.body.animate)');
 
-  @DomName('AnimationPlayer.currentTime')
+  @DomName('Animation.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
   num currentTime;
 
-  @DomName('AnimationPlayer.playState')
+  @DomName('Animation.effect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationEffectReadOnly effect;
+
+  @DomName('Animation.endClip')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num endClip;
+
+  @DomName('Animation.finished')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Future finished;
+
+  @DomName('Animation.playState')
   @DocsEditable()
   @Experimental() // untriaged
   final String playState;
 
-  @DomName('AnimationPlayer.playbackRate')
+  @DomName('Animation.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
   num playbackRate;
 
-  @DomName('AnimationPlayer.source')
+  @DomName('Animation.ready')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationNode source;
+  final Future ready;
 
-  @DomName('AnimationPlayer.startTime')
+  @DomName('Animation.startClip')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num startClip;
+
+  @DomName('Animation.startTime')
   @DocsEditable()
   @Experimental() // untriaged
   num startTime;
 
-  @DomName('AnimationPlayer.cancel')
+  @DomName('Animation.cancel')
   @DocsEditable()
   @Experimental() // untriaged
   void cancel() native;
 
-  @DomName('AnimationPlayer.finish')
+  @DomName('Animation.finish')
   @DocsEditable()
   @Experimental() // untriaged
   void finish() native;
 
-  @DomName('AnimationPlayer.pause')
+  @DomName('Animation.pause')
   @DocsEditable()
   @Experimental() // untriaged
   void pause() native;
 
-  @DomName('AnimationPlayer.play')
+  @DomName('Animation.play')
   @DocsEditable()
   @Experimental() // untriaged
   void play() native;
 
-  @DomName('AnimationPlayer.reverse')
+  @DomName('Animation.reverse')
   @DocsEditable()
   @Experimental() // untriaged
   void reverse() native;
@@ -452,6 +346,129 @@
 
 
 @DocsEditable()
+@DomName('AnimationEffectReadOnly')
+@Experimental() // untriaged
+@Native("AnimationEffectReadOnly")
+class AnimationEffectReadOnly extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationEffectReadOnly._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationEffectReadOnly.computedTiming')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Map get computedTiming => convertNativeToDart_Dictionary(this._get_computedTiming);
+  @JSName('computedTiming')
+  @DomName('AnimationEffectReadOnly.computedTiming')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final dynamic _get_computedTiming;
+
+  @DomName('AnimationEffectReadOnly.timing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AnimationEffectTiming timing;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('AnimationEffectTiming')
+@Experimental() // untriaged
+@Native("AnimationEffectTiming")
+class AnimationEffectTiming extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationEffectTiming._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationEffectTiming.delay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num delay;
+
+  @DomName('AnimationEffectTiming.direction')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String direction;
+
+  @DomName('AnimationEffectTiming.duration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  @Creates('Null')
+  @Returns('num|String')
+  Object duration;
+
+  @DomName('AnimationEffectTiming.easing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String easing;
+
+  @DomName('AnimationEffectTiming.endDelay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num endDelay;
+
+  @DomName('AnimationEffectTiming.fill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String fill;
+
+  @DomName('AnimationEffectTiming.iterationStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num iterationStart;
+
+  @DomName('AnimationEffectTiming.iterations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num iterations;
+
+  @DomName('AnimationEffectTiming.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num playbackRate;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('AnimationEvent')
+@Experimental() // untriaged
+@Native("AnimationEvent")
+class AnimationEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationEvent.AnimationEvent')
+  @DocsEditable()
+  factory AnimationEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return AnimationEvent._create_1(type, eventInitDict_1);
+    }
+    return AnimationEvent._create_2(type);
+  }
+  static AnimationEvent _create_1(type, eventInitDict) => JS('AnimationEvent', 'new AnimationEvent(#,#)', type, eventInitDict);
+  static AnimationEvent _create_2(type) => JS('AnimationEvent', 'new AnimationEvent(#)', type);
+
+  @DomName('AnimationEvent.animationName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String animationName;
+
+  @DomName('AnimationEvent.elapsedTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double elapsedTime;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('AnimationPlayerEvent')
 @Experimental() // untriaged
 @Native("AnimationPlayerEvent")
@@ -459,6 +476,18 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationPlayerEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('AnimationPlayerEvent.AnimationPlayerEvent')
+  @DocsEditable()
+  factory AnimationPlayerEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return AnimationPlayerEvent._create_1(type, eventInitDict_1);
+    }
+    return AnimationPlayerEvent._create_2(type);
+  }
+  static AnimationPlayerEvent _create_1(type, eventInitDict) => JS('AnimationPlayerEvent', 'new AnimationPlayerEvent(#,#)', type, eventInitDict);
+  static AnimationPlayerEvent _create_2(type) => JS('AnimationPlayerEvent', 'new AnimationPlayerEvent(#)', type);
+
   @DomName('AnimationPlayerEvent.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
@@ -485,17 +514,45 @@
   @DomName('AnimationTimeline.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  final double currentTime;
+  num currentTime;
 
-  @DomName('AnimationTimeline.getAnimationPlayers')
+  @DomName('AnimationTimeline.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  List<AnimationPlayer> getAnimationPlayers() native;
+  num playbackRate;
+
+  @DomName('AnimationTimeline.getAnimations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Animation> getAnimations() native;
 
   @DomName('AnimationTimeline.play')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationPlayer play(AnimationNode source) native;
+  Animation play(AnimationEffectReadOnly source) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('AppBannerPromptResult')
+@Experimental() // untriaged
+@Native("AppBannerPromptResult")
+class AppBannerPromptResult extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AppBannerPromptResult._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AppBannerPromptResult.outcome')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String outcome;
+
+  @DomName('AppBannerPromptResult.platform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String platform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -694,6 +751,18 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCacheErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ApplicationCacheErrorEvent.ApplicationCacheErrorEvent')
+  @DocsEditable()
+  factory ApplicationCacheErrorEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
+    }
+    return ApplicationCacheErrorEvent._create_2(type);
+  }
+  static ApplicationCacheErrorEvent _create_1(type, eventInitDict) => JS('ApplicationCacheErrorEvent', 'new ApplicationCacheErrorEvent(#,#)', type, eventInitDict);
+  static ApplicationCacheErrorEvent _create_2(type) => JS('ApplicationCacheErrorEvent', 'new ApplicationCacheErrorEvent(#)', type);
+
   @DomName('ApplicationCacheErrorEvent.message')
   @DocsEditable()
   @Experimental() // untriaged
@@ -935,6 +1004,18 @@
   // To suppress missing implicit constructor warnings.
   factory AutocompleteErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('AutocompleteErrorEvent.AutocompleteErrorEvent')
+  @DocsEditable()
+  factory AutocompleteErrorEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return AutocompleteErrorEvent._create_1(type, eventInitDict_1);
+    }
+    return AutocompleteErrorEvent._create_2(type);
+  }
+  static AutocompleteErrorEvent _create_1(type, eventInitDict) => JS('AutocompleteErrorEvent', 'new AutocompleteErrorEvent(#,#)', type, eventInitDict);
+  static AutocompleteErrorEvent _create_2(type) => JS('AutocompleteErrorEvent', 'new AutocompleteErrorEvent(#)', type);
+
   @DomName('AutocompleteErrorEvent.reason')
   @DocsEditable()
   final String reason;
@@ -1045,6 +1126,43 @@
 
 
 @DocsEditable()
+@DomName('BeforeInstallPromptEvent')
+@Experimental() // untriaged
+@Native("BeforeInstallPromptEvent")
+class BeforeInstallPromptEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory BeforeInstallPromptEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('BeforeInstallPromptEvent.BeforeInstallPromptEvent')
+  @DocsEditable()
+  factory BeforeInstallPromptEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
+    }
+    return BeforeInstallPromptEvent._create_2(type);
+  }
+  static BeforeInstallPromptEvent _create_1(type, eventInitDict) => JS('BeforeInstallPromptEvent', 'new BeforeInstallPromptEvent(#,#)', type, eventInitDict);
+  static BeforeInstallPromptEvent _create_2(type) => JS('BeforeInstallPromptEvent', 'new BeforeInstallPromptEvent(#)', type);
+
+  List<String> get platforms => JS("List<String>", "#.platforms", this);
+
+  @DomName('BeforeInstallPromptEvent.userChoice')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Future userChoice;
+
+  @DomName('BeforeInstallPromptEvent.prompt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future prompt() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BeforeUnloadEvent')
 @Native("BeforeUnloadEvent")
 class BeforeUnloadEvent extends Event {
@@ -1111,6 +1229,204 @@
 
 
 @DocsEditable()
+@DomName('Bluetooth')
+@Experimental() // untriaged
+@Native("Bluetooth")
+class Bluetooth extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Bluetooth._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Bluetooth.requestDevice')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestDevice(Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    return _requestDevice_1(options_1);
+  }
+  @JSName('requestDevice')
+  @DomName('Bluetooth.requestDevice')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _requestDevice_1(options) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BluetoothDevice')
+@Experimental() // untriaged
+@Native("BluetoothDevice")
+class BluetoothDevice extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothDevice._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('BluetoothDevice.deviceClass')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int deviceClass;
+
+  @DomName('BluetoothDevice.instanceID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String instanceID;
+
+  @DomName('BluetoothDevice.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String name;
+
+  @DomName('BluetoothDevice.paired')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool paired;
+
+  @DomName('BluetoothDevice.productID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int productID;
+
+  @DomName('BluetoothDevice.productVersion')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int productVersion;
+
+  @DomName('BluetoothDevice.vendorID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int vendorID;
+
+  @DomName('BluetoothDevice.vendorIDSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String vendorIDSource;
+
+  @JSName('connectGATT')
+  @DomName('BluetoothDevice.connectGATT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future connectGatt() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BluetoothGATTCharacteristic')
+@Experimental() // untriaged
+@Native("BluetoothGATTCharacteristic")
+class BluetoothGattCharacteristic extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothGattCharacteristic._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('BluetoothGATTCharacteristic.uuid')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String uuid;
+
+  @DomName('BluetoothGATTCharacteristic.readValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future readValue() native;
+
+  @DomName('BluetoothGATTCharacteristic.writeValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future writeValue(/*BufferSource*/ value) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BluetoothGATTRemoteServer')
+@Experimental() // untriaged
+@Native("BluetoothGATTRemoteServer")
+class BluetoothGattRemoteServer extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothGattRemoteServer._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('BluetoothGATTRemoteServer.connected')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool connected;
+
+  @DomName('BluetoothGATTRemoteServer.getPrimaryService')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getPrimaryService(/*BluetoothServiceUUID*/ service) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BluetoothGATTService')
+@Experimental() // untriaged
+@Native("BluetoothGATTService")
+class BluetoothGattService extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothGattService._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('BluetoothGATTService.isPrimary')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isPrimary;
+
+  @DomName('BluetoothGATTService.uuid')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String uuid;
+
+  @DomName('BluetoothGATTService.getCharacteristic')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getCharacteristic(/*BluetoothCharacteristicUUID*/ characteristic) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BluetoothUUID')
+@Experimental() // untriaged
+@Native("BluetoothUUID")
+class BluetoothUuid extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothUuid._() { throw new UnsupportedError("Not supported"); }
+
+  @JSName('canonicalUUID')
+  @DomName('BluetoothUUID.canonicalUUID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static String canonicalUuid(int alias) native;
+
+  @DomName('BluetoothUUID.getCharacteristic')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static String getCharacteristic(Object name) native;
+
+  @DomName('BluetoothUUID.getDescriptor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static String getDescriptor(Object name) native;
+
+  @DomName('BluetoothUUID.getService')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static String getService(Object name) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('Body')
 @Experimental() // untriaged
 @Native("Body")
@@ -1444,6 +1760,11 @@
   @DocsEditable()
   bool checkValidity() native;
 
+  @DomName('HTMLButtonElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
+
   @DomName('HTMLButtonElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) native;
@@ -1475,21 +1796,11 @@
   // To suppress missing implicit constructor warnings.
   factory CacheStorage._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('CacheStorage.create')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future create(String cacheName) native;
-
   @DomName('CacheStorage.delete')
   @DocsEditable()
   @Experimental() // untriaged
   Future delete(String cacheName) native;
 
-  @DomName('CacheStorage.get')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future get(String cacheName) native;
-
   @DomName('CacheStorage.has')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1499,29 +1810,32 @@
   @DocsEditable()
   @Experimental() // untriaged
   Future keys() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('Canvas2DContextAttributes')
-// http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
-@Experimental()
-@Native("Canvas2DContextAttributes")
-class Canvas2DContextAttributes extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory Canvas2DContextAttributes._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Canvas2DContextAttributes.alpha')
-  @DocsEditable()
-  bool alpha;
-
-  @DomName('Canvas2DContextAttributes.storage')
+  @DomName('CacheStorage.match')
   @DocsEditable()
   @Experimental() // untriaged
-  String storage;
+  Future match(/*RequestInfo*/ request, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _match_1(request, options_1);
+    }
+    return _match_2(request);
+  }
+  @JSName('match')
+  @DomName('CacheStorage.match')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _match_1(request, options) native;
+  @JSName('match')
+  @DomName('CacheStorage.match')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _match_2(request) native;
+
+  @DomName('CacheStorage.open')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future open(String cacheName) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1583,10 +1897,10 @@
   @DocsEditable()
   @Creates('CanvasRenderingContext2D|RenderingContext')
   @Returns('CanvasRenderingContext2D|RenderingContext|Null')
-  Object getContext(String contextId, [Map attrs]) {
-    if (attrs != null) {
-      var attrs_1 = convertDartToNative_Dictionary(attrs);
-      return _getContext_1(contextId, attrs_1);
+  Object getContext(String contextId, [Map attributes]) {
+    if (attributes != null) {
+      var attributes_1 = convertDartToNative_Dictionary(attributes);
+      return _getContext_1(contextId, attributes_1);
     }
     return _getContext_2(contextId);
   }
@@ -1595,7 +1909,7 @@
   @DocsEditable()
   @Creates('CanvasRenderingContext2D|RenderingContext')
   @Returns('CanvasRenderingContext2D|RenderingContext|Null')
-  Object _getContext_1(contextId, attrs) native;
+  Object _getContext_1(contextId, attributes) native;
   @JSName('getContext')
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
@@ -1606,7 +1920,7 @@
   @JSName('toDataURL')
   @DomName('HTMLCanvasElement.toDataURL')
   @DocsEditable()
-  String _toDataUrl(String type, [num quality]) native;
+  String _toDataUrl(String type, [arguments_OR_quality]) native;
 
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
@@ -1832,6 +2146,11 @@
   @Returns('String|CanvasGradient|CanvasPattern')
   Object fillStyle;
 
+  @DomName('CanvasRenderingContext2D.filter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String filter;
+
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
   String font;
@@ -1948,27 +2267,26 @@
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  ImageData createImageData(num sw, num sh) {
-    return convertNativeToDart_ImageData(_createImageData_1(sw, sh));
+  ImageData createImageData(imagedata_OR_sw, [num sh]) {
+    if ((imagedata_OR_sw is ImageData) && sh == null) {
+      var imagedata_1 = convertDartToNative_ImageData(imagedata_OR_sw);
+      return convertNativeToDart_ImageData(_createImageData_1(imagedata_1));
+    }
+    if (sh != null && (imagedata_OR_sw is num)) {
+      return convertNativeToDart_ImageData(_createImageData_2(imagedata_OR_sw, sh));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('createImageData')
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  _createImageData_1(sw, sh) native;
-
-  @DomName('CanvasRenderingContext2D.createImageData')
-  @DocsEditable()
-  @Creates('ImageData|=Object')
-  ImageData createImageDataFromImageData(ImageData imagedata) {
-    var imagedata_1 = convertDartToNative_ImageData(imagedata);
-    return convertNativeToDart_ImageData(_createImageDataFromImageData_1(imagedata_1));
-  }
+  _createImageData_1(imagedata) native;
   @JSName('createImageData')
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  _createImageDataFromImageData_1(imagedata) native;
+  _createImageData_2(num sw, sh) native;
 
   @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
@@ -1976,12 +2294,7 @@
 
   @DomName('CanvasRenderingContext2D.createPattern')
   @DocsEditable()
-  CanvasPattern createPattern(canvas_OR_image, String repetitionType) native;
-
-  @JSName('createPattern')
-  @DomName('CanvasRenderingContext2D.createPattern')
-  @DocsEditable()
-  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) native;
+  CanvasPattern createPattern(Object image, String repetitionType) native;
 
   @DomName('CanvasRenderingContext2D.createRadialGradient')
   @DocsEditable()
@@ -2000,7 +2313,15 @@
   @DocsEditable()
   // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
   @Experimental()
-  Canvas2DContextAttributes getContextAttributes() native;
+  Map getContextAttributes() {
+    return convertNativeToDart_Dictionary(_getContextAttributes_1());
+  }
+  @JSName('getContextAttributes')
+  @DomName('CanvasRenderingContext2D.getContextAttributes')
+  @DocsEditable()
+  // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
+  @Experimental()
+  _getContextAttributes_1() native;
 
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
@@ -2156,6 +2477,11 @@
   void rect(num x, num y, num width, num height) native;
 
 
+  @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
+  @DocsEditable()
+  ImageData createImageDataFromImageData(ImageData imagedata) =>
+    JS('ImageData', '#.createImageData(#)', this, imagedata);
+
   /**
    * Sets the color used inside shapes.
    * [r], [g], [b] are 0-255, [a] is 0-1.
@@ -2200,6 +2526,10 @@
        endAngle, anticlockwise);
   }
 
+  @DomName('CanvasRenderingContext2D.createPatternFromImage')
+  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) =>
+    JS('CanvasPattern', '#.createPattern(#, #)', this, image, repetitionType);
+
   /**
    * Draws an image from a CanvasImageSource to an area of this canvas.
    *
@@ -2457,7 +2787,7 @@
 @DocsEditable()
 @DomName('CharacterData')
 @Native("CharacterData")
-class CharacterData extends Node implements ChildNode {
+class CharacterData extends Node implements NonDocumentTypeChildNode, ChildNode {
   // To suppress missing implicit constructor warnings.
   factory CharacterData._() { throw new UnsupportedError("Not supported"); }
 
@@ -2475,7 +2805,7 @@
 
   @DomName('CharacterData.deleteData')
   @DocsEditable()
-  void deleteData(int offset, int length) native;
+  void deleteData(int offset, int count) native;
 
   @DomName('CharacterData.insertData')
   @DocsEditable()
@@ -2483,14 +2813,26 @@
 
   @DomName('CharacterData.replaceData')
   @DocsEditable()
-  void replaceData(int offset, int length, String data) native;
+  void replaceData(int offset, int count, String data) native;
 
   @DomName('CharacterData.substringData')
   @DocsEditable()
-  String substringData(int offset, int length) native;
+  String substringData(int offset, int count) native;
 
   // From ChildNode
 
+  @DomName('CharacterData.after')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void after(Object nodes) native;
+
+  @DomName('CharacterData.before')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void before(Object nodes) native;
+
+  // From NonDocumentTypeChildNode
+
   @DomName('CharacterData.nextElementSibling')
   @DocsEditable()
   final Element nextElementSibling;
@@ -2511,9 +2853,9 @@
   // To suppress missing implicit constructor warnings.
   factory ChildNode._() { throw new UnsupportedError("Not supported"); }
 
-  final Element nextElementSibling;
+  void after(Object nodes);
 
-  final Element previousElementSibling;
+  void before(Object nodes);
 
   void remove();
 }
@@ -2523,6 +2865,19 @@
 
 
 @DocsEditable()
+@DomName('CHROMIUMValuebuffer')
+@Experimental() // untriaged
+@Native("CHROMIUMValuebuffer")
+class ChromiumValuebuffer extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ChromiumValuebuffer._() { throw new UnsupportedError("Not supported"); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CircularGeofencingRegion')
 @Experimental() // untriaged
 @Native("CircularGeofencingRegion")
@@ -2569,12 +2924,138 @@
 
 
 @DocsEditable()
+@DomName('Client')
+@Experimental() // untriaged
+@Native("Client")
+class Client extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Client._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Client.frameType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String frameType;
+
+  @DomName('Client.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('Client.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String url;
+
+  @DomName('Client.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      var message_1 = convertDartToNative_SerializedScriptValue(message);
+      _postMessage_1(message_1, transfer);
+      return;
+    }
+    var message_1 = convertDartToNative_SerializedScriptValue(message);
+    _postMessage_2(message_1);
+    return;
+  }
+  @JSName('postMessage')
+  @DomName('Client.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _postMessage_1(message, List<MessagePort> transfer) native;
+  @JSName('postMessage')
+  @DomName('Client.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _postMessage_2(message) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('Clients')
+@Experimental() // untriaged
+@Native("Clients")
+class Clients extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Clients._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Clients.claim')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future claim() native;
+
+  @DomName('Clients.matchAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future matchAll([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _matchAll_1(options_1);
+    }
+    return _matchAll_2();
+  }
+  @JSName('matchAll')
+  @DomName('Clients.matchAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _matchAll_1(options) native;
+  @JSName('matchAll')
+  @DomName('Clients.matchAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _matchAll_2() native;
+
+  @DomName('Clients.openWindow')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future openWindow(String url) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('ClipboardEvent')
+@Experimental() // untriaged
+@Native("ClipboardEvent")
+class ClipboardEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory ClipboardEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ClipboardEvent.clipboardData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DataTransfer clipboardData;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CloseEvent')
 @Native("CloseEvent")
 class CloseEvent extends Event {
   // To suppress missing implicit constructor warnings.
   factory CloseEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('CloseEvent.CloseEvent')
+  @DocsEditable()
+  factory CloseEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return CloseEvent._create_1(type, eventInitDict_1);
+    }
+    return CloseEvent._create_2(type);
+  }
+  static CloseEvent _create_1(type, eventInitDict) => JS('CloseEvent', 'new CloseEvent(#,#)', type, eventInitDict);
+  static CloseEvent _create_2(type) => JS('CloseEvent', 'new CloseEvent(#)', type);
+
   @DomName('CloseEvent.code')
   @DocsEditable()
   final int code;
@@ -2634,32 +3115,27 @@
     return e;
   }
 
-  // To suppress missing implicit constructor warnings.
-  factory CompositionEvent._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('CompositionEvent.activeSegmentEnd')
+  @DomName('CompositionEvent.CompositionEvent')
   @DocsEditable()
-  @Experimental() // untriaged
-  final int activeSegmentEnd;
-
-  @DomName('CompositionEvent.activeSegmentStart')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int activeSegmentStart;
+  factory CompositionEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return CompositionEvent._create_1(type, eventInitDict_1);
+    }
+    return CompositionEvent._create_2(type);
+  }
+  static CompositionEvent _create_1(type, eventInitDict) => JS('CompositionEvent', 'new CompositionEvent(#,#)', type, eventInitDict);
+  static CompositionEvent _create_2(type) => JS('CompositionEvent', 'new CompositionEvent(#)', type);
 
   @DomName('CompositionEvent.data')
   @DocsEditable()
   final String data;
 
-  @DomName('CompositionEvent.getSegments')
-  @DocsEditable()
-  @Experimental() // untriaged
-  List<int> getSegments() native;
-
   @JSName('initCompositionEvent')
   @DomName('CompositionEvent.initCompositionEvent')
   @DocsEditable()
-  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native;
+  void _initCompositionEvent(String type, bool bubbles, bool cancelable, Window view, String data) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2667,6 +3143,182 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable()
+@DomName('CompositorProxy')
+@Experimental() // untriaged
+@Native("CompositorProxy")
+class CompositorProxy extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CompositorProxy._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CompositorProxy.CompositorProxy')
+  @DocsEditable()
+  factory CompositorProxy(Element element, List<String> attributeArray) {
+    return CompositorProxy._create_1(element, attributeArray);
+  }
+  static CompositorProxy _create_1(element, attributeArray) => JS('CompositorProxy', 'new CompositorProxy(#,#)', element, attributeArray);
+
+  @DomName('CompositorProxy.opacity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num opacity;
+
+  @DomName('CompositorProxy.scrollLeft')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num scrollLeft;
+
+  @DomName('CompositorProxy.scrollTop')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num scrollTop;
+
+  @DomName('CompositorProxy.transform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix transform;
+
+  @DomName('CompositorProxy.disconnect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disconnect() native;
+
+  @DomName('CompositorProxy.supports')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool supports(String attribute) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CompositorWorker')
+@Experimental() // untriaged
+@Native("CompositorWorker")
+class CompositorWorker extends EventTarget implements AbstractWorker {
+  // To suppress missing implicit constructor warnings.
+  factory CompositorWorker._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CompositorWorker.errorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+
+  @DomName('CompositorWorker.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('CompositorWorker.CompositorWorker')
+  @DocsEditable()
+  factory CompositorWorker(String scriptUrl) {
+    return CompositorWorker._create_1(scriptUrl);
+  }
+  static CompositorWorker _create_1(scriptUrl) => JS('CompositorWorker', 'new CompositorWorker(#)', scriptUrl);
+
+  @DomName('CompositorWorker.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      var message_1 = convertDartToNative_SerializedScriptValue(message);
+      _postMessage_1(message_1, transfer);
+      return;
+    }
+    var message_1 = convertDartToNative_SerializedScriptValue(message);
+    _postMessage_2(message_1);
+    return;
+  }
+  @JSName('postMessage')
+  @DomName('CompositorWorker.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _postMessage_1(message, List<MessagePort> transfer) native;
+  @JSName('postMessage')
+  @DomName('CompositorWorker.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _postMessage_2(message) native;
+
+  @DomName('CompositorWorker.terminate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void terminate() native;
+
+  @DomName('CompositorWorker.onerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onError => errorEvent.forTarget(this);
+
+  @DomName('CompositorWorker.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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.
+
+
+@DocsEditable()
+@DomName('CompositorWorkerGlobalScope')
+@Experimental() // untriaged
+@Native("CompositorWorkerGlobalScope")
+class CompositorWorkerGlobalScope extends WorkerGlobalScope {
+  // To suppress missing implicit constructor warnings.
+  factory CompositorWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CompositorWorkerGlobalScope.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('CompositorWorkerGlobalScope.cancelAnimationFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cancelAnimationFrame(int handle) native;
+
+  @DomName('CompositorWorkerGlobalScope.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(/*any*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      var message_1 = convertDartToNative_SerializedScriptValue(message);
+      _postMessage_1(message_1, transfer);
+      return;
+    }
+    var message_1 = convertDartToNative_SerializedScriptValue(message);
+    _postMessage_2(message_1);
+    return;
+  }
+  @JSName('postMessage')
+  @DomName('CompositorWorkerGlobalScope.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _postMessage_1(message, List<MessagePort> transfer) native;
+  @JSName('postMessage')
+  @DomName('CompositorWorkerGlobalScope.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _postMessage_2(message) native;
+
+  @DomName('CompositorWorkerGlobalScope.requestAnimationFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int requestAnimationFrame(FrameRequestCallback callback) native;
+
+  @DomName('CompositorWorkerGlobalScope.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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.
+
+
 @DomName('Console')
 class Console {
 
@@ -2780,6 +3432,12 @@
   // To suppress missing implicit constructor warnings.
   factory ConsoleBase._() { throw new UnsupportedError("Not supported"); }
 
+  @JSName('assert')
+  @DomName('ConsoleBase.assert')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void assertCondition(bool condition, Object arg) native;
+
   @DomName('ConsoleBase.timeline')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2881,11 +3539,11 @@
   // To suppress missing implicit constructor warnings.
   factory Credential._() { throw new UnsupportedError("Not supported"); }
 
-  @JSName('avatarURL')
-  @DomName('Credential.avatarURL')
+  @JSName('iconURL')
+  @DomName('Credential.iconURL')
   @DocsEditable()
   @Experimental() // untriaged
-  final String avatarUrl;
+  final String iconUrl;
 
   @DomName('Credential.id')
   @DocsEditable()
@@ -2896,6 +3554,11 @@
   @DocsEditable()
   @Experimental() // untriaged
   final String name;
+
+  @DomName('Credential.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2910,21 +3573,11 @@
   // To suppress missing implicit constructor warnings.
   factory CredentialsContainer._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('CredentialsContainer.notifyFailedSignIn')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future notifyFailedSignIn(Credential credential) native;
-
   @DomName('CredentialsContainer.notifySignedIn')
   @DocsEditable()
   @Experimental() // untriaged
   Future notifySignedIn(Credential credential) native;
 
-  @DomName('CredentialsContainer.notifySignedOut')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future notifySignedOut() native;
-
   @DomName('CredentialsContainer.request')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2945,6 +3598,81 @@
   @DocsEditable()
   @Experimental() // untriaged
   Future _request_2() native;
+
+  @DomName('CredentialsContainer.requireUserMediation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requireUserMediation() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CrossOriginConnectEvent')
+@Experimental() // untriaged
+@Native("CrossOriginConnectEvent")
+class CrossOriginConnectEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory CrossOriginConnectEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CrossOriginConnectEvent.client')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CrossOriginServiceWorkerClient client;
+
+  @DomName('CrossOriginConnectEvent.acceptConnection')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void acceptConnection(Future shouldAccept) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CrossOriginServiceWorkerClient')
+@Experimental() // untriaged
+@Native("CrossOriginServiceWorkerClient")
+class CrossOriginServiceWorkerClient extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory CrossOriginServiceWorkerClient._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CrossOriginServiceWorkerClient.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
+  @DomName('CrossOriginServiceWorkerClient.targetUrl')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String targetUrl;
+
+  @DomName('CrossOriginServiceWorkerClient.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      var message_1 = convertDartToNative_SerializedScriptValue(message);
+      _postMessage_1(message_1, transfer);
+      return;
+    }
+    var message_1 = convertDartToNative_SerializedScriptValue(message);
+    _postMessage_2(message_1);
+    return;
+  }
+  @JSName('postMessage')
+  @DomName('CrossOriginServiceWorkerClient.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _postMessage_1(message, List<MessagePort> transfer) native;
+  @JSName('postMessage')
+  @DomName('CrossOriginServiceWorkerClient.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _postMessage_2(message) native;
 }
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2998,6 +3726,7 @@
   @DomName('CryptoKey.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
+  @Creates('Null')
   final Object algorithm;
 
   @DomName('CryptoKey.extractable')
@@ -3031,12 +3760,12 @@
 
   @DomName('CSS.supports')
   @DocsEditable()
-  bool supports(String property, String value) native;
+  static bool supports(String property, String value) native;
 
   @JSName('supports')
   @DomName('CSS.supports')
   @DocsEditable()
-  bool supportsCondition(String conditionText) native;
+  static bool supportsCondition(String conditionText) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3062,26 +3791,6 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSFilterRule')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/filter-effects/
-@Native("WebKitCSSFilterRule")
-class CssFilterRule extends CssRule {
-  // To suppress missing implicit constructor warnings.
-  factory CssFilterRule._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('WebKitCSSFilterRule.style')
-  @DocsEditable()
-  final CssStyleDeclaration style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('CSSFontFaceRule')
 @Native("CSSFontFaceRule")
 class CssFontFaceRule extends CssRule {
@@ -3098,6 +3807,36 @@
 
 
 @DocsEditable()
+@DomName('CSSGroupingRule')
+@Experimental() // untriaged
+@Native("CSSGroupingRule")
+class CssGroupingRule extends CssRule {
+  // To suppress missing implicit constructor warnings.
+  factory CssGroupingRule._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CSSGroupingRule.cssRules')
+  @DocsEditable()
+  @Experimental() // untriaged
+  @Returns('_CssRuleList')
+  @Creates('_CssRuleList')
+  final List<CssRule> cssRules;
+
+  @DomName('CSSGroupingRule.deleteRule')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteRule(int index) native;
+
+  @DomName('CSSGroupingRule.insertRule')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int insertRule(String rule, int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CSSImportRule')
 @Native("CSSImportRule")
 class CssImportRule extends CssRule {
@@ -3169,21 +3908,20 @@
   @Experimental() // untriaged
   CssKeyframeRule __getter__(int index) native;
 
+  @DomName('CSSKeyframesRule.appendRule')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void appendRule(String rule) native;
+
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(String key) native;
+  void deleteRule(String select) native;
 
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String key) native;
-
-  @JSName('insertRule')
-  @DomName('CSSKeyframesRule.insertRule')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void appendRule(String rule) native;
+  CssKeyframeRule findRule(String select) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3193,27 +3931,13 @@
 @DocsEditable()
 @DomName('CSSMediaRule')
 @Native("CSSMediaRule")
-class CssMediaRule extends CssRule {
+class CssMediaRule extends CssGroupingRule {
   // To suppress missing implicit constructor warnings.
   factory CssMediaRule._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('CSSMediaRule.cssRules')
-  @DocsEditable()
-  @Returns('_CssRuleList')
-  @Creates('_CssRuleList')
-  final List<CssRule> cssRules;
-
   @DomName('CSSMediaRule.media')
   @DocsEditable()
   final MediaList media;
-
-  @DomName('CSSMediaRule.deleteRule')
-  @DocsEditable()
-  void deleteRule(int index) native;
-
-  @DomName('CSSMediaRule.insertRule')
-  @DocsEditable()
-  int insertRule(String rule, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3290,12 +4014,6 @@
   @Experimental() // untriaged
   static const int VIEWPORT_RULE = 15;
 
-  @DomName('CSSRule.WEBKIT_FILTER_RULE')
-  @DocsEditable()
-  // http://www.w3.org/TR/filter-effects/
-  @Experimental()
-  static const int WEBKIT_FILTER_RULE = 17;
-
   @DomName('CSSRule.WEBKIT_KEYFRAMES_RULE')
   @DocsEditable()
   // http://www.w3.org/TR/css3-animations/#cssrule
@@ -3439,23 +4157,14 @@
   @DocsEditable()
   final CssRule parentRule;
 
-  @DomName('CSSStyleDeclaration.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object __getter__(String name) native;
-
-  @DomName('CSSStyleDeclaration.__setter__')
-  @DocsEditable()
-  void __setter__(String propertyName, String propertyValue) native;
-
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable()
-  String getPropertyPriority(String propertyName) native;
+  String getPropertyPriority(String property) native;
 
   @JSName('getPropertyValue')
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable()
-  String _getPropertyValue(String propertyName) native;
+  String _getPropertyValue(String property) native;
 
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable()
@@ -3463,7 +4172,7 @@
 
   @DomName('CSSStyleDeclaration.removeProperty')
   @DocsEditable()
-  String removeProperty(String propertyName) native;
+  String removeProperty(String property) native;
 
 
   /** Gets the value of "background" */
@@ -8188,8 +8897,18 @@
     }
     return _detail;
   }
-  // To suppress missing implicit constructor warnings.
-  factory CustomEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CustomEvent.CustomEvent')
+  @DocsEditable()
+  factory CustomEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return CustomEvent._create_1(type, eventInitDict_1);
+    }
+    return CustomEvent._create_2(type);
+  }
+  static CustomEvent _create_1(type, eventInitDict) => JS('CustomEvent', 'new CustomEvent(#,#)', type, eventInitDict);
+  static CustomEvent _create_2(type) => JS('CustomEvent', 'new CustomEvent(#)', type);
 
   @DomName('CustomEvent._detail')
   @DocsEditable()
@@ -8205,7 +8924,7 @@
   @JSName('initCustomEvent')
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native;
+  void _initCustomEvent(String type, bool bubbles, bool cancelable, Object detail) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8308,17 +9027,17 @@
   @DomName('DataTransfer.clearData')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearData([String type]) native;
+  void clearData([String format]) native;
 
   @DomName('DataTransfer.getData')
   @DocsEditable()
   @Experimental() // untriaged
-  String getData(String type) native;
+  String getData(String format) native;
 
   @DomName('DataTransfer.setData')
   @DocsEditable()
   @Experimental() // untriaged
-  void setData(String type, String data) native;
+  void setData(String format, String data) native;
 
   @DomName('DataTransfer.setDragImage')
   @DocsEditable()
@@ -8392,11 +9111,6 @@
   @DocsEditable()
   final int length;
 
-  @DomName('DataTransferItemList.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DataTransferItem __getter__(int index) native;
-
   @DomName('DataTransferItemList.add')
   @DocsEditable()
   DataTransferItem add(data_OR_file, [String type]) native;
@@ -8415,6 +9129,10 @@
   @DocsEditable()
   void clear() native;
 
+  @DomName('DataTransferItemList.item')
+  @DocsEditable()
+  DataTransferItem item(int index) native;
+
   @DomName('DataTransferItemList.remove')
   @DocsEditable()
   @Experimental() // untriaged
@@ -8497,6 +9215,36 @@
 
 
 @DocsEditable()
+@DomName('DefaultSessionStartEvent')
+@Experimental() // untriaged
+@Native("DefaultSessionStartEvent")
+class DefaultSessionStartEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory DefaultSessionStartEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('DefaultSessionStartEvent.DefaultSessionStartEvent')
+  @DocsEditable()
+  factory DefaultSessionStartEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return DefaultSessionStartEvent._create_1(type, eventInitDict_1);
+    }
+    return DefaultSessionStartEvent._create_2(type);
+  }
+  static DefaultSessionStartEvent _create_1(type, eventInitDict) => JS('DefaultSessionStartEvent', 'new DefaultSessionStartEvent(#,#)', type, eventInitDict);
+  static DefaultSessionStartEvent _create_2(type) => JS('DefaultSessionStartEvent', 'new DefaultSessionStartEvent(#)', type);
+
+  @DomName('DefaultSessionStartEvent.session')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PresentationSession session;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('DeprecatedStorageInfo')
 @Experimental() // untriaged
 @Native("DeprecatedStorageInfo")
@@ -8618,6 +9366,18 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceLightEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('DeviceLightEvent.DeviceLightEvent')
+  @DocsEditable()
+  factory DeviceLightEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return DeviceLightEvent._create_1(type, eventInitDict_1);
+    }
+    return DeviceLightEvent._create_2(type);
+  }
+  static DeviceLightEvent _create_1(type, eventInitDict) => JS('DeviceLightEvent', 'new DeviceLightEvent(#,#)', type, eventInitDict);
+  static DeviceLightEvent _create_2(type) => JS('DeviceLightEvent', 'new DeviceLightEvent(#)', type);
+
   @DomName('DeviceLightEvent.value')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9156,6 +9916,11 @@
   @DocsEditable()
   final String _lastModified;
 
+  @DomName('Document.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
   @DomName('Document.pointerLockElement')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9180,6 +9945,11 @@
   @Experimental() // untriaged
   final SvgSvgElement rootElement;
 
+  @DomName('Document.scrollingElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element scrollingElement;
+
   @JSName('selectedStylesheetSet')
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
@@ -9286,16 +10056,16 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num webkitRadiusX, num webkitRadiusY, num webkitRotationAngle, num webkitForce) {
+  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num radiusX, num radiusY, num rotationAngle, num force) {
     var target_1 = _convertDartToNative_EventTarget(target);
-    return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
+    return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
   }
   @JSName('createTouch')
   @DomName('Document.createTouch')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch_1(Window window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native;
+  Touch _createTouch_1(Window window, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) native;
 
   @JSName('createTouchList')
   @DomName('Document.createTouchList')
@@ -9309,9 +10079,14 @@
   @DocsEditable()
   Element _elementFromPoint(int x, int y) native;
 
+  @DomName('Document.elementsFromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Element> elementsFromPoint(int x, int y) native;
+
   @DomName('Document.execCommand')
   @DocsEditable()
-  bool execCommand(String command, bool userInterface, String value) native;
+  bool execCommand(String commandId, [bool showUI, String value]) native;
 
   @DomName('Document.exitFullscreen')
   @DocsEditable()
@@ -9330,10 +10105,6 @@
   @Experimental() // non-standard
   Object _getCssCanvasContext(String contextId, String name, int width, int height) native;
 
-  @DomName('Document.getElementById')
-  @DocsEditable()
-  Element getElementById(String elementId) native;
-
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
@@ -9358,23 +10129,23 @@
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
-  bool queryCommandEnabled(String command) native;
+  bool queryCommandEnabled(String commandId) native;
 
   @DomName('Document.queryCommandIndeterm')
   @DocsEditable()
-  bool queryCommandIndeterm(String command) native;
+  bool queryCommandIndeterm(String commandId) native;
 
   @DomName('Document.queryCommandState')
   @DocsEditable()
-  bool queryCommandState(String command) native;
+  bool queryCommandState(String commandId) native;
 
   @DomName('Document.queryCommandSupported')
   @DocsEditable()
-  bool queryCommandSupported(String command) native;
+  bool queryCommandSupported(String commandId) native;
 
   @DomName('Document.queryCommandValue')
   @DocsEditable()
-  String queryCommandValue(String command) native;
+  String queryCommandValue(String commandId) native;
 
   @DomName('Document.transformDocumentToTreeView')
   @DocsEditable()
@@ -9390,6 +10161,12 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
   void _webkitExitFullscreen() native;
 
+  // From NonElementParentNode
+
+  @DomName('Document.getElementById')
+  @DocsEditable()
+  Element getElementById(String elementId) native;
+
   // From ParentNode
 
   @JSName('childElementCount')
@@ -9495,12 +10272,12 @@
   /// Stream of `copy` events handled by this [Document].
   @DomName('Document.oncopy')
   @DocsEditable()
-  Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
+  Stream<ClipboardEvent> get onCopy => Element.copyEvent.forTarget(this);
 
   /// Stream of `cut` events handled by this [Document].
   @DomName('Document.oncut')
   @DocsEditable()
-  Stream<Event> get onCut => Element.cutEvent.forTarget(this);
+  Stream<ClipboardEvent> get onCut => Element.cutEvent.forTarget(this);
 
   /// Stream of `doubleclick` events handled by this [Document].
   @DomName('Document.ondblclick')
@@ -9652,7 +10429,7 @@
   /// Stream of `paste` events handled by this [Document].
   @DomName('Document.onpaste')
   @DocsEditable()
-  Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
+  Stream<ClipboardEvent> get onPaste => Element.pasteEvent.forTarget(this);
 
   @DomName('Document.onpause')
   @DocsEditable()
@@ -9909,7 +10686,7 @@
 
 @DomName('DocumentFragment')
 @Native("DocumentFragment")
-class DocumentFragment extends Node implements ParentNode {
+class DocumentFragment extends Node implements NonElementParentNode, ParentNode {
   factory DocumentFragment() => document.createDocumentFragment();
 
   factory DocumentFragment.html(String html,
@@ -10024,6 +10801,8 @@
   // To suppress missing implicit constructor warnings.
   factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
 
+  // From NonElementParentNode
+
   @DomName('DocumentFragment.getElementById')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10182,7 +10961,7 @@
 
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
-  bool hasFeature(String feature, String version) native;
+  bool hasFeature() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10396,17 +11175,17 @@
   @DomName('DOMMatrix.scale3dSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale3dSelf(num scale, [num ox, num oy, num oz]) native;
+  DomMatrix scale3dSelf(num scale, [num originX, num originY, num originZ]) native;
 
   @DomName('DOMMatrix.scaleNonUniformSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scaleNonUniformSelf(num sx, [num sy, num sz, num ox, num oy, num oz]) native;
+  DomMatrix scaleNonUniformSelf(num scaleX, [num scaleY, num scaleZ, num originX, num originY, num originZ]) native;
 
   @DomName('DOMMatrix.scaleSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scaleSelf(num scale, [num ox, num oy]) native;
+  DomMatrix scaleSelf(num scale, [num originX, num originY]) native;
 
   @DomName('DOMMatrix.translateSelf')
   @DocsEditable()
@@ -10554,17 +11333,17 @@
   @DomName('DOMMatrixReadOnly.scale')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale(num scale, [num ox, num oy]) native;
+  DomMatrix scale(num scale, [num originX, num originY]) native;
 
   @DomName('DOMMatrixReadOnly.scale3d')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale3d(num scale, [num ox, num oy, num oz]) native;
+  DomMatrix scale3d(num scale, [num originX, num originY, num originZ]) native;
 
   @DomName('DOMMatrixReadOnly.scaleNonUniform')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scaleNonUniform(num sx, [num sy, num sz, num ox, num oy, num oz]) native;
+  DomMatrix scaleNonUniform(num scaleX, [num scaleY, num scaleZn, num originX, num originY, num originZ]) native;
 
   @DomName('DOMMatrixReadOnly.toFloat32Array')
   @DocsEditable()
@@ -10602,7 +11381,7 @@
 
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
-  Document parseFromString(String str, String contentType) native;
+  Document parseFromString(String str, String type) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10620,29 +11399,33 @@
   @DomName('DOMPoint.DOMPoint')
   @DocsEditable()
   factory DomPoint([point_OR_x, num y, num z, num w]) {
-    if (point_OR_x == null && y == null && z == null && w == null) {
-      return DomPoint._create_1();
-    }
     if ((point_OR_x is Map || point_OR_x == null) && y == null && z == null && w == null) {
       var point_1 = convertDartToNative_Dictionary(point_OR_x);
-      return DomPoint._create_2(point_1);
+      return DomPoint._create_1(point_1);
+    }
+    if (point_OR_x == null && y == null && z == null && w == null) {
+      return DomPoint._create_2();
+    }
+    if ((point_OR_x is num || point_OR_x == null) && y == null && z == null && w == null) {
+      return DomPoint._create_3(point_OR_x);
     }
     if ((y is num || y == null) && (point_OR_x is num || point_OR_x == null) && z == null && w == null) {
-      return DomPoint._create_3(point_OR_x, y);
+      return DomPoint._create_4(point_OR_x, y);
     }
     if ((z is num || z == null) && (y is num || y == null) && (point_OR_x is num || point_OR_x == null) && w == null) {
-      return DomPoint._create_4(point_OR_x, y, z);
+      return DomPoint._create_5(point_OR_x, y, z);
     }
     if ((w is num || w == null) && (z is num || z == null) && (y is num || y == null) && (point_OR_x is num || point_OR_x == null)) {
-      return DomPoint._create_5(point_OR_x, y, z, w);
+      return DomPoint._create_6(point_OR_x, y, z, w);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static DomPoint _create_1() => JS('DomPoint', 'new DOMPoint()');
-  static DomPoint _create_2(point_OR_x) => JS('DomPoint', 'new DOMPoint(#)', point_OR_x);
-  static DomPoint _create_3(point_OR_x, y) => JS('DomPoint', 'new DOMPoint(#,#)', point_OR_x, y);
-  static DomPoint _create_4(point_OR_x, y, z) => JS('DomPoint', 'new DOMPoint(#,#,#)', point_OR_x, y, z);
-  static DomPoint _create_5(point_OR_x, y, z, w) => JS('DomPoint', 'new DOMPoint(#,#,#,#)', point_OR_x, y, z, w);
+  static DomPoint _create_1(point_OR_x) => JS('DomPoint', 'new DOMPoint(#)', point_OR_x);
+  static DomPoint _create_2() => JS('DomPoint', 'new DOMPoint()');
+  static DomPoint _create_3(point_OR_x) => JS('DomPoint', 'new DOMPoint(#)', point_OR_x);
+  static DomPoint _create_4(point_OR_x, y) => JS('DomPoint', 'new DOMPoint(#,#)', point_OR_x, y);
+  static DomPoint _create_5(point_OR_x, y, z) => JS('DomPoint', 'new DOMPoint(#,#,#)', point_OR_x, y, z);
+  static DomPoint _create_6(point_OR_x, y, z, w) => JS('DomPoint', 'new DOMPoint(#,#,#,#)', point_OR_x, y, z, w);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.DOMPoint) || !!(window.WebKitPoint)');
@@ -10881,10 +11664,6 @@
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
   String value;
-
-  @DomName('DOMSettableTokenList.__getter__')
-  @DocsEditable()
-  String __getter__(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10894,7 +11673,7 @@
 @DocsEditable()
 @DomName('DOMStringList')
 @Native("DOMStringList")
-class DomStringList extends Interceptor with ListMixin<String>, ImmutableListMixin<String> implements JavaScriptIndexingBehavior, List<String> {
+class DomStringList extends Interceptor with ListMixin<String>, ImmutableListMixin<String> implements List<String> {
   // To suppress missing implicit constructor warnings.
   factory DomStringList._() { throw new UnsupportedError("Not supported"); }
 
@@ -10906,7 +11685,7 @@
     if (JS("bool", "# >>> 0 !== # || # >= #", index,
         index, index, length))
       throw new RangeError.index(index, this);
-    return JS("String", "#[#]", this, index);
+    return this.item(index);
   }
   void operator[]=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -10946,6 +11725,11 @@
   String elementAt(int index) => this[index];
   // -- end List<String> mixins.
 
+  @DomName('DOMStringList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String __getter__(int index) native;
+
   @DomName('DOMStringList.contains')
   @DocsEditable()
   bool contains(String string) native;
@@ -10965,11 +11749,13 @@
   // To suppress missing implicit constructor warnings.
   factory DomStringMap._() { throw new UnsupportedError("Not supported"); }
 
-  bool __delete__(index_OR_name);
+  void __delete__(index_OR_name);
 
-  String __getter__(index_OR_name);
+  String __getter__(int index);
 
   void __setter__(index_OR_name, String value);
+
+  String item(String name);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -11014,6 +11800,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable()
+@DomName('EffectModel')
+@Experimental() // untriaged
+@Native("EffectModel")
+class EffectModel extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory EffectModel._() { throw new UnsupportedError("Not supported"); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
 class _ChildrenElementList extends ListBase<Element>
     implements NodeListWrapper {
   // Raw Element.
@@ -11314,12 +12113,12 @@
   /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
-  ElementStream<Event> get onCopy;
+  ElementStream<ClipboardEvent> get onCopy;
 
   /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
-  ElementStream<Event> get onCut;
+  ElementStream<ClipboardEvent> get onCut;
 
   /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
@@ -11567,7 +12366,7 @@
   /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
-  ElementStream<Event> get onPaste;
+  ElementStream<ClipboardEvent> get onPaste;
 
   @DomName('Element.onpause')
   @DocsEditable()
@@ -11846,12 +12645,12 @@
   /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
-  ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onCopy => Element.copyEvent._forElementList(this);
 
   /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
-  ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onCut => Element.cutEvent._forElementList(this);
 
   /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
@@ -12099,7 +12898,7 @@
   /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
-  ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onPaste => Element.pasteEvent._forElementList(this);
 
   @DomName('Element.onpause')
   @DocsEditable()
@@ -12267,7 +13066,7 @@
  */
 @DomName('Element')
 @Native("Element")
-class Element extends Node implements GlobalEventHandlers, ParentNode, ChildNode {
+class Element extends Node implements NonDocumentTypeChildNode, GlobalEventHandlers, ParentNode, ChildNode {
 
   /**
    * Creates an HTML element from a valid fragment of HTML.
@@ -12730,7 +13529,7 @@
    * on which the method is called, and calls the play() method of the
    * AnimationTimeline object of the document timeline of the node document
    * of the element, passing the newly created AnimationEffect as the argument
-   * to the method. Returns an AnimationPlayer for the effect.
+   * to the method. Returns an Animation for the effect.
    *
    * Examples
    *
@@ -12749,7 +13548,7 @@
   **/
   @Experimental()
   @SupportedBrowser(SupportedBrowser.CHROME, '36')
-  AnimationPlayer animate(Iterable<Map<String, dynamic>> frames, [timing]) {
+  Animation animate(Iterable<Map<String, dynamic>> frames, [timing]) {
     if (frames is! Iterable || !(frames.every((x) => x is Map))) {
       throw new ArgumentError("The frames parameter should be a List of Maps "
           "with frame information");
@@ -12770,7 +13569,7 @@
   @DomName('Element.animate')
   @JSName('animate')
   @Experimental() // untriaged
-  AnimationPlayer _animate(Object effect, [timing]) native;
+  Animation _animate(Object effect, [timing]) native;
   /**
    * Called by the DOM whenever an attribute on this has been changed.
    */
@@ -13391,6 +14190,10 @@
     return result;
   }
 
+  @DomName('Element.offsetParent')
+  @DocsEditable()
+  final Element offsetParent;
+
   @DomName('Element.offsetHeight')
   @DocsEditable()
   int get offsetHeight => JS('num', '#.offsetHeight', this).round();
@@ -13407,22 +14210,6 @@
   @DocsEditable()
   int get offsetWidth => JS('num', '#.offsetWidth', this).round();
 
-  @DomName('Element.clientHeight')
-  @DocsEditable()
-  int get clientHeight => JS('num', '#.clientHeight', this).round();
-
-  @DomName('Element.clientLeft')
-  @DocsEditable()
-  int get clientLeft => JS('num', '#.clientLeft', this).round();
-
-  @DomName('Element.clientTop')
-  @DocsEditable()
-  int get clientTop => JS('num', '#.clientTop', this).round();
-
-  @DomName('Element.clientWidth')
-  @DocsEditable()
-  int get clientWidth => JS('num', '#.clientWidth', this).round();
-
   @DomName('Element.scrollHeight')
   @DocsEditable()
   int get scrollHeight => JS('num', '#.scrollHeight', this).round();
@@ -13553,7 +14340,7 @@
    */
   @DomName('Element.copyEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
+  static const EventStreamProvider<ClipboardEvent> copyEvent = const EventStreamProvider<ClipboardEvent>('copy');
 
   /**
    * Static factory designed to expose `cut` events to event
@@ -13563,7 +14350,7 @@
    */
   @DomName('Element.cutEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
+  static const EventStreamProvider<ClipboardEvent> cutEvent = const EventStreamProvider<ClipboardEvent>('cut');
 
   /**
    * Static factory designed to expose `doubleclick` events to event
@@ -13888,7 +14675,7 @@
    */
   @DomName('Element.pasteEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
+  static const EventStreamProvider<ClipboardEvent> pasteEvent = const EventStreamProvider<ClipboardEvent>('paste');
 
   @DomName('Element.pauseEvent')
   @DocsEditable()
@@ -14170,6 +14957,10 @@
   @Experimental() // nonstandard
   bool spellcheck;
 
+  @DomName('Element.style')
+  @DocsEditable()
+  final CssStyleDeclaration style;
+
   @DomName('Element.tabIndex')
   @DocsEditable()
   int tabIndex;
@@ -14217,10 +15008,18 @@
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
   String dropzone;
 
+  @DomName('Element.blur')
+  @DocsEditable()
+  void blur() native;
+
   @DomName('Element.click')
   @DocsEditable()
   void click() native;
 
+  @DomName('Element.focus')
+  @DocsEditable()
+  void focus() native;
+
   @JSName('attributes')
   @DomName('Element.attributes')
   @DocsEditable()
@@ -14230,25 +15029,31 @@
   @DocsEditable()
   String className;
 
-  @JSName('clientHeight')
   @DomName('Element.clientHeight')
   @DocsEditable()
-  final int _clientHeight;
+  final int clientHeight;
 
-  @JSName('clientLeft')
   @DomName('Element.clientLeft')
   @DocsEditable()
-  final int _clientLeft;
+  final int clientLeft;
 
-  @JSName('clientTop')
   @DomName('Element.clientTop')
   @DocsEditable()
-  final int _clientTop;
+  final int clientTop;
 
-  @JSName('clientWidth')
   @DomName('Element.clientWidth')
   @DocsEditable()
-  final int _clientWidth;
+  final int clientWidth;
+
+  @DomName('Element.computedName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String computedName;
+
+  @DomName('Element.computedRole')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String computedRole;
 
   @DomName('Element.id')
   @DocsEditable()
@@ -14265,30 +15070,6 @@
   // Use implementation from Node.
   // final String _namespaceUri;
 
-  @JSName('offsetHeight')
-  @DomName('Element.offsetHeight')
-  @DocsEditable()
-  final int _offsetHeight;
-
-  @JSName('offsetLeft')
-  @DomName('Element.offsetLeft')
-  @DocsEditable()
-  final int _offsetLeft;
-
-  @DomName('Element.offsetParent')
-  @DocsEditable()
-  final Element offsetParent;
-
-  @JSName('offsetTop')
-  @DomName('Element.offsetTop')
-  @DocsEditable()
-  final int _offsetTop;
-
-  @JSName('offsetWidth')
-  @DomName('Element.offsetWidth')
-  @DocsEditable()
-  final int _offsetWidth;
-
   @JSName('outerHTML')
   @DomName('Element.outerHTML')
   @DocsEditable()
@@ -14314,26 +15095,19 @@
   @DocsEditable()
   final int _scrollWidth;
 
-  @DomName('Element.style')
-  @DocsEditable()
-  final CssStyleDeclaration style;
-
   @DomName('Element.tagName')
   @DocsEditable()
   final String tagName;
 
-  @DomName('Element.blur')
-  @DocsEditable()
-  void blur() native;
-
-  @DomName('Element.focus')
-  @DocsEditable()
-  void focus() native;
-
-  @DomName('Element.getAnimationPlayers')
+  @DomName('Element.closest')
   @DocsEditable()
   @Experimental() // untriaged
-  List<AnimationPlayer> getAnimationPlayers() native;
+  Element closest(String selectors) native;
+
+  @DomName('Element.getAnimations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Animation> getAnimations() native;
 
   @DomName('Element.getAttribute')
   @DocsEditable()
@@ -14416,7 +15190,7 @@
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
-  List<Node> _getElementsByTagName(String name) native;
+  List<Node> _getElementsByTagName(String localName) native;
 
   @JSName('hasAttribute')
   @DomName('Element.hasAttribute')
@@ -14448,6 +15222,76 @@
   @Experimental() // untriaged
   void requestPointerLock() native;
 
+  @DomName('Element.scroll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scroll([options_OR_x, num y]) {
+    if (options_OR_x == null && y == null) {
+      _scroll_1();
+      return;
+    }
+    if ((options_OR_x is Map) && y == null) {
+      var options_1 = convertDartToNative_Dictionary(options_OR_x);
+      _scroll_2(options_1);
+      return;
+    }
+    if (y != null && (options_OR_x is num)) {
+      _scroll_3(options_OR_x, y);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  @JSName('scroll')
+  @DomName('Element.scroll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scroll_1() native;
+  @JSName('scroll')
+  @DomName('Element.scroll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scroll_2(options) native;
+  @JSName('scroll')
+  @DomName('Element.scroll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scroll_3(num x, y) native;
+
+  @DomName('Element.scrollBy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scrollBy([options_OR_x, num y]) {
+    if (options_OR_x == null && y == null) {
+      _scrollBy_1();
+      return;
+    }
+    if ((options_OR_x is Map) && y == null) {
+      var options_1 = convertDartToNative_Dictionary(options_OR_x);
+      _scrollBy_2(options_1);
+      return;
+    }
+    if (y != null && (options_OR_x is num)) {
+      _scrollBy_3(options_OR_x, y);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  @JSName('scrollBy')
+  @DomName('Element.scrollBy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scrollBy_1() native;
+  @JSName('scrollBy')
+  @DomName('Element.scrollBy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scrollBy_2(options) native;
+  @JSName('scrollBy')
+  @DomName('Element.scrollBy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scrollBy_3(num x, y) native;
+
   @JSName('scrollIntoView')
   @DomName('Element.scrollIntoView')
   @DocsEditable()
@@ -14460,16 +15304,63 @@
   @Experimental() // non-standard
   void _scrollIntoViewIfNeeded([bool centerIfNeeded]) native;
 
+  @DomName('Element.scrollTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scrollTo([options_OR_x, num y]) {
+    if (options_OR_x == null && y == null) {
+      _scrollTo_1();
+      return;
+    }
+    if ((options_OR_x is Map) && y == null) {
+      var options_1 = convertDartToNative_Dictionary(options_OR_x);
+      _scrollTo_2(options_1);
+      return;
+    }
+    if (y != null && (options_OR_x is num)) {
+      _scrollTo_3(options_OR_x, y);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  @JSName('scrollTo')
+  @DomName('Element.scrollTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scrollTo_1() native;
+  @JSName('scrollTo')
+  @DomName('Element.scrollTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scrollTo_2(options) native;
+  @JSName('scrollTo')
+  @DomName('Element.scrollTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _scrollTo_3(num x, y) native;
+
   @DomName('Element.setAttribute')
   @DocsEditable()
   void setAttribute(String name, String value) native;
 
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void setAttributeNS(String namespaceURI, String qualifiedName, String value) native;
+  void setAttributeNS(String namespaceURI, String name, String value) native;
 
   // From ChildNode
 
+  @DomName('Element.after')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void after(Object nodes) native;
+
+  @DomName('Element.before')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void before(Object nodes) native;
+
+  // From NonDocumentTypeChildNode
+
   @DomName('Element.nextElementSibling')
   @DocsEditable()
   final Element nextElementSibling;
@@ -14582,12 +15473,12 @@
   /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
-  ElementStream<Event> get onCopy => copyEvent.forElement(this);
+  ElementStream<ClipboardEvent> get onCopy => copyEvent.forElement(this);
 
   /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
-  ElementStream<Event> get onCut => cutEvent.forElement(this);
+  ElementStream<ClipboardEvent> get onCut => cutEvent.forElement(this);
 
   /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
@@ -14835,7 +15726,7 @@
   /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
-  ElementStream<Event> get onPaste => pasteEvent.forElement(this);
+  ElementStream<ClipboardEvent> get onPaste => pasteEvent.forElement(this);
 
   @DomName('Element.onpause')
   @DocsEditable()
@@ -15067,11 +15958,6 @@
   @DocsEditable()
   String height;
 
-  @DomName('HTMLEmbedElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String integrity;
-
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
   String name;
@@ -15261,6 +16147,18 @@
   // To suppress missing implicit constructor warnings.
   factory ErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ErrorEvent.ErrorEvent')
+  @DocsEditable()
+  factory ErrorEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return ErrorEvent._create_1(type, eventInitDict_1);
+    }
+    return ErrorEvent._create_2(type);
+  }
+  static ErrorEvent _create_1(type, eventInitDict) => JS('ErrorEvent', 'new ErrorEvent(#,#)', type, eventInitDict);
+  static ErrorEvent _create_2(type) => JS('ErrorEvent', 'new ErrorEvent(#)', type);
+
   @DomName('ErrorEvent.colno')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15292,7 +16190,7 @@
 
 
 @DomName('Event')
-@Native("Event,InputEvent,ClipboardEvent")
+@Native("Event,InputEvent")
 class Event extends Interceptor {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
@@ -15343,8 +16241,18 @@
     } while (target != null && target != currentTarget.parent);
     throw new StateError('No selector matched for populating matchedTarget.');
   }
-  // To suppress missing implicit constructor warnings.
-  factory Event._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Event.Event')
+  @DocsEditable()
+  factory Event._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return Event._create_1(type, eventInitDict_1);
+    }
+    return Event._create_2(type);
+  }
+  static Event _create_1(type, eventInitDict) => JS('Event', 'new Event(#,#)', type, eventInitDict);
+  static Event _create_2(type) => JS('Event', 'new Event(#)', type);
 
   /**
    * This event is being handled by the event target.
@@ -15391,24 +16299,6 @@
   @DocsEditable()
   final bool cancelable;
 
-  /**
-   * Access to the system's clipboard data during copy, cut, and paste events.
-   *
-   * ## Other resources
-   *
-   * * [clipboardData specification](http://www.w3.org/TR/clipboard-apis/#attributes)
-   *   from W3C.
-   */
-  @DomName('Event.clipboardData')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // Part of copy/paste
-  @Experimental() // nonstandard
-  final DataTransfer clipboardData;
-
   @DomName('Event.currentTarget')
   @DocsEditable()
   EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._get_currentTarget);
@@ -15416,7 +16306,7 @@
   @DomName('Event.currentTarget')
   @DocsEditable()
   @Creates('Null')
-  @Returns('EventTarget|=Object|Null')
+  @Returns('EventTarget|=Object')
   final dynamic _get_currentTarget;
 
   @DomName('Event.defaultPrevented')
@@ -15440,9 +16330,7 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
   @Experimental()
-  @Returns('NodeList')
-  @Creates('NodeList')
-  final List<Node> path;
+  final List<EventTarget> path;
 
   @DomName('Event.target')
   @DocsEditable()
@@ -15451,7 +16339,7 @@
   @DomName('Event.target')
   @DocsEditable()
   @Creates('Node')
-  @Returns('EventTarget|=Object|Null')
+  @Returns('EventTarget|=Object')
   final dynamic _get_target;
 
   @DomName('Event.timeStamp')
@@ -15465,7 +16353,7 @@
   @JSName('initEvent')
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native;
+  void _initEvent(String type, bool bubbles, bool cancelable) native;
 
   @DomName('Event.preventDefault')
   @DocsEditable()
@@ -15531,14 +16419,14 @@
 
   @DomName('EventSource.EventSource')
   @DocsEditable()
-  static EventSource _factoryEventSource(String url, [Map eventSourceInit]) {
-    if (eventSourceInit != null) {
-      var eventSourceInit_1 = convertDartToNative_Dictionary(eventSourceInit);
-      return EventSource._create_1(url, eventSourceInit_1);
+  static EventSource _factoryEventSource(String url, [Map eventSourceInitDict]) {
+    if (eventSourceInitDict != null) {
+      var eventSourceInitDict_1 = convertDartToNative_Dictionary(eventSourceInitDict);
+      return EventSource._create_1(url, eventSourceInitDict_1);
     }
     return EventSource._create_2(url);
   }
-  static EventSource _create_1(url, eventSourceInit) => JS('EventSource', 'new EventSource(#,#)', url, eventSourceInit);
+  static EventSource _create_1(url, eventSourceInitDict) => JS('EventSource', 'new EventSource(#,#)', url, eventSourceInitDict);
   static EventSource _create_2(url) => JS('EventSource', 'new EventSource(#)', url);
 
   @DomName('EventSource.CLOSED')
@@ -15713,7 +16601,7 @@
   @JSName('addEventListener')
   @DomName('EventTarget.addEventListener')
   @DocsEditable()
-  void _addEventListener([String type, EventListener listener, bool useCapture]) native;
+  void _addEventListener(String type, EventListener listener, [bool capture]) native;
 
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
@@ -15722,7 +16610,7 @@
   @JSName('removeEventListener')
   @DomName('EventTarget.removeEventListener')
   @DocsEditable()
-  void _removeEventListener([String type, EventListener listener, bool useCapture]) native;
+  void _removeEventListener(String type, EventListener listener, [bool capture]) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15738,6 +16626,18 @@
   // To suppress missing implicit constructor warnings.
   factory ExtendableEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ExtendableEvent.ExtendableEvent')
+  @DocsEditable()
+  factory ExtendableEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return ExtendableEvent._create_1(type, eventInitDict_1);
+    }
+    return ExtendableEvent._create_2(type);
+  }
+  static ExtendableEvent _create_1(type, eventInitDict) => JS('ExtendableEvent', 'new ExtendableEvent(#,#)', type, eventInitDict);
+  static ExtendableEvent _create_2(type) => JS('ExtendableEvent', 'new ExtendableEvent(#)', type);
+
   @DomName('ExtendableEvent.waitUntil')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15758,15 +16658,21 @@
 
   @DomName('FederatedCredential.FederatedCredential')
   @DocsEditable()
-  factory FederatedCredential(String id, String name, String avatarURL, String federation) {
-    return FederatedCredential._create_1(id, name, avatarURL, federation);
+  factory FederatedCredential(Map data) {
+    var data_1 = convertDartToNative_Dictionary(data);
+    return FederatedCredential._create_1(data_1);
   }
-  static FederatedCredential _create_1(id, name, avatarURL, federation) => JS('FederatedCredential', 'new FederatedCredential(#,#,#,#)', id, name, avatarURL, federation);
+  static FederatedCredential _create_1(data) => JS('FederatedCredential', 'new FederatedCredential(#)', data);
 
-  @DomName('FederatedCredential.federation')
+  @DomName('FederatedCredential.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  final String federation;
+  final String protocol;
+
+  @DomName('FederatedCredential.provider')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String provider;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -15777,10 +16683,22 @@
 @DomName('FetchEvent')
 @Experimental() // untriaged
 @Native("FetchEvent")
-class FetchEvent extends Event {
+class FetchEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
   factory FetchEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('FetchEvent.FetchEvent')
+  @DocsEditable()
+  factory FetchEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return FetchEvent._create_1(type, eventInitDict_1);
+    }
+    return FetchEvent._create_2(type);
+  }
+  static FetchEvent _create_1(type, eventInitDict) => JS('FetchEvent', 'new FetchEvent(#,#)', type, eventInitDict);
+  static FetchEvent _create_2(type) => JS('FetchEvent', 'new FetchEvent(#)', type);
+
   @DomName('FetchEvent.isReload')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15825,9 +16743,7 @@
 
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  @Returns('HtmlCollection')
-  @Creates('HtmlCollection')
-  final List<Node> elements;
+  final HtmlFormControlsCollection elements;
 
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
@@ -15857,6 +16773,11 @@
   @DocsEditable()
   bool checkValidity() native;
 
+  @DomName('HTMLFieldSetElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
+
   @DomName('HTMLFieldSetElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) native;
@@ -15873,6 +16794,18 @@
   // To suppress missing implicit constructor warnings.
   factory File._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('File.File')
+  @DocsEditable()
+  factory File(List<Object> fileBits, String fileName, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return File._create_1(fileBits, fileName, options_1);
+    }
+    return File._create_2(fileBits, fileName);
+  }
+  static File _create_1(fileBits, fileName, options) => JS('File', 'new File(#,#,#)', fileBits, fileName, options);
+  static File _create_2(fileBits, fileName) => JS('File', 'new File(#,#)', fileBits, fileName);
+
   @DomName('File.lastModified')
   @DocsEditable()
   @Experimental() // untriaged
@@ -16212,7 +17145,7 @@
 
   @DomName('FileReader.readAsText')
   @DocsEditable()
-  void readAsText(Blob blob, [String encoding]) native;
+  void readAsText(Blob blob, [String label]) native;
 
   /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
@@ -16471,6 +17404,18 @@
   // To suppress missing implicit constructor warnings.
   factory FocusEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('FocusEvent.FocusEvent')
+  @DocsEditable()
+  factory FocusEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return FocusEvent._create_1(type, eventInitDict_1);
+    }
+    return FocusEvent._create_2(type);
+  }
+  static FocusEvent _create_1(type, eventInitDict) => JS('FocusEvent', 'new FocusEvent(#,#)', type, eventInitDict);
+  static FocusEvent _create_2(type) => JS('FocusEvent', 'new FocusEvent(#)', type);
+
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
   EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._get_relatedTarget);
@@ -16495,36 +17440,15 @@
 
   @DomName('FontFace.FontFace')
   @DocsEditable()
-  factory FontFace(String family, source, [Map descriptors]) {
-    if ((source is String || source == null) && (family is String || family == null) && descriptors == null) {
-      return FontFace._create_1(family, source);
-    }
-    if ((descriptors is Map || descriptors == null) && (source is String || source == null) && (family is String || family == null)) {
+  factory FontFace(String family, Object source, [Map descriptors]) {
+    if (descriptors != null) {
       var descriptors_1 = convertDartToNative_Dictionary(descriptors);
-      return FontFace._create_2(family, source, descriptors_1);
+      return FontFace._create_1(family, source, descriptors_1);
     }
-    if ((source is TypedData || source == null) && (family is String || family == null) && descriptors == null) {
-      return FontFace._create_3(family, source);
-    }
-    if ((descriptors is Map || descriptors == null) && (source is TypedData || source == null) && (family is String || family == null)) {
-      var descriptors_1 = convertDartToNative_Dictionary(descriptors);
-      return FontFace._create_4(family, source, descriptors_1);
-    }
-    if ((source is ByteBuffer || source == null) && (family is String || family == null) && descriptors == null) {
-      return FontFace._create_5(family, source);
-    }
-    if ((descriptors is Map || descriptors == null) && (source is ByteBuffer || source == null) && (family is String || family == null)) {
-      var descriptors_1 = convertDartToNative_Dictionary(descriptors);
-      return FontFace._create_6(family, source, descriptors_1);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return FontFace._create_2(family, source);
   }
-  static FontFace _create_1(family, source) => JS('FontFace', 'new FontFace(#,#)', family, source);
-  static FontFace _create_2(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
-  static FontFace _create_3(family, source) => JS('FontFace', 'new FontFace(#,#)', family, source);
-  static FontFace _create_4(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
-  static FontFace _create_5(family, source) => JS('FontFace', 'new FontFace(#,#)', family, source);
-  static FontFace _create_6(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
+  static FontFace _create_1(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
+  static FontFace _create_2(family, source) => JS('FontFace', 'new FontFace(#,#)', family, source);
 
   @DomName('FontFace.family')
   @DocsEditable()
@@ -16695,6 +17619,31 @@
   @DomName('FormData.append')
   @DocsEditable()
   void appendBlob(String name, Blob value, [String filename]) native;
+
+  @DomName('FormData.delete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void delete(String name) native;
+
+  @DomName('FormData.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object get(String name) native;
+
+  @DomName('FormData.getAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Object> getAll(String name) native;
+
+  @DomName('FormData.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool has(String name) native;
+
+  @DomName('FormData.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set(String name, value, [String filename]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -16762,12 +17711,22 @@
 
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable()
-  Element __getter__(index_OR_name) native;
+  Object __getter__(String name) native;
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
   bool checkValidity() native;
 
+  @DomName('HTMLFormElement.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element item(int index) native;
+
+  @DomName('HTMLFormElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
+
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
@@ -16796,6 +17755,16 @@
 // for details. All rights reserved. Use of 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('FrameRequestCallback')
+@Experimental() // untriaged
+typedef void FrameRequestCallback(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.
+
 
 @DocsEditable()
 @DomName('Gamepad')
@@ -16810,6 +17779,10 @@
   @DocsEditable()
   final List<num> axes;
 
+  @DomName('Gamepad.buttons')
+  @DocsEditable()
+  final List<GamepadButton> buttons;
+
   @DomName('Gamepad.connected')
   @DocsEditable()
   @Experimental() // untriaged
@@ -16868,6 +17841,18 @@
   // To suppress missing implicit constructor warnings.
   factory GamepadEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('GamepadEvent.GamepadEvent')
+  @DocsEditable()
+  factory GamepadEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return GamepadEvent._create_1(type, eventInitDict_1);
+    }
+    return GamepadEvent._create_2(type);
+  }
+  static GamepadEvent _create_1(type, eventInitDict) => JS('GamepadEvent', 'new GamepadEvent(#,#)', type, eventInitDict);
+  static GamepadEvent _create_2(type) => JS('GamepadEvent', 'new GamepadEvent(#)', type);
+
   @DomName('GamepadEvent.gamepad')
   @DocsEditable()
   @Experimental() // untriaged
@@ -16907,6 +17892,29 @@
 
 
 @DocsEditable()
+@DomName('GeofencingEvent')
+@Experimental() // untriaged
+@Native("GeofencingEvent")
+class GeofencingEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory GeofencingEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('GeofencingEvent.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('GeofencingEvent.region')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final GeofencingRegion region;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('GeofencingRegion')
 @Experimental() // untriaged
 @Native("GeofencingRegion")
@@ -17699,8 +18707,18 @@
         type, convertDartToNative_Dictionary(options));
   }
 
-  // To suppress missing implicit constructor warnings.
-  factory HashChangeEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HashChangeEvent.HashChangeEvent')
+  @DocsEditable()
+  factory HashChangeEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return HashChangeEvent._create_1(type, eventInitDict_1);
+    }
+    return HashChangeEvent._create_2(type);
+  }
+  static HashChangeEvent _create_1(type, eventInitDict) => JS('HashChangeEvent', 'new HashChangeEvent(#,#)', type, eventInitDict);
+  static HashChangeEvent _create_2(type) => JS('HashChangeEvent', 'new HashChangeEvent(#)', type);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Device.isEventTypeSupported('HashChangeEvent');
@@ -17762,43 +18780,27 @@
     if (input == null) {
       return Headers._create_1();
     }
-    if ((input is Headers || input == null)) {
+    if ((input is Headers)) {
       return Headers._create_2(input);
     }
-    if ((input is Map || input == null)) {
+    if ((input is Map)) {
       var input_1 = convertDartToNative_Dictionary(input);
       return Headers._create_3(input_1);
     }
+    if ((input is List<Object>)) {
+      return Headers._create_4(input);
+    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   static Headers _create_1() => JS('Headers', 'new Headers()');
   static Headers _create_2(input) => JS('Headers', 'new Headers(#)', input);
   static Headers _create_3(input) => JS('Headers', 'new Headers(#)', input);
-
-  @DomName('Headers.size')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int size;
-
-  @DomName('Headers.forEach')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void forEach(HeadersForEachCallback callback, [Object thisArg]) native;
+  static Headers _create_4(input) => JS('Headers', 'new Headers(#)', input);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of 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('HeadersForEachCallback')
-@Experimental() // untriaged
-typedef void HeadersForEachCallback(String value, String key, Headers map);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('HTMLHeadingElement')
@@ -17863,6 +18865,16 @@
   @DocsEditable()
   final int length;
 
+  @DomName('History.options')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Map get options => convertNativeToDart_Dictionary(this._get_options);
+  @JSName('options')
+  @DomName('History.options')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final dynamic _get_options;
+
   @DomName('History.state')
   @DocsEditable()
   dynamic get state => convertNativeToDart_SerializedScriptValue(this._get_state);
@@ -17883,7 +18895,7 @@
 
   @DomName('History.go')
   @DocsEditable()
-  void go(int distance) native;
+  void go([int delta]) native;
 
   @DomName('History.pushState')
   @DocsEditable()
@@ -17891,14 +18903,15 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void pushState(/*any*/ data, String title, [String url]) {
-    if (url != null) {
+  void pushState(/*SerializedScriptValue*/ data, String title, String url, [Map options]) {
+    if (options != null) {
       var data_1 = convertDartToNative_SerializedScriptValue(data);
-      _pushState_1(data_1, title, url);
+      var options_2 = convertDartToNative_Dictionary(options);
+      _pushState_1(data_1, title, url, options_2);
       return;
     }
     var data_1 = convertDartToNative_SerializedScriptValue(data);
-    _pushState_2(data_1, title);
+    _pushState_2(data_1, title, url);
     return;
   }
   @JSName('pushState')
@@ -17908,7 +18921,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void _pushState_1(data, title, url) native;
+  void _pushState_1(data, title, url, options) native;
   @JSName('pushState')
   @DomName('History.pushState')
   @DocsEditable()
@@ -17916,7 +18929,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void _pushState_2(data, title) native;
+  void _pushState_2(data, title, url) native;
 
   @DomName('History.replaceState')
   @DocsEditable()
@@ -17924,14 +18937,15 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void replaceState(/*any*/ data, String title, [String url]) {
-    if (url != null) {
+  void replaceState(/*SerializedScriptValue*/ data, String title, String url, [Map options]) {
+    if (options != null) {
       var data_1 = convertDartToNative_SerializedScriptValue(data);
-      _replaceState_1(data_1, title, url);
+      var options_2 = convertDartToNative_Dictionary(options);
+      _replaceState_1(data_1, title, url, options_2);
       return;
     }
     var data_1 = convertDartToNative_SerializedScriptValue(data);
-    _replaceState_2(data_1, title);
+    _replaceState_2(data_1, title, url);
     return;
   }
   @JSName('replaceState')
@@ -17941,7 +18955,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void _replaceState_1(data, title, url) native;
+  void _replaceState_1(data, title, url, options) native;
   @JSName('replaceState')
   @DomName('History.replaceState')
   @DocsEditable()
@@ -17949,7 +18963,30 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void _replaceState_2(data, title) native;
+  void _replaceState_2(data, title, url) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HMDVRDevice')
+@Experimental() // untriaged
+@Native("HMDVRDevice")
+class HmdvrDevice extends VRDevice {
+  // To suppress missing implicit constructor warnings.
+  factory HmdvrDevice._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HMDVRDevice.getEyeParameters')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VREyeParameters getEyeParameters(String whichEye) native;
+
+  @DomName('HMDVRDevice.setFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setFieldOfView([VRFieldOfView leftFov, VRFieldOfView rightFov]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18309,6 +19346,11 @@
   // To suppress missing implicit constructor warnings.
   factory HtmlFormControlsCollection._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('HTMLFormControlsCollection.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Node item(int index) native;
+
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable()
   Object namedItem(String name) native;
@@ -18346,6 +19388,12 @@
 class HtmlOptionsCollection extends HtmlCollection {
   // To suppress missing implicit constructor warnings.
   factory HtmlOptionsCollection._() { throw new UnsupportedError("Not supported"); }
+
+  @JSName('item')
+  @DomName('HTMLOptionsCollection.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Node _item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18989,7 +20037,7 @@
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable()
   @Unstable()
-  String getResponseHeader(String header) native;
+  String getResponseHeader(String name) native;
 
   /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
@@ -19003,7 +20051,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void overrideMimeType(String override) native;
+  void overrideMimeType(String mime) native;
 
   /**
    * Send the request with any given `data`.
@@ -19020,7 +20068,7 @@
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
-  void send([data]) native;
+  void send([body_OR_data]) native;
 
   /**
    * Sets the value of an HTTP requst header.
@@ -19041,7 +20089,7 @@
    */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
-  void setRequestHeader(String header, String value) native;
+  void setRequestHeader(String name, String value) native;
 
   /// Stream of `readystatechange` events handled by this [HttpRequest].
 /**
@@ -19248,18 +20296,13 @@
   @DocsEditable()
   String height;
 
-  @DomName('HTMLIFrameElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String integrity;
-
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
   String name;
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  String sandbox;
+  final DomSettableTokenList sandbox;
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
@@ -19309,21 +20352,21 @@
 
   @DomName('ImageData.ImageData')
   @DocsEditable()
-  factory ImageData(data_OR_width, int height_OR_width, [int height]) {
-    if ((height_OR_width is int || height_OR_width == null) && (data_OR_width is int || data_OR_width == null) && height == null) {
-      return ImageData._create_1(data_OR_width, height_OR_width);
+  factory ImageData(data_OR_sw, int sh_OR_sw, [int sh]) {
+    if ((sh_OR_sw is int) && (data_OR_sw is int) && sh == null) {
+      return ImageData._create_1(data_OR_sw, sh_OR_sw);
     }
-    if ((height_OR_width is int || height_OR_width == null) && (data_OR_width is Uint8ClampedList || data_OR_width == null) && height == null) {
-      return ImageData._create_2(data_OR_width, height_OR_width);
+    if ((sh_OR_sw is int) && (data_OR_sw is Uint8ClampedList) && sh == null) {
+      return ImageData._create_2(data_OR_sw, sh_OR_sw);
     }
-    if ((height is int || height == null) && (height_OR_width is int || height_OR_width == null) && (data_OR_width is Uint8ClampedList || data_OR_width == null)) {
-      return ImageData._create_3(data_OR_width, height_OR_width, height);
+    if ((sh is int) && (sh_OR_sw is int) && (data_OR_sw is Uint8ClampedList)) {
+      return ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static ImageData _create_1(data_OR_width, height_OR_width) => JS('ImageData', 'new ImageData(#,#)', data_OR_width, height_OR_width);
-  static ImageData _create_2(data_OR_width, height_OR_width) => JS('ImageData', 'new ImageData(#,#)', data_OR_width, height_OR_width);
-  static ImageData _create_3(data_OR_width, height_OR_width, height) => JS('ImageData', 'new ImageData(#,#,#)', data_OR_width, height_OR_width, height);
+  static ImageData _create_1(data_OR_sw, sh_OR_sw) => JS('ImageData', 'new ImageData(#,#)', data_OR_sw, sh_OR_sw);
+  static ImageData _create_2(data_OR_sw, sh_OR_sw) => JS('ImageData', 'new ImageData(#,#)', data_OR_sw, sh_OR_sw);
+  static ImageData _create_3(data_OR_sw, sh_OR_sw, sh) => JS('ImageData', 'new ImageData(#,#,#)', data_OR_sw, sh_OR_sw, sh);
 
   @DomName('ImageData.data')
   @DocsEditable()
@@ -19388,11 +20431,6 @@
   @DocsEditable()
   int height;
 
-  @DomName('HTMLImageElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String integrity;
-
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
   bool isMap;
@@ -19451,6 +20489,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable()
+@DomName('InputDevice')
+@Experimental() // untriaged
+@Native("InputDevice")
+class InputDevice extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory InputDevice._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('InputDevice.InputDevice')
+  @DocsEditable()
+  factory InputDevice([Map deviceInitDict]) {
+    if (deviceInitDict != null) {
+      var deviceInitDict_1 = convertDartToNative_Dictionary(deviceInitDict);
+      return InputDevice._create_1(deviceInitDict_1);
+    }
+    return InputDevice._create_2();
+  }
+  static InputDevice _create_1(deviceInitDict) => JS('InputDevice', 'new InputDevice(#)', deviceInitDict);
+  static InputDevice _create_2() => JS('InputDevice', 'new InputDevice()');
+
+  @DomName('InputDevice.firesTouchEvents')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool firesTouchEvents;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
 @DomName('HTMLInputElement')
 @Native("HTMLInputElement")
 class InputElement extends HtmlElement implements
@@ -19504,6 +20572,11 @@
   @DocsEditable()
   String alt;
 
+  @DomName('HTMLInputElement.autocapitalize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String autocapitalize;
+
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
   String autocomplete;
@@ -19608,6 +20681,11 @@
   @DocsEditable()
   String min;
 
+  @DomName('HTMLInputElement.minLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int minLength;
+
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
   bool multiple;
@@ -19722,6 +20800,11 @@
   @DocsEditable()
   bool checkValidity() native;
 
+  @DomName('HTMLInputElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
+
   @DomName('HTMLInputElement.select')
   @DocsEditable()
   void select() native;
@@ -20309,66 +21392,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-@DocsEditable()
-@DomName('InputMethodContext')
-// http://www.w3.org/TR/ime-api/#idl-def-InputMethodContext
-@Experimental()
-@Native("InputMethodContext")
-class InputMethodContext extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory InputMethodContext._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('InputMethodContext.compositionEndOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int compositionEndOffset;
-
-  @DomName('InputMethodContext.compositionStartOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int compositionStartOffset;
-
-  @DomName('InputMethodContext.locale')
-  @DocsEditable()
-  final String locale;
-
-  @DomName('InputMethodContext.target')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final HtmlElement target;
-
-  @DomName('InputMethodContext.confirmComposition')
-  @DocsEditable()
-  void confirmComposition() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('InstallEvent')
-@Experimental() // untriaged
-@Native("InstallEvent")
-class InstallEvent extends ExtendableEvent {
-  // To suppress missing implicit constructor warnings.
-  factory InstallEvent._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('InstallEvent.reloadAll')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future reloadAll() native;
-
-  @DomName('InstallEvent.replace')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void replace() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /**
  * An event that describes user interaction with the keyboard.
  *
@@ -20430,8 +21453,21 @@
 
   @DomName('KeyboardEvent.charCode')
   int get charCode => _charCode;
-  // To suppress missing implicit constructor warnings.
-  factory KeyboardEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('KeyboardEvent.which')
+  int get which => _which;
+
+  @DomName('KeyboardEvent.KeyboardEvent')
+  @DocsEditable()
+  factory KeyboardEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return KeyboardEvent._create_1(type, eventInitDict_1);
+    }
+    return KeyboardEvent._create_2(type);
+  }
+  static KeyboardEvent _create_1(type, eventInitDict) => JS('KeyboardEvent', 'new KeyboardEvent(#,#)', type, eventInitDict);
+  static KeyboardEvent _create_2(type) => JS('KeyboardEvent', 'new KeyboardEvent(#)', type);
 
   @DomName('KeyboardEvent.DOM_KEY_LOCATION_LEFT')
   @DocsEditable()
@@ -20457,10 +21493,20 @@
   @DocsEditable()
   final bool altKey;
 
+  @DomName('KeyboardEvent.code')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String code;
+
   @DomName('KeyboardEvent.ctrlKey')
   @DocsEditable()
   final bool ctrlKey;
 
+  @DomName('KeyboardEvent.key')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String key;
+
   @JSName('keyIdentifier')
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable()
@@ -20493,7 +21539,7 @@
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
-  bool getModifierState(String keyArgument) native;
+  bool getModifierState(String keyArg) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20502,6 +21548,38 @@
 
 
 @DocsEditable()
+@DomName('KeyframeEffect')
+@Experimental() // untriaged
+@Native("KeyframeEffect")
+class KeyframeEffect extends AnimationEffectReadOnly {
+  // To suppress missing implicit constructor warnings.
+  factory KeyframeEffect._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('KeyframeEffect.KeyframeEffect')
+  @DocsEditable()
+  factory KeyframeEffect(Element target, List<Map> keyframes, [timing]) {
+    if ((keyframes is List<Map>) && (target is Element || target == null) && timing == null) {
+      return KeyframeEffect._create_1(target, keyframes);
+    }
+    if ((timing is num) && (keyframes is List<Map>) && (target is Element || target == null)) {
+      return KeyframeEffect._create_2(target, keyframes, timing);
+    }
+    if ((timing is Map) && (keyframes is List<Map>) && (target is Element || target == null)) {
+      var timing_1 = convertDartToNative_Dictionary(timing);
+      return KeyframeEffect._create_3(target, keyframes, timing_1);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  static KeyframeEffect _create_1(target, keyframes) => JS('KeyframeEffect', 'new KeyframeEffect(#,#)', target, keyframes);
+  static KeyframeEffect _create_2(target, keyframes, timing) => JS('KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, keyframes, timing);
+  static KeyframeEffect _create_3(target, keyframes, timing) => JS('KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, keyframes, timing);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLKeygenElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -20576,6 +21654,11 @@
   @DocsEditable()
   bool checkValidity() native;
 
+  @DomName('HTMLKeygenElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
+
   @DomName('HTMLKeygenElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) native;
@@ -20742,31 +21825,6 @@
     return JS('bool', '("import" in #)', this);
   }
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
-@DomName('LocalCredential')
-@Experimental() // untriaged
-@Native("LocalCredential")
-class LocalCredential extends Credential {
-  // To suppress missing implicit constructor warnings.
-  factory LocalCredential._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('LocalCredential.LocalCredential')
-  @DocsEditable()
-  factory LocalCredential(String id, String name, String avatarURL, String password) {
-    return LocalCredential._create_1(id, name, avatarURL, password);
-  }
-  static LocalCredential _create_1(id, name, avatarURL, password) => JS('LocalCredential', 'new LocalCredential(#,#,#,#)', id, name, avatarURL, password);
-
-  @DomName('LocalCredential.password')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String password;
-}
 // 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.
@@ -20847,27 +21905,6 @@
 // for details. All rights reserved. Use of 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('MIDIErrorCallback')
-// http://webaudio.github.io/web-midi-api/#midierrorcallback
-@Experimental()
-typedef void MidiErrorCallback(DomError 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.
-
-
-@DomName('MIDISuccessCallback')
-@Experimental() // untriaged
-typedef void MidiSuccessCallback(MidiAccess access, bool sysex);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('HTMLMapElement')
@@ -21010,12 +22047,33 @@
 // for details. All rights reserved. Use of 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('MediaDeviceInfoCallback')
+@DocsEditable()
+@DomName('MediaDevices')
 @Experimental() // untriaged
-typedef void MediaDeviceInfoCallback(List<MediaDeviceInfo> devices);
+@Native("MediaDevices")
+class MediaDevices extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory MediaDevices._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaDevices.enumerateDevices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future enumerateDevices() native;
+
+  @DomName('MediaDevices.getUserMedia')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getUserMedia(Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    return _getUserMedia_1(options_1);
+  }
+  @JSName('getUserMedia')
+  @DomName('MediaDevices.getUserMedia')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _getUserMedia_1(options) native;
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -21181,11 +22239,6 @@
   @DocsEditable()
   final MediaError error;
 
-  @DomName('HTMLMediaElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String integrity;
-
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
   bool loop;
@@ -21236,6 +22289,16 @@
   @DocsEditable()
   final bool seeking;
 
+  @DomName('HTMLMediaElement.session')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaSession session;
+
+  @DomName('HTMLMediaElement.sinkId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String sinkId;
+
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
   String src;
@@ -21301,6 +22364,11 @@
   @Experimental() // untriaged
   Future setMediaKeys(MediaKeys mediaKeys) native;
 
+  @DomName('HTMLMediaElement.setSinkId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future setSinkId(String sinkId) native;
+
   @JSName('webkitAddKey')
   @DomName('HTMLMediaElement.webkitAddKey')
   @DocsEditable()
@@ -21362,6 +22430,41 @@
 
 
 @DocsEditable()
+@DomName('MediaEncryptedEvent')
+@Experimental() // untriaged
+@Native("MediaEncryptedEvent")
+class MediaEncryptedEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory MediaEncryptedEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaEncryptedEvent.MediaEncryptedEvent')
+  @DocsEditable()
+  factory MediaEncryptedEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MediaEncryptedEvent._create_1(type, eventInitDict_1);
+    }
+    return MediaEncryptedEvent._create_2(type);
+  }
+  static MediaEncryptedEvent _create_1(type, eventInitDict) => JS('MediaEncryptedEvent', 'new MediaEncryptedEvent(#,#)', type, eventInitDict);
+  static MediaEncryptedEvent _create_2(type) => JS('MediaEncryptedEvent', 'new MediaEncryptedEvent(#)', type);
+
+  @DomName('MediaEncryptedEvent.initData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final ByteBuffer initData;
+
+  @DomName('MediaEncryptedEvent.initDataType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String initDataType;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('MediaError')
 @Unstable()
 @Native("MediaError")
@@ -21377,12 +22480,6 @@
   @DocsEditable()
   static const int MEDIA_ERR_DECODE = 3;
 
-  @DomName('MediaError.MEDIA_ERR_ENCRYPTED')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#error-codes
-  @Experimental()
-  static const int MEDIA_ERR_ENCRYPTED = 5;
-
   @DomName('MediaError.MEDIA_ERR_NETWORK')
   @DocsEditable()
   static const int MEDIA_ERR_NETWORK = 2;
@@ -21456,6 +22553,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MediaKeyEvent.MediaKeyEvent')
+  @DocsEditable()
+  factory MediaKeyEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MediaKeyEvent._create_1(type, eventInitDict_1);
+    }
+    return MediaKeyEvent._create_2(type);
+  }
+  static MediaKeyEvent _create_1(type, eventInitDict) => JS('MediaKeyEvent', 'new MediaKeyEvent(#,#)', type, eventInitDict);
+  static MediaKeyEvent _create_2(type) => JS('MediaKeyEvent', 'new MediaKeyEvent(#)', type);
+
   @JSName('defaultURL')
   @DomName('MediaKeyEvent.defaultURL')
   @DocsEditable()
@@ -21499,37 +22608,26 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyMessageEvent._() { throw new UnsupportedError("Not supported"); }
 
-  @JSName('destinationURL')
-  @DomName('MediaKeyMessageEvent.destinationURL')
+  @DomName('MediaKeyMessageEvent.MediaKeyMessageEvent')
   @DocsEditable()
-  final String destinationUrl;
+  factory MediaKeyMessageEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MediaKeyMessageEvent._create_1(type, eventInitDict_1);
+    }
+    return MediaKeyMessageEvent._create_2(type);
+  }
+  static MediaKeyMessageEvent _create_1(type, eventInitDict) => JS('MediaKeyMessageEvent', 'new MediaKeyMessageEvent(#,#)', type, eventInitDict);
+  static MediaKeyMessageEvent _create_2(type) => JS('MediaKeyMessageEvent', 'new MediaKeyMessageEvent(#)', type);
 
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
   final ByteBuffer message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('MediaKeyNeededEvent')
-// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeyneededevent
-@Experimental()
-@Native("MediaKeyNeededEvent")
-class MediaKeyNeededEvent extends Event {
-  // To suppress missing implicit constructor warnings.
-  factory MediaKeyNeededEvent._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('MediaKeyNeededEvent.contentType')
+  @DomName('MediaKeyMessageEvent.messageType')
   @DocsEditable()
   @Experimental() // untriaged
-  final String contentType;
-
-  @DomName('MediaKeyNeededEvent.initData')
-  @DocsEditable()
-  final Uint8List initData;
+  final String messageType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21550,32 +22648,96 @@
   @Experimental() // untriaged
   final Future closed;
 
-  @DomName('MediaKeySession.error')
+  @DomName('MediaKeySession.expiration')
   @DocsEditable()
-  final MediaKeyError error;
+  @Experimental() // untriaged
+  final double expiration;
 
-  @DomName('MediaKeySession.keySystem')
+  @DomName('MediaKeySession.keyStatuses')
   @DocsEditable()
-  final String keySystem;
+  @Experimental() // untriaged
+  final MediaKeyStatusMap keyStatuses;
 
   @DomName('MediaKeySession.sessionId')
   @DocsEditable()
   final String sessionId;
 
+  @DomName('MediaKeySession.close')
+  @DocsEditable()
+  Future close() native;
+
   @DomName('MediaKeySession.generateRequest')
   @DocsEditable()
   @Experimental() // untriaged
-  Future generateRequest(String initDataType, initData) native;
+  Future generateRequest(String initDataType, /*BufferSource*/ initData) native;
 
-  @DomName('MediaKeySession.release')
+  @DomName('MediaKeySession.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future release() native;
+  Future load(String sessionId) native;
+
+  @DomName('MediaKeySession.remove')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future remove() native;
 
   @JSName('update')
   @DomName('MediaKeySession.update')
   @DocsEditable()
-  Future _update(response) native;
+  Future _update(/*BufferSource*/ response) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('MediaKeyStatusMap')
+@Experimental() // untriaged
+@Native("MediaKeyStatusMap")
+class MediaKeyStatusMap extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory MediaKeyStatusMap._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaKeyStatusMap.size')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int size;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('MediaKeySystemAccess')
+@Experimental() // untriaged
+@Native("MediaKeySystemAccess")
+class MediaKeySystemAccess extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory MediaKeySystemAccess._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaKeySystemAccess.keySystem')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String keySystem;
+
+  @DomName('MediaKeySystemAccess.createMediaKeys')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future createMediaKeys() native;
+
+  @DomName('MediaKeySystemAccess.getConfiguration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Map getConfiguration() {
+    return convertNativeToDart_Dictionary(_getConfiguration_1());
+  }
+  @JSName('getConfiguration')
+  @DomName('MediaKeySystemAccess.getConfiguration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _getConfiguration_1() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21591,24 +22753,15 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeys._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('MediaKeys.keySystem')
-  @DocsEditable()
-  final String keySystem;
-
-  @DomName('MediaKeys.create')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static Future create(String keySystem) native;
-
   @JSName('createSession')
   @DomName('MediaKeys.createSession')
   @DocsEditable()
   MediaKeySession _createSession([String sessionType]) native;
 
-  @DomName('MediaKeys.isTypeSupported')
+  @DomName('MediaKeys.setServerCertificate')
   @DocsEditable()
   @Experimental() // untriaged
-  static bool isTypeSupported(String keySystem, String contentType) native;
+  Future setServerCertificate(/*BufferSource*/ serverCertificate) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21633,11 +22786,11 @@
 
   @DomName('MediaList.appendMedium')
   @DocsEditable()
-  void appendMedium(String newMedium) native;
+  void appendMedium(String medium) native;
 
   @DomName('MediaList.deleteMedium')
   @DocsEditable()
-  void deleteMedium(String oldMedium) native;
+  void deleteMedium(String medium) native;
 
   @DomName('MediaList.item')
   @DocsEditable()
@@ -21695,6 +22848,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaQueryListEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MediaQueryListEvent.MediaQueryListEvent')
+  @DocsEditable()
+  factory MediaQueryListEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MediaQueryListEvent._create_1(type, eventInitDict_1);
+    }
+    return MediaQueryListEvent._create_2(type);
+  }
+  static MediaQueryListEvent _create_1(type, eventInitDict) => JS('MediaQueryListEvent', 'new MediaQueryListEvent(#,#)', type, eventInitDict);
+  static MediaQueryListEvent _create_2(type) => JS('MediaQueryListEvent', 'new MediaQueryListEvent(#)', type);
+
   @DomName('MediaQueryListEvent.matches')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21711,6 +22876,36 @@
 
 
 @DocsEditable()
+@DomName('MediaSession')
+@Experimental() // untriaged
+@Native("MediaSession")
+class MediaSession extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory MediaSession._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaSession.MediaSession')
+  @DocsEditable()
+  factory MediaSession() {
+    return MediaSession._create_1();
+  }
+  static MediaSession _create_1() => JS('MediaSession', 'new MediaSession()');
+
+  @DomName('MediaSession.activate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void activate() native;
+
+  @DomName('MediaSession.deactivate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deactivate() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('MediaSource')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '11')
@@ -21825,6 +23020,11 @@
   static MediaStream _create_2(stream_OR_tracks) => JS('MediaStream', 'new MediaStream(#)', stream_OR_tracks);
   static MediaStream _create_3(stream_OR_tracks) => JS('MediaStream', 'new MediaStream(#)', stream_OR_tracks);
 
+  @DomName('MediaStream.active')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool active;
+
   @DomName('MediaStream.ended')
   @DocsEditable()
   final bool ended;
@@ -21922,6 +23122,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MediaStreamEvent.MediaStreamEvent')
+  @DocsEditable()
+  factory MediaStreamEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MediaStreamEvent._create_1(type, eventInitDict_1);
+    }
+    return MediaStreamEvent._create_2(type);
+  }
+  static MediaStreamEvent _create_1(type, eventInitDict) => JS('MediaStreamEvent', 'new MediaStreamEvent(#,#)', type, eventInitDict);
+  static MediaStreamEvent _create_2(type) => JS('MediaStreamEvent', 'new MediaStreamEvent(#)', type);
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => Device.isEventTypeSupported('MediaStreamEvent');
 
@@ -22175,11 +23387,21 @@
   @Experimental() // untriaged
   bool disabled;
 
+  @DomName('HTMLMenuItemElement.icon')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String icon;
+
   @DomName('HTMLMenuItemElement.label')
   @DocsEditable()
   @Experimental() // untriaged
   String label;
 
+  @DomName('HTMLMenuItemElement.radiogroup')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String radiogroup;
+
   @DomName('HTMLMenuItemElement.type')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22234,12 +23456,14 @@
         lastEventId, source, messagePorts);
     return event;
   }
-  // To suppress missing implicit constructor warnings.
-  factory MessageEvent._() { throw new UnsupportedError("Not supported"); }
 
+  // TODO(alanknight): This really should be generated by the
+  // _OutputConversion in the systemnative.py script, but that doesn't
+  // use those conversions right now, so do this as a one-off.
   @DomName('MessageEvent.data')
   @DocsEditable()
   dynamic get data => convertNativeToDart_SerializedScriptValue(this._get_data);
+
   @JSName('data')
   @DomName('MessageEvent.data')
   @DocsEditable()
@@ -22247,6 +23471,20 @@
   @annotation_Returns_SerializedScriptValue
   final dynamic _get_data;
 
+
+
+  @DomName('MessageEvent.MessageEvent')
+  @DocsEditable()
+  factory MessageEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MessageEvent._create_1(type, eventInitDict_1);
+    }
+    return MessageEvent._create_2(type);
+  }
+  static MessageEvent _create_1(type, eventInitDict) => JS('MessageEvent', 'new MessageEvent(#,#)', type, eventInitDict);
+  static MessageEvent _create_2(type) => JS('MessageEvent', 'new MessageEvent(#)', type);
+
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
   @Unstable()
@@ -22269,7 +23507,7 @@
   @JSName('initMessageEvent')
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
-  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) native;
+  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> portsArg) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22475,26 +23713,6 @@
   // To suppress missing implicit constructor warnings.
   factory MidiAccess._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `connect` events to event
-   * handlers that are not necessarily instances of [MidiAccess].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('MIDIAccess.connectEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MidiConnectionEvent> connectEvent = const EventStreamProvider<MidiConnectionEvent>('connect');
-
-  /**
-   * Static factory designed to expose `disconnect` events to event
-   * handlers that are not necessarily instances of [MidiAccess].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('MIDIAccess.disconnectEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
-
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
   final MidiInputMap inputs;
@@ -22507,16 +23725,6 @@
   @DocsEditable()
   @Experimental() // untriaged
   final bool sysexEnabled;
-
-  /// Stream of `connect` events handled by this [MidiAccess].
-  @DomName('MIDIAccess.onconnect')
-  @DocsEditable()
-  Stream<MidiConnectionEvent> get onConnect => connectEvent.forTarget(this);
-
-  /// Stream of `disconnect` events handled by this [MidiAccess].
-  @DomName('MIDIAccess.ondisconnect')
-  @DocsEditable()
-  Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.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
@@ -22532,6 +23740,18 @@
   // To suppress missing implicit constructor warnings.
   factory MidiConnectionEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MIDIConnectionEvent.MIDIConnectionEvent')
+  @DocsEditable()
+  factory MidiConnectionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MidiConnectionEvent._create_1(type, eventInitDict_1);
+    }
+    return MidiConnectionEvent._create_2(type);
+  }
+  static MidiConnectionEvent _create_1(type, eventInitDict) => JS('MidiConnectionEvent', 'new MIDIConnectionEvent(#,#)', type, eventInitDict);
+  static MidiConnectionEvent _create_2(type) => JS('MidiConnectionEvent', 'new MIDIConnectionEvent(#)', type);
+
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable()
   final MidiPort port;
@@ -22582,31 +23802,6 @@
   @DocsEditable()
   @Experimental() // untriaged
   final int size;
-
-  @DomName('MIDIInputMap.entries')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator entries() native;
-
-  @DomName('MIDIInputMap.get')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object get(String id) native;
-
-  @DomName('MIDIInputMap.has')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool has(String key) native;
-
-  @DomName('MIDIInputMap.keys')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator keys() native;
-
-  @DomName('MIDIInputMap.values')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator values() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -22622,6 +23817,18 @@
   // To suppress missing implicit constructor warnings.
   factory MidiMessageEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MIDIMessageEvent.MIDIMessageEvent')
+  @DocsEditable()
+  factory MidiMessageEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MidiMessageEvent._create_1(type, eventInitDict_1);
+    }
+    return MidiMessageEvent._create_2(type);
+  }
+  static MidiMessageEvent _create_1(type, eventInitDict) => JS('MidiMessageEvent', 'new MIDIMessageEvent(#,#)', type, eventInitDict);
+  static MidiMessageEvent _create_2(type) => JS('MidiMessageEvent', 'new MIDIMessageEvent(#)', type);
+
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
   final Uint8List data;
@@ -22665,31 +23872,6 @@
   @DocsEditable()
   @Experimental() // untriaged
   final int size;
-
-  @DomName('MIDIOutputMap.entries')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator entries() native;
-
-  @DomName('MIDIOutputMap.get')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object get(String id) native;
-
-  @DomName('MIDIOutputMap.has')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool has(String key) native;
-
-  @DomName('MIDIOutputMap.keys')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator keys() native;
-
-  @DomName('MIDIOutputMap.values')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator values() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -22705,15 +23887,10 @@
   // To suppress missing implicit constructor warnings.
   factory MidiPort._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `disconnect` events to event
-   * handlers that are not necessarily instances of [MidiPort].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('MIDIPort.disconnectEvent')
+  @DomName('MIDIPort.connection')
   @DocsEditable()
-  static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
+  @Experimental() // untriaged
+  final String connection;
 
   @DomName('MIDIPort.id')
   @DocsEditable()
@@ -22727,6 +23904,11 @@
   @DocsEditable()
   final String name;
 
+  @DomName('MIDIPort.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String state;
+
   @DomName('MIDIPort.type')
   @DocsEditable()
   final String type;
@@ -22735,10 +23917,15 @@
   @DocsEditable()
   final String version;
 
-  /// Stream of `disconnect` events handled by this [MidiPort].
-  @DomName('MIDIPort.ondisconnect')
+  @DomName('MIDIPort.close')
   @DocsEditable()
-  Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
+  @Experimental() // untriaged
+  Future close() native;
+
+  @DomName('MIDIPort.open')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future open() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -22830,10 +24017,6 @@
   MimeType elementAt(int index) => this[index];
   // -- end List<MimeType> mixins.
 
-  @DomName('MimeTypeArray.__getter__')
-  @DocsEditable()
-  MimeType __getter__(String name) native;
-
   @DomName('MimeTypeArray.item')
   @DocsEditable()
   MimeType item(int index) native;
@@ -22875,7 +24058,7 @@
 
 
 @DomName('MouseEvent')
-@Native("MouseEvent,DragEvent,PointerEvent,MSPointerEvent")
+@Native("MouseEvent,DragEvent")
 class MouseEvent extends UIEvent {
   factory MouseEvent(String type,
       {Window view, int detail: 0, int screenX: 0, int screenY: 0,
@@ -22892,8 +24075,18 @@
         button, relatedTarget);
     return event;
   }
-  // To suppress missing implicit constructor warnings.
-  factory MouseEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MouseEvent.MouseEvent')
+  @DocsEditable()
+  factory MouseEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return MouseEvent._create_1(type, eventInitDict_1);
+    }
+    return MouseEvent._create_2(type);
+  }
+  static MouseEvent _create_1(type, eventInitDict) => JS('MouseEvent', 'new MouseEvent(#,#)', type, eventInitDict);
+  static MouseEvent _create_2(type) => JS('MouseEvent', 'new MouseEvent(#)', type);
 
   @DomName('MouseEvent.altKey')
   @DocsEditable()
@@ -22903,6 +24096,11 @@
   @DocsEditable()
   final int button;
 
+  @DomName('MouseEvent.buttons')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int buttons;
+
   @JSName('clientX')
   @DomName('MouseEvent.clientX')
   @DocsEditable()
@@ -22934,6 +24132,18 @@
   @deprecated
   final Node fromElement;
 
+  @JSName('layerX')
+  @DomName('MouseEvent.layerX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int _layerX;
+
+  @JSName('layerY')
+  @DomName('MouseEvent.layerY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int _layerY;
+
   @DomName('MouseEvent.metaKey')
   @DocsEditable()
   final bool metaKey;
@@ -22950,6 +24160,18 @@
   @Experimental() // untriaged
   final int _movementY;
 
+  @JSName('pageX')
+  @DomName('MouseEvent.pageX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int _pageX;
+
+  @JSName('pageY')
+  @DomName('MouseEvent.pageY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int _pageY;
+
   @DomName('MouseEvent.region')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22962,7 +24184,7 @@
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
   @Creates('Node')
-  @Returns('EventTarget|=Object|Null')
+  @Returns('EventTarget|=Object')
   final dynamic _get_relatedTarget;
 
   @JSName('screenX')
@@ -23007,17 +24229,20 @@
   @Experimental()
   final int _webkitMovementY;
 
+  // Use implementation from UIEvent.
+  // final int _which;
+
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) {
+  void _initMouseEvent(String type, bool bubbles, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) {
     var relatedTarget_1 = _convertDartToNative_EventTarget(relatedTarget);
-    _initMouseEvent_1(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
+    _initMouseEvent_1(type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
     return;
   }
   @JSName('initMouseEvent')
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent_1(type, canBubble, cancelable, Window view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native;
+  void _initMouseEvent_1(type, bubbles, cancelable, Window view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native;
 
 
   @DomName('MouseEvent.clientX')
@@ -23058,6 +24283,14 @@
   @DomName('MouseEvent.screenX')
   @DomName('MouseEvent.screenY')
   Point get screen => new Point(_screenX, _screenY);
+
+  @DomName('MouseEvent.layerX')
+  @DomName('MouseEvent.layerY')
+  Point get layer => new Point(_layerX, _layerY);
+
+  @DomName('MouseEvent.pageX')
+  @DomName('MouseEvent.pageY')
+  Point get page => new Point(_pageX, _pageY);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -23237,7 +24470,7 @@
 
 @DomName('Navigator')
 @Native("Navigator")
-class Navigator extends Interceptor implements NavigatorCpu, NavigatorLanguage, NavigatorOnLine, NavigatorID {
+class Navigator extends Interceptor implements NavigatorStorageUtils, NavigatorCpu, NavigatorLanguage, NavigatorOnLine, NavigatorID {
 
   @DomName('Navigator.language')
   String get language => JS('String', '#.language || #.userLanguage', this,
@@ -23313,16 +24546,16 @@
   // To suppress missing implicit constructor warnings.
   factory Navigator._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('Navigator.bluetooth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Bluetooth bluetooth;
+
   @DomName('Navigator.connection')
   @DocsEditable()
   @Experimental() // untriaged
   final NetworkInformation connection;
 
-  @DomName('Navigator.cookieEnabled')
-  @DocsEditable()
-  @Unstable()
-  final bool cookieEnabled;
-
   @DomName('Navigator.credentials')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23334,11 +24567,6 @@
   @Experimental() // experimental
   final String doNotTrack;
 
-  @DomName('Navigator.geofencing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final Geofencing geofencing;
-
   @DomName('Navigator.geolocation')
   @DocsEditable()
   @Unstable()
@@ -23349,11 +24577,21 @@
   @Experimental() // untriaged
   final int maxTouchPoints;
 
+  @DomName('Navigator.mediaDevices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaDevices mediaDevices;
+
   @DomName('Navigator.mimeTypes')
   @DocsEditable()
   @Experimental() // nonstandard
   final MimeTypeArray mimeTypes;
 
+  @DomName('Navigator.permissions')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Permissions permissions;
+
   @DomName('Navigator.presentation')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23364,16 +24602,16 @@
   @Unstable()
   final String productSub;
 
-  @DomName('Navigator.push')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final PushManager push;
-
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
   final ServiceWorkerContainer serviceWorker;
 
+  @DomName('Navigator.services')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final ServicePortCollection services;
+
   @DomName('Navigator.storageQuota')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23419,21 +24657,46 @@
   @Creates('_GamepadList')
   List<Gamepad> getGamepads() native;
 
-  @DomName('Navigator.getStorageUpdates')
+  @DomName('Navigator.getVRDevices')
   @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
-  @Experimental()
-  void getStorageUpdates() native;
+  @Experimental() // untriaged
+  Future getVRDevices() native;
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
   void registerProtocolHandler(String scheme, String url, String title) native;
 
+  @DomName('Navigator.requestMIDIAccess')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestMidiAccess([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _requestMidiAccess_1(options_1);
+    }
+    return _requestMidiAccess_2();
+  }
+  @JSName('requestMIDIAccess')
+  @DomName('Navigator.requestMIDIAccess')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _requestMidiAccess_1(options) native;
+  @JSName('requestMIDIAccess')
+  @DomName('Navigator.requestMIDIAccess')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _requestMidiAccess_2() native;
+
+  @DomName('Navigator.requestMediaKeySystemAccess')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestMediaKeySystemAccess(String keySystem, List<Map> supportedConfigurations) native;
+
   @DomName('Navigator.sendBeacon')
   @DocsEditable()
   @Experimental() // untriaged
-  bool sendBeacon(String url, data) native;
+  bool sendBeacon(String url, Object data) native;
 
   // From NavigatorCPU
 
@@ -23489,6 +24752,19 @@
   @Unstable()
   final bool onLine;
 
+  // From NavigatorStorageUtils
+
+  @DomName('Navigator.cookieEnabled')
+  @DocsEditable()
+  @Unstable()
+  final bool cookieEnabled;
+
+  @DomName('Navigator.getStorageUpdates')
+  @DocsEditable()
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
+  @Experimental()
+  void getStorageUpdates() native;
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -23566,6 +24842,29 @@
 
 
 @DocsEditable()
+@DomName('NavigatorStorageUtils')
+@Experimental() // untriaged
+@Native("NavigatorStorageUtils")
+class NavigatorStorageUtils extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NavigatorStorageUtils._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NavigatorStorageUtils.cookieEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool cookieEnabled;
+
+  @DomName('NavigatorStorageUtils.getStorageUpdates')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getStorageUpdates() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('NavigatorUserMediaError')
 // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaError
 @Experimental()
@@ -24141,7 +25440,7 @@
    */
   @DomName('Node.appendChild')
   @DocsEditable()
-  Node append(Node newChild) native;
+  Node append(Node node) native;
 
   @JSName('cloneNode')
   /**
@@ -24193,17 +25492,17 @@
    */
   @DomName('Node.insertBefore')
   @DocsEditable()
-  Node insertBefore(Node newChild, Node refChild) native;
+  Node insertBefore(Node node, Node child) native;
 
   @JSName('removeChild')
   @DomName('Node.removeChild')
   @DocsEditable()
-  Node _removeChild(Node oldChild) native;
+  Node _removeChild(Node child) native;
 
   @JSName('replaceChild')
   @DomName('Node.replaceChild')
   @DocsEditable()
-  Node _replaceChild(Node newChild, Node oldChild) native;
+  Node _replaceChild(Node node, Node child) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24237,31 +25536,31 @@
 
   @DomName('NodeFilter.SHOW_COMMENT')
   @DocsEditable()
-  static const int SHOW_COMMENT = 0x00000080;
+  static const int SHOW_COMMENT = 0x80;
 
   @DomName('NodeFilter.SHOW_DOCUMENT')
   @DocsEditable()
-  static const int SHOW_DOCUMENT = 0x00000100;
+  static const int SHOW_DOCUMENT = 0x100;
 
   @DomName('NodeFilter.SHOW_DOCUMENT_FRAGMENT')
   @DocsEditable()
-  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;
+  static const int SHOW_DOCUMENT_FRAGMENT = 0x400;
 
   @DomName('NodeFilter.SHOW_DOCUMENT_TYPE')
   @DocsEditable()
-  static const int SHOW_DOCUMENT_TYPE = 0x00000200;
+  static const int SHOW_DOCUMENT_TYPE = 0x200;
 
   @DomName('NodeFilter.SHOW_ELEMENT')
   @DocsEditable()
-  static const int SHOW_ELEMENT = 0x00000001;
+  static const int SHOW_ELEMENT = 0x1;
 
   @DomName('NodeFilter.SHOW_PROCESSING_INSTRUCTION')
   @DocsEditable()
-  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;
+  static const int SHOW_PROCESSING_INSTRUCTION = 0x40;
 
   @DomName('NodeFilter.SHOW_TEXT')
   @DocsEditable()
-  static const int SHOW_TEXT = 0x00000004;
+  static const int SHOW_TEXT = 0x4;
 }
 // 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
@@ -24372,6 +25671,47 @@
   @DocsEditable()
   Node _item(int index) native;
 }
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('NonDocumentTypeChildNode')
+@Experimental() // untriaged
+@Native("NonDocumentTypeChildNode")
+class NonDocumentTypeChildNode extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NonDocumentTypeChildNode._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NonDocumentTypeChildNode.nextElementSibling')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element nextElementSibling;
+
+  @DomName('NonDocumentTypeChildNode.previousElementSibling')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element previousElementSibling;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('NonElementParentNode')
+@Experimental() // untriaged
+@Native("NonElementParentNode")
+class NonElementParentNode extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NonElementParentNode._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NonElementParentNode.getElementById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element getElementById(String elementId) native;
+}
 // 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.
@@ -24457,6 +25797,13 @@
   @Experimental() // untriaged
   final String body;
 
+  @DomName('Notification.data')
+  @DocsEditable()
+  @Experimental() // untriaged
+  @annotation_Creates_SerializedScriptValue
+  @annotation_Returns_SerializedScriptValue
+  final Object data;
+
   @DomName('Notification.dir')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -24476,6 +25823,11 @@
   @DocsEditable()
   final String permission;
 
+  @DomName('Notification.silent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool silent;
+
   @DomName('Notification.tag')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -24486,6 +25838,11 @@
   @Experimental() // untriaged
   final String title;
 
+  @DomName('Notification.vibrate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<int> vibrate;
+
   @DomName('Notification.close')
   @DocsEditable()
   void close() native;
@@ -24530,6 +25887,36 @@
 // for 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('NotificationEvent')
+@Experimental() // untriaged
+@Native("NotificationEvent")
+class NotificationEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory NotificationEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NotificationEvent.NotificationEvent')
+  @DocsEditable()
+  factory NotificationEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return NotificationEvent._create_1(type, eventInitDict_1);
+    }
+    return NotificationEvent._create_2(type);
+  }
+  static NotificationEvent _create_1(type, eventInitDict) => JS('NotificationEvent', 'new NotificationEvent(#,#)', type, eventInitDict);
+  static NotificationEvent _create_2(type) => JS('NotificationEvent', 'new NotificationEvent(#)', type);
+
+  @DomName('NotificationEvent.notification')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Notification notification;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 // WARNING: Do not edit - generated code.
 
 
@@ -24612,11 +25999,6 @@
   @DocsEditable()
   String height;
 
-  @DomName('HTMLObjectElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String integrity;
-
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
   String name;
@@ -24657,6 +26039,11 @@
   @DocsEditable()
   bool checkValidity() native;
 
+  @DomName('HTMLObjectElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
+
   @DomName('HTMLObjectElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) native;
@@ -24836,6 +26223,11 @@
   @DocsEditable()
   bool checkValidity() native;
 
+  @DomName('HTMLOutputElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
+
   @DomName('HTMLOutputElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) native;
@@ -24846,43 +26238,6 @@
 
 
 @DocsEditable()
-@DomName('OverflowEvent')
-@Experimental() // nonstandard
-@Native("OverflowEvent")
-class OverflowEvent extends Event {
-  // To suppress missing implicit constructor warnings.
-  factory OverflowEvent._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('OverflowEvent.BOTH')
-  @DocsEditable()
-  static const int BOTH = 2;
-
-  @DomName('OverflowEvent.HORIZONTAL')
-  @DocsEditable()
-  static const int HORIZONTAL = 0;
-
-  @DomName('OverflowEvent.VERTICAL')
-  @DocsEditable()
-  static const int VERTICAL = 1;
-
-  @DomName('OverflowEvent.horizontalOverflow')
-  @DocsEditable()
-  final bool horizontalOverflow;
-
-  @DomName('OverflowEvent.orient')
-  @DocsEditable()
-  final int orient;
-
-  @DomName('OverflowEvent.verticalOverflow')
-  @DocsEditable()
-  final bool verticalOverflow;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('PageTransitionEvent')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#pagetransitionevent
 @Experimental()
@@ -24891,6 +26246,18 @@
   // To suppress missing implicit constructor warnings.
   factory PageTransitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('PageTransitionEvent.PageTransitionEvent')
+  @DocsEditable()
+  factory PageTransitionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return PageTransitionEvent._create_1(type, eventInitDict_1);
+    }
+    return PageTransitionEvent._create_2(type);
+  }
+  static PageTransitionEvent _create_1(type, eventInitDict) => JS('PageTransitionEvent', 'new PageTransitionEvent(#,#)', type, eventInitDict);
+  static PageTransitionEvent _create_2(type) => JS('PageTransitionEvent', 'new PageTransitionEvent(#)', type);
+
   @DomName('PageTransitionEvent.persisted')
   @DocsEditable()
   final bool persisted;
@@ -24978,6 +26345,44 @@
 
 
 @DocsEditable()
+@DomName('PasswordCredential')
+@Experimental() // untriaged
+@Native("PasswordCredential")
+class PasswordCredential extends Credential {
+  // To suppress missing implicit constructor warnings.
+  factory PasswordCredential._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PasswordCredential.PasswordCredential')
+  @DocsEditable()
+  factory PasswordCredential(String id, String password, [String name, String iconURL]) {
+    if (iconURL != null) {
+      return PasswordCredential._create_1(id, password, name, iconURL);
+    }
+    if (name != null) {
+      return PasswordCredential._create_2(id, password, name);
+    }
+    return PasswordCredential._create_3(id, password);
+  }
+  static PasswordCredential _create_1(id, password, name, iconURL) => JS('PasswordCredential', 'new PasswordCredential(#,#,#,#)', id, password, name, iconURL);
+  static PasswordCredential _create_2(id, password, name) => JS('PasswordCredential', 'new PasswordCredential(#,#,#)', id, password, name);
+  static PasswordCredential _create_3(id, password) => JS('PasswordCredential', 'new PasswordCredential(#,#)', id, password);
+
+  @DomName('PasswordCredential.formData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final FormData formData;
+
+  @DomName('PasswordCredential.password')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String password;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('Path2D')
 @Experimental() // untriaged
 @Native("Path2D")
@@ -25100,6 +26505,11 @@
   @DocsEditable()
   final PerformanceTiming timing;
 
+  @DomName('Performance.clearFrameTimings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearFrameTimings() native;
+
   @DomName('Performance.clearMarks')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
@@ -25146,6 +26556,11 @@
   @DocsEditable()
   double now() native;
 
+  @DomName('Performance.setFrameTimingBufferSize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setFrameTimingBufferSize(int maxSize) native;
+
   @JSName('webkitClearResourceTimings')
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
@@ -25177,6 +26592,24 @@
 
 
 @DocsEditable()
+@DomName('PerformanceCompositeTiming')
+@Experimental() // untriaged
+@Native("PerformanceCompositeTiming")
+class PerformanceCompositeTiming extends PerformanceEntry {
+  // To suppress missing implicit constructor warnings.
+  factory PerformanceCompositeTiming._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PerformanceCompositeTiming.sourceFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int sourceFrame;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PerformanceEntry')
 // http://www.w3.org/TR/performance-timeline/#sec-PerformanceEntry-interface
 @Experimental()
@@ -25272,6 +26705,24 @@
 
 
 @DocsEditable()
+@DomName('PerformanceRenderTiming')
+@Experimental() // untriaged
+@Native("PerformanceRenderTiming")
+class PerformanceRenderTiming extends PerformanceEntry {
+  // To suppress missing implicit constructor warnings.
+  factory PerformanceRenderTiming._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PerformanceRenderTiming.sourceFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int sourceFrame;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PerformanceResourceTiming')
 // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming
 @Experimental()
@@ -25330,6 +26781,11 @@
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
   final double secureConnectionStart;
+
+  @DomName('PerformanceResourceTiming.workerStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double workerStart;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25434,6 +26890,175 @@
 
 
 @DocsEditable()
+@DomName('PeriodicSyncEvent')
+@Experimental() // untriaged
+@Native("PeriodicSyncEvent")
+class PeriodicSyncEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory PeriodicSyncEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PeriodicSyncEvent.PeriodicSyncEvent')
+  @DocsEditable()
+  factory PeriodicSyncEvent(String type, Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return PeriodicSyncEvent._create_1(type, init_1);
+  }
+  static PeriodicSyncEvent _create_1(type, init) => JS('PeriodicSyncEvent', 'new PeriodicSyncEvent(#,#)', type, init);
+
+  @DomName('PeriodicSyncEvent.registration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PeriodicSyncRegistration registration;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PeriodicSyncManager')
+@Experimental() // untriaged
+@Native("PeriodicSyncManager")
+class PeriodicSyncManager extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PeriodicSyncManager._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PeriodicSyncManager.minPossiblePeriod')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int minPossiblePeriod;
+
+  @DomName('PeriodicSyncManager.getRegistration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistration(String tag) native;
+
+  @DomName('PeriodicSyncManager.getRegistrations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistrations() native;
+
+  @DomName('PeriodicSyncManager.permissionState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future permissionState() native;
+
+  @DomName('PeriodicSyncManager.register')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future register([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _register_1(options_1);
+    }
+    return _register_2();
+  }
+  @JSName('register')
+  @DomName('PeriodicSyncManager.register')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _register_1(options) native;
+  @JSName('register')
+  @DomName('PeriodicSyncManager.register')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _register_2() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PeriodicSyncRegistration')
+@Experimental() // untriaged
+@Native("PeriodicSyncRegistration")
+class PeriodicSyncRegistration extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PeriodicSyncRegistration._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PeriodicSyncRegistration.minPeriod')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int minPeriod;
+
+  @DomName('PeriodicSyncRegistration.networkState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String networkState;
+
+  @DomName('PeriodicSyncRegistration.powerState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String powerState;
+
+  @DomName('PeriodicSyncRegistration.tag')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String tag;
+
+  @DomName('PeriodicSyncRegistration.unregister')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future unregister() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PermissionStatus')
+@Experimental() // untriaged
+@Native("PermissionStatus")
+class PermissionStatus extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory PermissionStatus._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PermissionStatus.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+
+  @DomName('PermissionStatus.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String state;
+
+  @DomName('PermissionStatus.status')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String status;
+
+  @DomName('PermissionStatus.onchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onChange => changeEvent.forTarget(this);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('Permissions')
+@Experimental() // untriaged
+@Native("Permissions")
+class Permissions extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Permissions._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Permissions.query')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future query(Object permission) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLPictureElement')
 @Experimental() // untriaged
 @Native("HTMLPictureElement")
@@ -25476,10 +27101,6 @@
   @DocsEditable()
   final String name;
 
-  @DomName('Plugin.__getter__')
-  @DocsEditable()
-  MimeType __getter__(String name) native;
-
   @DomName('Plugin.item')
   @DocsEditable()
   MimeType item(int index) native;
@@ -25549,10 +27170,6 @@
   Plugin elementAt(int index) => this[index];
   // -- end List<Plugin> mixins.
 
-  @DomName('PluginArray.__getter__')
-  @DocsEditable()
-  Plugin __getter__(String name) native;
-
   @DomName('PluginArray.item')
   @DocsEditable()
   Plugin item(int index) native;
@@ -25584,6 +27201,11 @@
    */
   PluginPlaceholderElement.created() : super.created();
 
+  @DomName('PluginPlaceholderElement.closeable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool closeable;
+
   @DomName('PluginPlaceholderElement.message')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25600,6 +27222,71 @@
 
 
 @DocsEditable()
+@DomName('PointerEvent')
+@Experimental() // untriaged
+@Native("PointerEvent")
+class PointerEvent extends MouseEvent {
+  // To suppress missing implicit constructor warnings.
+  factory PointerEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PointerEvent.PointerEvent')
+  @DocsEditable()
+  factory PointerEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return PointerEvent._create_1(type, eventInitDict_1);
+    }
+    return PointerEvent._create_2(type);
+  }
+  static PointerEvent _create_1(type, eventInitDict) => JS('PointerEvent', 'new PointerEvent(#,#)', type, eventInitDict);
+  static PointerEvent _create_2(type) => JS('PointerEvent', 'new PointerEvent(#)', type);
+
+  @DomName('PointerEvent.height')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double height;
+
+  @DomName('PointerEvent.isPrimary')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isPrimary;
+
+  @DomName('PointerEvent.pointerId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int pointerId;
+
+  @DomName('PointerEvent.pointerType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String pointerType;
+
+  @DomName('PointerEvent.pressure')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double pressure;
+
+  @DomName('PointerEvent.tiltX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int tiltX;
+
+  @DomName('PointerEvent.tiltY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int tiltY;
+
+  @DomName('PointerEvent.width')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double width;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PopStateEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -25610,6 +27297,18 @@
   // To suppress missing implicit constructor warnings.
   factory PopStateEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('PopStateEvent.PopStateEvent')
+  @DocsEditable()
+  factory PopStateEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return PopStateEvent._create_1(type, eventInitDict_1);
+    }
+    return PopStateEvent._create_2(type);
+  }
+  static PopStateEvent _create_1(type, eventInitDict) => JS('PopStateEvent', 'new PopStateEvent(#,#)', type, eventInitDict);
+  static PopStateEvent _create_2(type) => JS('PopStateEvent', 'new PopStateEvent(#)', type);
+
   @DomName('PopStateEvent.state')
   @DocsEditable()
   dynamic get state => convertNativeToDart_SerializedScriptValue(this._get_state);
@@ -25679,6 +27378,34 @@
 
 
 @DocsEditable()
+@DomName('PositionSensorVRDevice')
+@Experimental() // untriaged
+@Native("PositionSensorVRDevice")
+class PositionSensorVRDevice extends VRDevice {
+  // To suppress missing implicit constructor warnings.
+  factory PositionSensorVRDevice._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PositionSensorVRDevice.getImmediateState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VRPositionState getImmediateState() native;
+
+  @DomName('PositionSensorVRDevice.getState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VRPositionState getState() native;
+
+  @DomName('PositionSensorVRDevice.resetSensor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void resetSensor() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLPreElement')
 @Native("HTMLPreElement")
 class PreElement extends HtmlElement {
@@ -25707,6 +27434,102 @@
 class Presentation extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory Presentation._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Presentation.session')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PresentationSession session;
+
+  @DomName('Presentation.getAvailability')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getAvailability(String url) native;
+
+  @DomName('Presentation.joinSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future joinSession(String url, String presentationId) native;
+
+  @DomName('Presentation.startSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future startSession(String url) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PresentationAvailability')
+@Experimental() // untriaged
+@Native("PresentationAvailability")
+class PresentationAvailability extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory PresentationAvailability._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PresentationAvailability.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+
+  @DomName('PresentationAvailability.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool value;
+
+  @DomName('PresentationAvailability.onchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onChange => changeEvent.forTarget(this);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('PresentationSession')
+@Experimental() // untriaged
+@Native("PresentationSession")
+class PresentationSession extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory PresentationSession._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PresentationSession.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('PresentationSession.binaryType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String binaryType;
+
+  @DomName('PresentationSession.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('PresentationSession.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String state;
+
+  @DomName('PresentationSession.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() native;
+
+  @DomName('PresentationSession.send')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void send(data_OR_message) native;
+
+  @DomName('PresentationSession.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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
@@ -25790,6 +27613,18 @@
   // To suppress missing implicit constructor warnings.
   factory ProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ProgressEvent.ProgressEvent')
+  @DocsEditable()
+  factory ProgressEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return ProgressEvent._create_1(type, eventInitDict_1);
+    }
+    return ProgressEvent._create_2(type);
+  }
+  static ProgressEvent _create_1(type, eventInitDict) => JS('ProgressEvent', 'new ProgressEvent(#,#)', type, eventInitDict);
+  static ProgressEvent _create_2(type) => JS('ProgressEvent', 'new ProgressEvent(#)', type);
+
   @DomName('ProgressEvent.lengthComputable')
   @DocsEditable()
   final bool lengthComputable;
@@ -25808,17 +27643,64 @@
 
 
 @DocsEditable()
+@DomName('PromiseRejectionEvent')
+@Experimental() // untriaged
+@Native("PromiseRejectionEvent")
+class PromiseRejectionEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory PromiseRejectionEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PromiseRejectionEvent.PromiseRejectionEvent')
+  @DocsEditable()
+  factory PromiseRejectionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return PromiseRejectionEvent._create_1(type, eventInitDict_1);
+    }
+    return PromiseRejectionEvent._create_2(type);
+  }
+  static PromiseRejectionEvent _create_1(type, eventInitDict) => JS('PromiseRejectionEvent', 'new PromiseRejectionEvent(#,#)', type, eventInitDict);
+  static PromiseRejectionEvent _create_2(type) => JS('PromiseRejectionEvent', 'new PromiseRejectionEvent(#)', type);
+
+  @DomName('PromiseRejectionEvent.promise')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Future promise;
+
+  @DomName('PromiseRejectionEvent.reason')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Object reason;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PushEvent')
 @Experimental() // untriaged
 @Native("PushEvent")
-class PushEvent extends Event {
+class PushEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
   factory PushEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('PushEvent.PushEvent')
+  @DocsEditable()
+  factory PushEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return PushEvent._create_1(type, eventInitDict_1);
+    }
+    return PushEvent._create_2(type);
+  }
+  static PushEvent _create_1(type, eventInitDict) => JS('PushEvent', 'new PushEvent(#,#)', type, eventInitDict);
+  static PushEvent _create_2(type) => JS('PushEvent', 'new PushEvent(#)', type);
+
   @DomName('PushEvent.data')
   @DocsEditable()
   @Experimental() // untriaged
-  final String data;
+  final PushMessageData 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
@@ -25833,10 +27715,52 @@
   // To suppress missing implicit constructor warnings.
   factory PushManager._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('PushManager.register')
+  @DomName('PushManager.getSubscription')
   @DocsEditable()
   @Experimental() // untriaged
-  Future register(String senderId) native;
+  Future getSubscription() native;
+
+  @DomName('PushManager.permissionState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future permissionState([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _permissionState_1(options_1);
+    }
+    return _permissionState_2();
+  }
+  @JSName('permissionState')
+  @DomName('PushManager.permissionState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _permissionState_1(options) native;
+  @JSName('permissionState')
+  @DomName('PushManager.permissionState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _permissionState_2() native;
+
+  @DomName('PushManager.subscribe')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future subscribe([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _subscribe_1(options_1);
+    }
+    return _subscribe_2();
+  }
+  @JSName('subscribe')
+  @DomName('PushManager.subscribe')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _subscribe_1(options) native;
+  @JSName('subscribe')
+  @DomName('PushManager.subscribe')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _subscribe_2() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25844,22 +27768,62 @@
 
 
 @DocsEditable()
-@DomName('PushRegistration')
+@DomName('PushMessageData')
 @Experimental() // untriaged
-@Native("PushRegistration")
-class PushRegistration extends Interceptor {
+@Native("PushMessageData")
+class PushMessageData extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PushRegistration._() { throw new UnsupportedError("Not supported"); }
+  factory PushMessageData._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('PushRegistration.pushEndpoint')
+  @DomName('PushMessageData.PushMessageData')
+  @DocsEditable()
+  factory PushMessageData(String message) {
+    return PushMessageData._create_1(message);
+  }
+  static PushMessageData _create_1(message) => JS('PushMessageData', 'new PushMessageData(#)', message);
+
+  @DomName('PushMessageData.arrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  final String pushEndpoint;
+  ByteBuffer arrayBuffer() native;
 
-  @DomName('PushRegistration.pushRegistrationId')
+  @DomName('PushMessageData.blob')
   @DocsEditable()
   @Experimental() // untriaged
-  final String pushRegistrationId;
+  Blob blob() native;
+
+  @DomName('PushMessageData.json')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object json() native;
+
+  @DomName('PushMessageData.text')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String text() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PushSubscription')
+@Experimental() // untriaged
+@Native("PushSubscription")
+class PushSubscription extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PushSubscription._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PushSubscription.endpoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String endpoint;
+
+  @DomName('PushSubscription.unsubscribe')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future unsubscribe() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25946,26 +27910,6 @@
   @DocsEditable()
   static const int END_TO_START = 3;
 
-  @DomName('Range.NODE_AFTER')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  static const int NODE_AFTER = 1;
-
-  @DomName('Range.NODE_BEFORE')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  static const int NODE_BEFORE = 0;
-
-  @DomName('Range.NODE_BEFORE_AND_AFTER')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  static const int NODE_BEFORE_AND_AFTER = 2;
-
-  @DomName('Range.NODE_INSIDE')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  static const int NODE_INSIDE = 3;
-
   @DomName('Range.START_TO_END')
   @DocsEditable()
   static const int START_TO_END = 1;
@@ -26017,11 +27961,11 @@
 
   @DomName('Range.comparePoint')
   @DocsEditable()
-  int comparePoint(Node refNode, int offset) native;
+  int comparePoint(Node node, int offset) native;
 
   @DomName('Range.createContextualFragment')
   @DocsEditable()
-  DocumentFragment createContextualFragment(String html) native;
+  DocumentFragment createContextualFragment(String fragment) native;
 
   @DomName('Range.deleteContents')
   @DocsEditable()
@@ -26052,43 +27996,43 @@
 
   @DomName('Range.insertNode')
   @DocsEditable()
-  void insertNode(Node newNode) native;
+  void insertNode(Node node) native;
 
   @DomName('Range.isPointInRange')
   @DocsEditable()
-  bool isPointInRange(Node refNode, int offset) native;
+  bool isPointInRange(Node node, int offset) native;
 
   @DomName('Range.selectNode')
   @DocsEditable()
-  void selectNode(Node refNode) native;
+  void selectNode(Node node) native;
 
   @DomName('Range.selectNodeContents')
   @DocsEditable()
-  void selectNodeContents(Node refNode) native;
+  void selectNodeContents(Node node) native;
 
   @DomName('Range.setEnd')
   @DocsEditable()
-  void setEnd(Node refNode, int offset) native;
+  void setEnd(Node node, int offset) native;
 
   @DomName('Range.setEndAfter')
   @DocsEditable()
-  void setEndAfter(Node refNode) native;
+  void setEndAfter(Node node) native;
 
   @DomName('Range.setEndBefore')
   @DocsEditable()
-  void setEndBefore(Node refNode) native;
+  void setEndBefore(Node node) native;
 
   @DomName('Range.setStart')
   @DocsEditable()
-  void setStart(Node refNode, int offset) native;
+  void setStart(Node node, int offset) native;
 
   @DomName('Range.setStartAfter')
   @DocsEditable()
-  void setStartAfter(Node refNode) native;
+  void setStartAfter(Node node) native;
 
   @DomName('Range.setStartBefore')
   @DocsEditable()
-  void setStartBefore(Node refNode) native;
+  void setStartBefore(Node node) native;
 
   @DomName('Range.surroundContents')
   @DocsEditable()
@@ -26111,6 +28055,62 @@
 
 
 @DocsEditable()
+@DomName('ReadableByteStream')
+@Experimental() // untriaged
+@Native("ReadableByteStream")
+class ReadableByteStream extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ReadableByteStream._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ReadableByteStream.cancel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future cancel([Object reason]) native;
+
+  @DomName('ReadableByteStream.getReader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ReadableByteStreamReader getReader() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('ReadableByteStreamReader')
+@Experimental() // untriaged
+@Native("ReadableByteStreamReader")
+class ReadableByteStreamReader extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ReadableByteStreamReader._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ReadableByteStreamReader.closed')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Future closed;
+
+  @DomName('ReadableByteStreamReader.cancel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future cancel([Object reason]) native;
+
+  @DomName('ReadableByteStreamReader.read')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future read() native;
+
+  @DomName('ReadableByteStreamReader.releaseLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void releaseLock() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('ReadableStream')
 @Experimental() // untriaged
 @Native("ReadableStream")
@@ -26118,30 +28118,48 @@
   // To suppress missing implicit constructor warnings.
   factory ReadableStream._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('ReadableStream.closed')
+  @DomName('ReadableStream.cancel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future cancel([Object reason]) native;
+
+  @DomName('ReadableStream.getReader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ReadableStreamReader getReader() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('ReadableStreamReader')
+@Experimental() // untriaged
+@Native("ReadableStreamReader")
+class ReadableStreamReader extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ReadableStreamReader._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ReadableStreamReader.closed')
   @DocsEditable()
   @Experimental() // untriaged
   final Future closed;
 
-  @DomName('ReadableStream.state')
+  @DomName('ReadableStreamReader.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  final String state;
+  Future cancel([Object reason]) native;
 
-  @DomName('ReadableStream.cancel')
+  @DomName('ReadableStreamReader.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel(Object reason) native;
+  Future read() native;
 
-  @DomName('ReadableStream.read')
+  @DomName('ReadableStreamReader.releaseLock')
   @DocsEditable()
   @Experimental() // untriaged
-  Object read() native;
-
-  @DomName('ReadableStream.wait')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future wait() native;
+  void releaseLock() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -26156,6 +28174,18 @@
   // To suppress missing implicit constructor warnings.
   factory RelatedEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('RelatedEvent.RelatedEvent')
+  @DocsEditable()
+  factory RelatedEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return RelatedEvent._create_1(type, eventInitDict_1);
+    }
+    return RelatedEvent._create_2(type);
+  }
+  static RelatedEvent _create_1(type, eventInitDict) => JS('RelatedEvent', 'new RelatedEvent(#,#)', type, eventInitDict);
+  static RelatedEvent _create_2(type) => JS('RelatedEvent', 'new RelatedEvent(#)', type);
+
   @DomName('RelatedEvent.relatedTarget')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26432,6 +28462,14 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDtmfToneChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('RTCDTMFToneChangeEvent.RTCDTMFToneChangeEvent')
+  @DocsEditable()
+  factory RtcDtmfToneChangeEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
+  }
+  static RtcDtmfToneChangeEvent _create_1(type, eventInitDict) => JS('RtcDtmfToneChangeEvent', 'new RTCDTMFToneChangeEvent(#,#)', type, eventInitDict);
+
   @DomName('RTCDTMFToneChangeEvent.tone')
   @DocsEditable()
   final String tone;
@@ -26908,14 +28946,6 @@
   @DocsEditable()
   final String id;
 
-  @DomName('RTCStatsReport.local')
-  @DocsEditable()
-  final RtcStatsReport local;
-
-  @DomName('RTCStatsReport.remote')
-  @DocsEditable()
-  final RtcStatsReport remote;
-
   @DomName('RTCStatsReport.timestamp')
   @DocsEditable()
   DateTime get timestamp => convertNativeToDart_DateTime(this._get_timestamp);
@@ -26951,10 +28981,6 @@
   // To suppress missing implicit constructor warnings.
   factory RtcStatsResponse._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('RTCStatsResponse.__getter__')
-  @DocsEditable()
-  RtcStatsReport __getter__(String name) native;
-
   @DomName('RTCStatsResponse.namedItem')
   @DocsEditable()
   RtcStatsReport namedItem(String name) native;
@@ -27133,6 +29159,113 @@
 
 
 @DocsEditable()
+@DomName('ScrollState')
+@Experimental() // untriaged
+@Native("ScrollState")
+class ScrollState extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ScrollState._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ScrollState.ScrollState')
+  @DocsEditable()
+  factory ScrollState([num deltaX, num deltaY, num deltaGranularity, num velocityX, num velocityY, bool inInertialPhase, bool isBeginning, bool isEnding]) {
+    if (isEnding != null) {
+      return ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
+    }
+    if (isBeginning != null) {
+      return ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
+    }
+    if (inInertialPhase != null) {
+      return ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
+    }
+    if (velocityY != null) {
+      return ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
+    }
+    if (velocityX != null) {
+      return ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
+    }
+    if (deltaGranularity != null) {
+      return ScrollState._create_6(deltaX, deltaY, deltaGranularity);
+    }
+    if (deltaY != null) {
+      return ScrollState._create_7(deltaX, deltaY);
+    }
+    if (deltaX != null) {
+      return ScrollState._create_8(deltaX);
+    }
+    return ScrollState._create_9();
+  }
+  static ScrollState _create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) => JS('ScrollState', 'new ScrollState(#,#,#,#,#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
+  static ScrollState _create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning) => JS('ScrollState', 'new ScrollState(#,#,#,#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
+  static ScrollState _create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase) => JS('ScrollState', 'new ScrollState(#,#,#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
+  static ScrollState _create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY) => JS('ScrollState', 'new ScrollState(#,#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX, velocityY);
+  static ScrollState _create_5(deltaX, deltaY, deltaGranularity, velocityX) => JS('ScrollState', 'new ScrollState(#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX);
+  static ScrollState _create_6(deltaX, deltaY, deltaGranularity) => JS('ScrollState', 'new ScrollState(#,#,#)', deltaX, deltaY, deltaGranularity);
+  static ScrollState _create_7(deltaX, deltaY) => JS('ScrollState', 'new ScrollState(#,#)', deltaX, deltaY);
+  static ScrollState _create_8(deltaX) => JS('ScrollState', 'new ScrollState(#)', deltaX);
+  static ScrollState _create_9() => JS('ScrollState', 'new ScrollState()');
+
+  @DomName('ScrollState.deltaGranularity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double deltaGranularity;
+
+  @DomName('ScrollState.deltaX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double deltaX;
+
+  @DomName('ScrollState.deltaY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double deltaY;
+
+  @DomName('ScrollState.fromUserInput')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool fromUserInput;
+
+  @DomName('ScrollState.inInertialPhase')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool inInertialPhase;
+
+  @DomName('ScrollState.isBeginning')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isBeginning;
+
+  @DomName('ScrollState.isEnding')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isEnding;
+
+  @DomName('ScrollState.shouldPropagate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool shouldPropagate;
+
+  @DomName('ScrollState.velocityX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double velocityX;
+
+  @DomName('ScrollState.velocityY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double velocityY;
+
+  @DomName('ScrollState.consumeDelta')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void consumeDelta(num x, num y) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('SecurityPolicyViolationEvent')
 // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicyviolationevent-events
 @Experimental()
@@ -27141,6 +29274,18 @@
   // To suppress missing implicit constructor warnings.
   factory SecurityPolicyViolationEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SecurityPolicyViolationEvent.SecurityPolicyViolationEvent')
+  @DocsEditable()
+  factory SecurityPolicyViolationEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
+    }
+    return SecurityPolicyViolationEvent._create_2(type);
+  }
+  static SecurityPolicyViolationEvent _create_1(type, eventInitDict) => JS('SecurityPolicyViolationEvent', 'new SecurityPolicyViolationEvent(#,#)', type, eventInitDict);
+  static SecurityPolicyViolationEvent _create_2(type) => JS('SecurityPolicyViolationEvent', 'new SecurityPolicyViolationEvent(#)', type);
+
   @JSName('blockedURI')
   @DomName('SecurityPolicyViolationEvent.blockedURI')
   @DocsEditable()
@@ -27270,12 +29415,12 @@
 
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable()
-  void __setter__(int index, OptionElement value) native;
+  void __setter__(int index, OptionElement option) native;
 
   @DomName('HTMLSelectElement.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(HtmlElement element, int before) native;
+  void add(Object element, Object before) native;
 
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
@@ -27287,7 +29432,12 @@
 
   @DomName('HTMLSelectElement.namedItem')
   @DocsEditable()
-  Element namedItem(String name) native;
+  OptionElement namedItem(String name) native;
+
+  @DomName('HTMLSelectElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
 
   @DomName('HTMLSelectElement.setCustomValidity')
   @DocsEditable()
@@ -27392,7 +29542,7 @@
   @DomName('Selection.containsNode')
   @DocsEditable()
   @Experimental() // non-standard
-  bool containsNode(Node node, bool allowPartial) native;
+  bool containsNode(Node node, bool allowPartialContainment) native;
 
   @DomName('Selection.deleteFromDocument')
   @DocsEditable()
@@ -27440,19 +29590,35 @@
 
 
 @DocsEditable()
-@DomName('ServiceWorkerClient')
+@DomName('ServicePort')
 @Experimental() // untriaged
-@Native("ServiceWorkerClient")
-class ServiceWorkerClient extends Interceptor {
+@Native("ServicePort")
+class ServicePort extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ServiceWorkerClient._() { throw new UnsupportedError("Not supported"); }
+  factory ServicePort._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('ServiceWorkerClient.id')
+  @DomName('ServicePort.data')
   @DocsEditable()
   @Experimental() // untriaged
-  final int id;
+  final Object data;
 
-  @DomName('ServiceWorkerClient.postMessage')
+  @DomName('ServicePort.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String name;
+
+  @JSName('targetURL')
+  @DomName('ServicePort.targetURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String targetUrl;
+
+  @DomName('ServicePort.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() native;
+
+  @DomName('ServicePort.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
   void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
@@ -27466,12 +29632,12 @@
     return;
   }
   @JSName('postMessage')
-  @DomName('ServiceWorkerClient.postMessage')
+  @DomName('ServicePort.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
   void _postMessage_1(message, List<MessagePort> transfer) native;
   @JSName('postMessage')
-  @DomName('ServiceWorkerClient.postMessage')
+  @DomName('ServicePort.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
   void _postMessage_2(message) native;
@@ -27482,33 +29648,118 @@
 
 
 @DocsEditable()
-@DomName('ServiceWorkerClients')
+@DomName('ServicePortCollection')
 @Experimental() // untriaged
-@Native("ServiceWorkerClients")
-class ServiceWorkerClients extends Interceptor {
+@Native("ServicePortCollection")
+class ServicePortCollection extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory ServiceWorkerClients._() { throw new UnsupportedError("Not supported"); }
+  factory ServicePortCollection._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('ServiceWorkerClients.getAll')
+  @DomName('ServicePortCollection.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getAll([Map options]) {
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('ServicePortCollection.connect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future connect(String url, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
-      return _getAll_1(options_1);
+      return _connect_1(url, options_1);
     }
-    return _getAll_2();
+    return _connect_2(url);
   }
-  @JSName('getAll')
-  @DomName('ServiceWorkerClients.getAll')
+  @JSName('connect')
+  @DomName('ServicePortCollection.connect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _getAll_1(options) native;
-  @JSName('getAll')
-  @DomName('ServiceWorkerClients.getAll')
+  Future _connect_1(url, options) native;
+  @JSName('connect')
+  @DomName('ServicePortCollection.connect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _getAll_2() native;
+  Future _connect_2(url) native;
+
+  @DomName('ServicePortCollection.match')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future match(Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    return _match_1(options_1);
+  }
+  @JSName('match')
+  @DomName('ServicePortCollection.match')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _match_1(options) native;
+
+  @DomName('ServicePortCollection.matchAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future matchAll([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _matchAll_1(options_1);
+    }
+    return _matchAll_2();
+  }
+  @JSName('matchAll')
+  @DomName('ServicePortCollection.matchAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _matchAll_1(options) native;
+  @JSName('matchAll')
+  @DomName('ServicePortCollection.matchAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _matchAll_2() native;
+
+  @DomName('ServicePortCollection.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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.
+
+
+@DocsEditable()
+@DomName('ServicePortConnectEvent')
+@Experimental() // untriaged
+@Native("ServicePortConnectEvent")
+class ServicePortConnectEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory ServicePortConnectEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ServicePortConnectEvent.ServicePortConnectEvent')
+  @DocsEditable()
+  factory ServicePortConnectEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return ServicePortConnectEvent._create_1(type, eventInitDict_1);
+    }
+    return ServicePortConnectEvent._create_2(type);
+  }
+  static ServicePortConnectEvent _create_1(type, eventInitDict) => JS('ServicePortConnectEvent', 'new ServicePortConnectEvent(#,#)', type, eventInitDict);
+  static ServicePortConnectEvent _create_2(type) => JS('ServicePortConnectEvent', 'new ServicePortConnectEvent(#)', type);
+
+  @DomName('ServicePortConnectEvent.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
+  @JSName('targetURL')
+  @DomName('ServicePortConnectEvent.targetURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String targetUrl;
+
+  @DomName('ServicePortConnectEvent.respondWith')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future respondWith(Future response) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27519,10 +29770,15 @@
 @DomName('ServiceWorkerContainer')
 @Experimental() // untriaged
 @Native("ServiceWorkerContainer")
-class ServiceWorkerContainer extends Interceptor {
+class ServiceWorkerContainer extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerContainer._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ServiceWorkerContainer.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
   @DomName('ServiceWorkerContainer.controller')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27538,6 +29794,11 @@
   @Experimental() // untriaged
   Future getRegistration([String documentURL]) native;
 
+  @DomName('ServiceWorkerContainer.getRegistrations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistrations() native;
+
   @DomName('ServiceWorkerContainer.register')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27558,6 +29819,11 @@
   @DocsEditable()
   @Experimental() // untriaged
   Future _register_2(url) native;
+
+  @DomName('ServiceWorkerContainer.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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
@@ -27577,67 +29843,97 @@
   @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('ServiceWorkerGlobalScope.caches')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final CacheStorage caches;
-
   @DomName('ServiceWorkerGlobalScope.clients')
   @DocsEditable()
   @Experimental() // untriaged
-  final ServiceWorkerClients clients;
+  final Clients clients;
 
-  @DomName('ServiceWorkerGlobalScope.scope')
+  @DomName('ServiceWorkerGlobalScope.ports')
   @DocsEditable()
   @Experimental() // untriaged
-  final String scope;
+  final StashedPortCollection ports;
 
-  @DomName('ServiceWorkerGlobalScope.fetch')
+  @DomName('ServiceWorkerGlobalScope.registration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _fetch(request, [Map requestInitDict]) {
-    if ((request is String || request == null) && requestInitDict == null) {
-      return _fetch_1(request);
-    }
-    if (requestInitDict != null && (request is String || request == null)) {
-      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
-      return _fetch_2(request, requestInitDict_1);
-    }
-    if ((request is _Request || request == null) && requestInitDict == null) {
-      return _fetch_3(request);
-    }
-    if (requestInitDict != null && (request is _Request || request == null)) {
-      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
-      return _fetch_4(request, requestInitDict_1);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-  @JSName('fetch')
-  @DomName('ServiceWorkerGlobalScope.fetch')
+  final ServiceWorkerRegistration registration;
+
+  @DomName('ServiceWorkerGlobalScope.skipWaiting')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _fetch_1(String request) native;
-  @JSName('fetch')
-  @DomName('ServiceWorkerGlobalScope.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future _fetch_2(String request, requestInitDict) native;
-  @JSName('fetch')
-  @DomName('ServiceWorkerGlobalScope.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future _fetch_3(_Request request) native;
-  @JSName('fetch')
-  @DomName('ServiceWorkerGlobalScope.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future _fetch_4(_Request request, requestInitDict) native;
+  Future skipWaiting() native;
 
   @DomName('ServiceWorkerGlobalScope.onmessage')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+// TODO(alanknight): Provide a nicer constructor that uses named parameters
+// rather than an initialization map.
+@DomName('ServiceWorkerMessageEvent')
+@Experimental() // untriaged
+@Native("ServiceWorkerMessageEvent")
+class ServiceWorkerMessageEvent extends Event {
+
+  // TODO(alanknight): This really should be generated by the
+  // _OutputConversion in the systemnative.py script, but that doesn't
+  // use those conversions right now, so do this as a one-off.
+  @DomName('ServiceWorkerMessageEvent.data')
+  @DocsEditable()
+  dynamic get data => convertNativeToDart_SerializedScriptValue(this._get_data);
+
+  @JSName('data')
+  @DomName('ServiceWorkerMessageEvent.data')
+  @DocsEditable()
+  @annotation_Creates_SerializedScriptValue
+  @annotation_Returns_SerializedScriptValue
+  final dynamic _get_data;
+
+  // To suppress missing implicit constructor warnings.
+  factory ServiceWorkerMessageEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ServiceWorkerMessageEvent.ServiceWorkerMessageEvent')
+  @DocsEditable()
+  factory ServiceWorkerMessageEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return ServiceWorkerMessageEvent._create_1(type, eventInitDict_1);
+    }
+    return ServiceWorkerMessageEvent._create_2(type);
+  }
+  static ServiceWorkerMessageEvent _create_1(type, eventInitDict) => JS('ServiceWorkerMessageEvent', 'new ServiceWorkerMessageEvent(#,#)', type, eventInitDict);
+  static ServiceWorkerMessageEvent _create_2(type) => JS('ServiceWorkerMessageEvent', 'new ServiceWorkerMessageEvent(#)', type);
+
+  @DomName('ServiceWorkerMessageEvent.lastEventId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String lastEventId;
+
+  @DomName('ServiceWorkerMessageEvent.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
+  @DomName('ServiceWorkerMessageEvent.ports')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<MessagePort> ports;
+
+  @DomName('ServiceWorkerMessageEvent.source')
+  @DocsEditable()
+  @Experimental() // untriaged
+  @Creates('Null')
+  @Returns('_ServiceWorker|MessagePort')
+  final Object source;
+
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -27656,25 +29952,92 @@
   @Experimental() // untriaged
   final _ServiceWorker active;
 
+  @DomName('ServiceWorkerRegistration.geofencing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Geofencing geofencing;
+
   @DomName('ServiceWorkerRegistration.installing')
   @DocsEditable()
   @Experimental() // untriaged
   final _ServiceWorker installing;
 
+  @DomName('ServiceWorkerRegistration.periodicSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PeriodicSyncManager periodicSync;
+
+  @DomName('ServiceWorkerRegistration.pushManager')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PushManager pushManager;
+
   @DomName('ServiceWorkerRegistration.scope')
   @DocsEditable()
   @Experimental() // untriaged
   final String scope;
 
+  @DomName('ServiceWorkerRegistration.sync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final SyncManager sync;
+
   @DomName('ServiceWorkerRegistration.waiting')
   @DocsEditable()
   @Experimental() // untriaged
   final _ServiceWorker waiting;
 
+  @DomName('ServiceWorkerRegistration.getNotifications')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getNotifications([Map filter]) {
+    if (filter != null) {
+      var filter_1 = convertDartToNative_Dictionary(filter);
+      return _getNotifications_1(filter_1);
+    }
+    return _getNotifications_2();
+  }
+  @JSName('getNotifications')
+  @DomName('ServiceWorkerRegistration.getNotifications')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _getNotifications_1(filter) native;
+  @JSName('getNotifications')
+  @DomName('ServiceWorkerRegistration.getNotifications')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _getNotifications_2() native;
+
+  @DomName('ServiceWorkerRegistration.showNotification')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future showNotification(String title, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _showNotification_1(title, options_1);
+    }
+    return _showNotification_2(title);
+  }
+  @JSName('showNotification')
+  @DomName('ServiceWorkerRegistration.showNotification')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _showNotification_1(title, options) native;
+  @JSName('showNotification')
+  @DomName('ServiceWorkerRegistration.showNotification')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _showNotification_2(title) native;
+
   @DomName('ServiceWorkerRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
   Future unregister() native;
+
+  @DomName('ServiceWorkerRegistration.update')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void update() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27731,6 +30094,11 @@
   @DocsEditable()
   final Element activeElement;
 
+  @DomName('ShadowRoot.delegatesFocus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool delegatesFocus;
+
   @DomName('ShadowRoot.host')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27762,17 +30130,10 @@
   @DocsEditable()
   Element elementFromPoint(int x, int y) native;
 
-  @DomName('ShadowRoot.getElementsByClassName')
+  @DomName('ShadowRoot.elementsFromPoint')
   @DocsEditable()
-  @Creates('NodeList|HtmlCollection')
-  @Returns('NodeList|HtmlCollection')
-  List<Node> getElementsByClassName(String className) native;
-
-  @DomName('ShadowRoot.getElementsByTagName')
-  @DocsEditable()
-  @Creates('NodeList|HtmlCollection')
-  @Returns('NodeList|HtmlCollection')
-  List<Node> getElementsByTagName(String tagName) native;
+  @Experimental() // untriaged
+  List<Element> elementsFromPoint(int x, int y) native;
 
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
@@ -27823,6 +30184,24 @@
 
 
 @DocsEditable()
+@DomName('SharedArrayBuffer')
+@Experimental() // untriaged
+@Native("SharedArrayBuffer")
+class SharedArrayBuffer extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory SharedArrayBuffer._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('SharedArrayBuffer.byteLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int byteLength;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('SharedWorker')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface
 @Experimental()
@@ -27933,6 +30312,11 @@
   @DocsEditable()
   num timestampOffset;
 
+  @DomName('SourceBuffer.trackDefaults')
+  @DocsEditable()
+  @Experimental() // untriaged
+  TrackDefaultList trackDefaults;
+
   @DomName('SourceBuffer.updating')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28051,11 +30435,6 @@
    */
   SourceElement.created() : super.created();
 
-  @DomName('HTMLSourceElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String integrity;
-
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
   String media;
@@ -28370,6 +30749,11 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.SpeechRecognition || window.webkitSpeechRecognition)');
 
+  @DomName('SpeechRecognition.audioTrack')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStreamTrack audioTrack;
+
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
   bool continuous;
@@ -28390,6 +30774,12 @@
   @DocsEditable()
   int maxAlternatives;
 
+  @JSName('serviceURI')
+  @DomName('SpeechRecognition.serviceURI')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String serviceUri;
+
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
   void abort() native;
@@ -28500,6 +30890,18 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionError._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SpeechRecognitionError.SpeechRecognitionError')
+  @DocsEditable()
+  factory SpeechRecognitionError(String type, [Map initDict]) {
+    if (initDict != null) {
+      var initDict_1 = convertDartToNative_Dictionary(initDict);
+      return SpeechRecognitionError._create_1(type, initDict_1);
+    }
+    return SpeechRecognitionError._create_2(type);
+  }
+  static SpeechRecognitionError _create_1(type, initDict) => JS('SpeechRecognitionError', 'new SpeechRecognitionError(#,#)', type, initDict);
+  static SpeechRecognitionError _create_2(type) => JS('SpeechRecognitionError', 'new SpeechRecognitionError(#)', type);
+
   @DomName('SpeechRecognitionError.error')
   @DocsEditable()
   final String error;
@@ -28523,6 +30925,18 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SpeechRecognitionEvent.SpeechRecognitionEvent')
+  @DocsEditable()
+  factory SpeechRecognitionEvent(String type, [Map initDict]) {
+    if (initDict != null) {
+      var initDict_1 = convertDartToNative_Dictionary(initDict);
+      return SpeechRecognitionEvent._create_1(type, initDict_1);
+    }
+    return SpeechRecognitionEvent._create_2(type);
+  }
+  static SpeechRecognitionEvent _create_1(type, initDict) => JS('SpeechRecognitionEvent', 'new SpeechRecognitionEvent(#,#)', type, initDict);
+  static SpeechRecognitionEvent _create_2(type) => JS('SpeechRecognitionEvent', 'new SpeechRecognitionEvent(#)', type);
+
   @DomName('SpeechRecognitionEvent.emma')
   @DocsEditable()
   final Document emma;
@@ -28639,6 +31053,11 @@
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
   final String name;
+
+  @DomName('SpeechSynthesisEvent.utterance')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final SpeechSynthesisUtterance utterance;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28835,6 +31254,52 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable()
+@DomName('StashedMessagePort')
+@Experimental() // untriaged
+@Native("StashedMessagePort")
+class StashedMessagePort extends MessagePort {
+  // To suppress missing implicit constructor warnings.
+  factory StashedMessagePort._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('StashedMessagePort.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String name;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('StashedPortCollection')
+@Experimental() // untriaged
+@Native("StashedPortCollection")
+class StashedPortCollection extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory StashedPortCollection._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('StashedPortCollection.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('StashedPortCollection.add')
+  @DocsEditable()
+  @Experimental() // untriaged
+  StashedMessagePort add(String name, MessagePort port) native;
+
+  @DomName('StashedPortCollection.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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.
+
+
 /**
  * The type used by the
  * [Window.localStorage] and [Window.sessionStorage] properties.
@@ -28995,8 +31460,18 @@
         newValue, url, storageArea);
     return e;
   }
-  // To suppress missing implicit constructor warnings.
-  factory StorageEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('StorageEvent.StorageEvent')
+  @DocsEditable()
+  factory StorageEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return StorageEvent._create_1(type, eventInitDict_1);
+    }
+    return StorageEvent._create_2(type);
+  }
+  static StorageEvent _create_1(type, eventInitDict) => JS('StorageEvent', 'new StorageEvent(#,#)', type, eventInitDict);
+  static StorageEvent _create_2(type) => JS('StorageEvent', 'new StorageEvent(#)', type);
 
   @DomName('StorageEvent.key')
   @DocsEditable()
@@ -29216,6 +31691,104 @@
 
 
 @DocsEditable()
+@DomName('SyncEvent')
+@Experimental() // untriaged
+@Native("SyncEvent")
+class SyncEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory SyncEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('SyncEvent.SyncEvent')
+  @DocsEditable()
+  factory SyncEvent(String type, Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return SyncEvent._create_1(type, init_1);
+  }
+  static SyncEvent _create_1(type, init) => JS('SyncEvent', 'new SyncEvent(#,#)', type, init);
+
+  @DomName('SyncEvent.registration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final SyncRegistration registration;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('SyncManager')
+@Experimental() // untriaged
+@Native("SyncManager")
+class SyncManager extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory SyncManager._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('SyncManager.getRegistration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistration(String tag) native;
+
+  @DomName('SyncManager.getRegistrations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistrations() native;
+
+  @DomName('SyncManager.permissionState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future permissionState() native;
+
+  @DomName('SyncManager.register')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future register([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _register_1(options_1);
+    }
+    return _register_2();
+  }
+  @JSName('register')
+  @DomName('SyncManager.register')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _register_1(options) native;
+  @JSName('register')
+  @DomName('SyncManager.register')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _register_2() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('SyncRegistration')
+@Experimental() // untriaged
+@Native("SyncRegistration")
+class SyncRegistration extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory SyncRegistration._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('SyncRegistration.tag')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String tag;
+
+  @DomName('SyncRegistration.unregister')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future unregister() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLTableCaptionElement')
 @Native("HTMLTableCaptionElement")
 class TableCaptionElement extends HtmlElement {
@@ -29661,6 +32234,11 @@
    */
   TextAreaElement.created() : super.created();
 
+  @DomName('HTMLTextAreaElement.autocapitalize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String autocapitalize;
+
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
   bool autofocus;
@@ -29703,6 +32281,11 @@
   @DocsEditable()
   int maxLength;
 
+  @DomName('HTMLTextAreaElement.minLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int minLength;
+
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
   String name;
@@ -29767,6 +32350,11 @@
   @DocsEditable()
   bool checkValidity() native;
 
+  @DomName('HTMLTextAreaElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() native;
+
   @DomName('HTMLTextAreaElement.select')
   @DocsEditable()
   void select() native;
@@ -30240,69 +32828,6 @@
 
 
 @DocsEditable()
-@DomName('Timing')
-@Experimental() // untriaged
-@Native("Timing")
-class Timing extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory Timing._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Timing.delay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num delay;
-
-  @DomName('Timing.direction')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String direction;
-
-  @DomName('Timing.easing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String easing;
-
-  @DomName('Timing.endDelay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num endDelay;
-
-  @DomName('Timing.fill')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String fill;
-
-  @DomName('Timing.iterationStart')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num iterationStart;
-
-  @DomName('Timing.iterations')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num iterations;
-
-  @DomName('Timing.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num playbackRate;
-
-  @DomName('Timing.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object __getter__(String name) native;
-
-  @DomName('Timing.__setter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void __setter__(String name, num duration) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('HTMLTitleElement')
 @Native("HTMLTitleElement")
 class TitleElement extends HtmlElement {
@@ -30374,6 +32899,11 @@
   @Experimental() // untriaged
   final double _radiusY;
 
+  @DomName('Touch.rotationAngle')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double rotationAngle;
+
   @JSName('screenX')
   @DomName('Touch.screenX')
   @DocsEditable()
@@ -30394,14 +32924,6 @@
   @Returns('Element|Document')
   final dynamic _get_target;
 
-  @JSName('webkitRotationAngle')
-  @DomName('Touch.webkitRotationAngle')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  final double rotationAngle;
-
 
 // As of Chrome 37, these all changed from long to double.  This code
 // preserves backwards compatability for the time being.
@@ -30593,6 +33115,91 @@
 
 
 @DocsEditable()
+@DomName('TrackDefault')
+@Experimental() // untriaged
+@Native("TrackDefault")
+class TrackDefault extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory TrackDefault._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('TrackDefault.TrackDefault')
+  @DocsEditable()
+  factory TrackDefault(String type, String language, String label, List<String> kinds, [String byteStreamTrackID]) {
+    if (byteStreamTrackID != null) {
+      List kinds_1 = convertDartToNative_StringArray(kinds);
+      return TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
+    }
+    List kinds_1 = convertDartToNative_StringArray(kinds);
+    return TrackDefault._create_2(type, language, label, kinds_1);
+  }
+  static TrackDefault _create_1(type, language, label, kinds, byteStreamTrackID) => JS('TrackDefault', 'new TrackDefault(#,#,#,#,#)', type, language, label, kinds, byteStreamTrackID);
+  static TrackDefault _create_2(type, language, label, kinds) => JS('TrackDefault', 'new TrackDefault(#,#,#,#)', type, language, label, kinds);
+
+  @DomName('TrackDefault.byteStreamTrackID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String byteStreamTrackID;
+
+  @DomName('TrackDefault.kinds')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<String> kinds;
+
+  @DomName('TrackDefault.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String label;
+
+  @DomName('TrackDefault.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String language;
+
+  @DomName('TrackDefault.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('TrackDefaultList')
+@Experimental() // untriaged
+@Native("TrackDefaultList")
+class TrackDefaultList extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory TrackDefaultList._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('TrackDefaultList.TrackDefaultList')
+  @DocsEditable()
+  factory TrackDefaultList([List<TrackDefault> trackDefaults]) {
+    if (trackDefaults != null) {
+      return TrackDefaultList._create_1(trackDefaults);
+    }
+    return TrackDefaultList._create_2();
+  }
+  static TrackDefaultList _create_1(trackDefaults) => JS('TrackDefaultList', 'new TrackDefaultList(#)', trackDefaults);
+  static TrackDefaultList _create_2() => JS('TrackDefaultList', 'new TrackDefaultList()');
+
+  @DomName('TrackDefaultList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+
+  @DomName('TrackDefaultList.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  TrackDefault item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLTrackElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -30638,11 +33245,6 @@
   @DocsEditable()
   bool defaultValue;
 
-  @DomName('HTMLTrackElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String integrity;
-
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
   String kind;
@@ -30680,6 +33282,18 @@
   // To suppress missing implicit constructor warnings.
   factory TrackEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('TrackEvent.TrackEvent')
+  @DocsEditable()
+  factory TrackEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return TrackEvent._create_1(type, eventInitDict_1);
+    }
+    return TrackEvent._create_2(type);
+  }
+  static TrackEvent _create_1(type, eventInitDict) => JS('TrackEvent', 'new TrackEvent(#,#)', type, eventInitDict);
+  static TrackEvent _create_2(type) => JS('TrackEvent', 'new TrackEvent(#)', type);
+
   @DomName('TrackEvent.track')
   @DocsEditable()
   @Creates('Null')
@@ -30697,6 +33311,18 @@
   // To suppress missing implicit constructor warnings.
   factory TransitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('TransitionEvent.TransitionEvent')
+  @DocsEditable()
+  factory TransitionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return TransitionEvent._create_1(type, eventInitDict_1);
+    }
+    return TransitionEvent._create_2(type);
+  }
+  static TransitionEvent _create_1(type, eventInitDict) => JS('TransitionEvent', 'new TransitionEvent(#,#)', type, eventInitDict);
+  static TransitionEvent _create_2(type) => JS('TransitionEvent', 'new TransitionEvent(#)', type);
+
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
   final double elapsedTime;
@@ -30795,8 +33421,18 @@
     e._initUIEvent(type, canBubble, cancelable, view, detail);
     return e;
   }
-  // To suppress missing implicit constructor warnings.
-  factory UIEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('UIEvent.UIEvent')
+  @DocsEditable()
+  factory UIEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return UIEvent._create_1(type, eventInitDict_1);
+    }
+    return UIEvent._create_2(type);
+  }
+  static UIEvent _create_1(type, eventInitDict) => JS('UIEvent', 'new UIEvent(#,#)', type, eventInitDict);
+  static UIEvent _create_2(type) => JS('UIEvent', 'new UIEvent(#)', type);
 
   @JSName('charCode')
   @DomName('UIEvent.charCode')
@@ -30814,33 +33450,10 @@
   @Unstable()
   final int _keyCode;
 
-  @JSName('layerX')
-  @DomName('UIEvent.layerX')
+  @DomName('UIEvent.sourceDevice')
   @DocsEditable()
-  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
-  @Experimental() // nonstandard
-  final int _layerX;
-
-  @JSName('layerY')
-  @DomName('UIEvent.layerY')
-  @DocsEditable()
-  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
-  @Experimental() // nonstandard
-  final int _layerY;
-
-  @JSName('pageX')
-  @DomName('UIEvent.pageX')
-  @DocsEditable()
-  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
-  @Experimental() // nonstandard
-  final int _pageX;
-
-  @JSName('pageY')
-  @DomName('UIEvent.pageY')
-  @DocsEditable()
-  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
-  @Experimental() // nonstandard
-  final int _pageY;
+  @Experimental() // untriaged
+  final InputDevice sourceDevice;
 
   @DomName('UIEvent.view')
   @DocsEditable()
@@ -30852,24 +33465,17 @@
   @Returns('Window|=Object')
   final dynamic _get_view;
 
+  @JSName('which')
   @DomName('UIEvent.which')
   @DocsEditable()
   @Unstable()
-  final int which;
+  final int _which;
 
   @JSName('initUIEvent')
   @DomName('UIEvent.initUIEvent')
   @DocsEditable()
-  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) native;
+  void _initUIEvent(String type, bool bubbles, bool cancelable, Window view, int detail) native;
 
-
-  @DomName('UIEvent.layerX')
-  @DomName('UIEvent.layerY')
-  Point get layer => new Point(_layerX, _layerY);
-
-  @DomName('UIEvent.pageX')
-  @DomName('UIEvent.pageY')
-  Point get page => new Point(_pageX, _pageY);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -31077,6 +33683,170 @@
 
 
 @DocsEditable()
+@DomName('VRDevice')
+@Experimental() // untriaged
+@Native("VRDevice")
+class VRDevice extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRDevice._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VRDevice.deviceId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String deviceId;
+
+  @DomName('VRDevice.deviceName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String deviceName;
+
+  @DomName('VRDevice.hardwareUnitId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String hardwareUnitId;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VREyeParameters')
+@Experimental() // untriaged
+@Native("VREyeParameters")
+class VREyeParameters extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VREyeParameters._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VREyeParameters.currentFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRFieldOfView currentFieldOfView;
+
+  @DomName('VREyeParameters.eyeTranslation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint eyeTranslation;
+
+  @DomName('VREyeParameters.maximumFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRFieldOfView maximumFieldOfView;
+
+  @DomName('VREyeParameters.minimumFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRFieldOfView minimumFieldOfView;
+
+  @DomName('VREyeParameters.recommendedFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRFieldOfView recommendedFieldOfView;
+
+  @DomName('VREyeParameters.renderRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _DomRect renderRect;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VRFieldOfView')
+@Experimental() // untriaged
+@Native("VRFieldOfView")
+class VRFieldOfView extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRFieldOfView._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VRFieldOfView.VRFieldOfView')
+  @DocsEditable()
+  factory VRFieldOfView([Map fov]) {
+    if (fov != null) {
+      var fov_1 = convertDartToNative_Dictionary(fov);
+      return VRFieldOfView._create_1(fov_1);
+    }
+    return VRFieldOfView._create_2();
+  }
+  static VRFieldOfView _create_1(fov) => JS('VRFieldOfView', 'new VRFieldOfView(#)', fov);
+  static VRFieldOfView _create_2() => JS('VRFieldOfView', 'new VRFieldOfView()');
+
+  @DomName('VRFieldOfView.downDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num downDegrees;
+
+  @DomName('VRFieldOfView.leftDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num leftDegrees;
+
+  @DomName('VRFieldOfView.rightDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num rightDegrees;
+
+  @DomName('VRFieldOfView.upDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num upDegrees;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VRPositionState')
+@Experimental() // untriaged
+@Native("VRPositionState")
+class VRPositionState extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRPositionState._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VRPositionState.angularAcceleration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint angularAcceleration;
+
+  @DomName('VRPositionState.angularVelocity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint angularVelocity;
+
+  @DomName('VRPositionState.linearAcceleration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint linearAcceleration;
+
+  @DomName('VRPositionState.linearVelocity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint linearVelocity;
+
+  @DomName('VRPositionState.orientation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint orientation;
+
+  @DomName('VRPositionState.position')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint position;
+
+  @DomName('VRPositionState.timeStamp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double timeStamp;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('ValidityState')
 @Native("ValidityState")
 class ValidityState extends Interceptor {
@@ -31111,6 +33881,11 @@
   @DocsEditable()
   final bool tooLong;
 
+  @DomName('ValidityState.tooShort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool tooShort;
+
   @DomName('ValidityState.typeMismatch')
   @DocsEditable()
   final bool typeMismatch;
@@ -31357,12 +34132,14 @@
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  int line;
+  @Returns('num|String')
+  Object line;
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  int position;
+  @Returns('num|String')
+  Object position;
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
@@ -31372,7 +34149,7 @@
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int size;
+  num size;
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
@@ -31581,22 +34358,14 @@
 
   @DomName('WebSocket.WebSocket')
   @DocsEditable()
-  factory WebSocket(String url, [protocol_OR_protocols]) {
-    if ((url is String || url == null) && protocol_OR_protocols == null) {
-      return WebSocket._create_1(url);
+  factory WebSocket(String url, [Object protocols]) {
+    if (protocols != null) {
+      return WebSocket._create_1(url, protocols);
     }
-    if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return WebSocket._create_2(url, protocol_OR_protocols);
-    }
-    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
-      List protocols_1 = convertDartToNative_StringArray(protocol_OR_protocols);
-      return WebSocket._create_3(url, protocols_1);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return WebSocket._create_2(url);
   }
-  static WebSocket _create_1(url) => JS('WebSocket', 'new WebSocket(#)', url);
-  static WebSocket _create_2(url, protocol_OR_protocols) => JS('WebSocket', 'new WebSocket(#,#)', url, protocol_OR_protocols);
-  static WebSocket _create_3(url, protocol_OR_protocols) => JS('WebSocket', 'new WebSocket(#,#)', url, protocol_OR_protocols);
+  static WebSocket _create_1(url, protocols) => JS('WebSocket', 'new WebSocket(#,#)', url, protocols);
+  static WebSocket _create_2(url) => JS('WebSocket', 'new WebSocket(#)', url);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', 'typeof window.WebSocket != "undefined"');
@@ -31771,8 +34540,18 @@
 
   }
 
-  // To suppress missing implicit constructor warnings.
-  factory WheelEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WheelEvent.WheelEvent')
+  @DocsEditable()
+  factory WheelEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return WheelEvent._create_1(type, eventInitDict_1);
+    }
+    return WheelEvent._create_2(type);
+  }
+  static WheelEvent _create_1(type, eventInitDict) => JS('WheelEvent', 'new WheelEvent(#,#)', type, eventInitDict);
+  static WheelEvent _create_2(type) => JS('WheelEvent', 'new WheelEvent(#)', type);
 
   @DomName('WheelEvent.DOM_DELTA_LINE')
   @DocsEditable()
@@ -32037,7 +34816,7 @@
    * for the animation to continue.
    */
   @DomName('Window.requestAnimationFrame')
-  int requestAnimationFrame(RequestAnimationFrameCallback callback) {
+  int requestAnimationFrame(FrameRequestCallback callback) {
     _ensureRequestAnimationFrame();
     return _requestAnimationFrame(_wrapZone(callback));
   }
@@ -32056,7 +34835,7 @@
   }
 
   @JSName('requestAnimationFrame')
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback) native;
+  int _requestAnimationFrame(FrameRequestCallback callback) native;
 
   @JSName('cancelAnimationFrame')
   void _cancelAnimationFrame(int id) native;
@@ -32332,18 +35111,6 @@
   @Experimental()
   static const int TEMPORARY = 0;
 
-  @JSName('CSS')
-  /**
-   * Entrypoint for CSS-related functions.
-   *
-   * ## Other resources
-   *
-   * * [The CSS interface](http://dev.w3.org/csswg/css-conditional/#the-css-interface) from W3C.
-   */
-  @DomName('Window.CSS')
-  @DocsEditable()
-  final Css css;
-
   /**
    * The application cache for this window.
    *
@@ -32360,6 +35127,11 @@
   @DocsEditable()
   final ApplicationCache applicationCache;
 
+  @DomName('Window.caches')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CacheStorage caches;
+
   @DomName('Window.closed')
   @DocsEditable()
   final bool closed;
@@ -32896,6 +35668,27 @@
   @DocsEditable()
   bool confirm([String message]) native;
 
+  @DomName('Window.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future fetch(/*RequestInfo*/ input, [Map init]) {
+    if (init != null) {
+      var init_1 = convertDartToNative_Dictionary(init);
+      return _fetch_1(input, init_1);
+    }
+    return _fetch_2(input);
+  }
+  @JSName('fetch')
+  @DomName('Window.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _fetch_1(input, init) native;
+  @JSName('fetch')
+  @DomName('Window.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _fetch_2(input) native;
+
   /**
    * Finds text in this window.
    *
@@ -32912,7 +35705,7 @@
   @JSName('getComputedStyle')
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) native;
+  CssStyleDeclaration _getComputedStyle(Element elt, String pseudoElt) native;
 
   @JSName('getMatchedCSSRules')
   /**
@@ -32965,12 +35758,12 @@
    */
   @DomName('Window.moveBy')
   @DocsEditable()
-  void moveBy(num x, num y) native;
+  void moveBy(int x, int y) native;
 
   @JSName('moveTo')
   @DomName('Window.moveTo')
   @DocsEditable()
-  void _moveTo(num x, num y) native;
+  void _moveTo(int x, int y) native;
 
   /// *Deprecated.*
   @DomName('Window.openDatabase')
@@ -32985,7 +35778,7 @@
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> transfer]) {
+  void postMessage(/*any*/ message, String targetOrigin, [List<MessagePort> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, targetOrigin, transfer);
@@ -33026,7 +35819,7 @@
    */
   @DomName('Window.resizeBy')
   @DocsEditable()
-  void resizeBy(num x, num y) native;
+  void resizeBy(int x, int y) native;
 
   /**
    * Resizes this window to a specific width and height.
@@ -33038,7 +35831,7 @@
    */
   @DomName('Window.resizeTo')
   @DocsEditable()
-  void resizeTo(num width, num height) native;
+  void resizeTo(int x, int y) native;
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -33052,23 +35845,27 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void scroll(x, y, [Map scrollOptions]) {
-    if ((y is num) && (x is num) && scrollOptions == null) {
-      _scroll_1(x, y);
+  void scroll([options_OR_x, y, Map scrollOptions]) {
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      _scroll_1();
       return;
     }
-    if (scrollOptions != null && (y is num) && (x is num)) {
+    if ((options_OR_x is Map) && y == null && scrollOptions == null) {
+      var options_1 = convertDartToNative_Dictionary(options_OR_x);
+      _scroll_2(options_1);
+      return;
+    }
+    if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
+      _scroll_3(options_OR_x, y);
+      return;
+    }
+    if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
+      _scroll_4(options_OR_x, y);
+      return;
+    }
+    if (scrollOptions != null && (y is int) && (options_OR_x is int)) {
       var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
-      _scroll_2(x, y, scrollOptions_1);
-      return;
-    }
-    if ((y is int) && (x is int) && scrollOptions == null) {
-      _scroll_3(x, y);
-      return;
-    }
-    if (scrollOptions != null && (y is int) && (x is int)) {
-      var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
-      _scroll_4(x, y, scrollOptions_1);
+      _scroll_5(options_OR_x, y, scrollOptions_1);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -33086,7 +35883,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_1(num x, num y) native;
+  void _scroll_1() native;
   @JSName('scroll')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -33100,7 +35897,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_2(num x, num y, scrollOptions) native;
+  void _scroll_2(options) native;
   @JSName('scroll')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -33114,7 +35911,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_3(int x, int y) native;
+  void _scroll_3(num x, num y) native;
   @JSName('scroll')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -33128,7 +35925,21 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_4(int x, int y, scrollOptions) native;
+  void _scroll_4(int x, int y) native;
+  @JSName('scroll')
+  /**
+   * Scrolls the page horizontally and vertically to a specific point.
+   *
+   * This method is identical to [scrollTo].
+   *
+   * ## Other resources
+   *
+   * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
+   *   from WebPlatform.org.
+   */
+  @DomName('Window.scroll')
+  @DocsEditable()
+  void _scroll_5(int x, int y, scrollOptions) native;
 
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -33140,23 +35951,27 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void scrollBy(x, y, [Map scrollOptions]) {
-    if ((y is num) && (x is num) && scrollOptions == null) {
-      _scrollBy_1(x, y);
+  void scrollBy([options_OR_x, y, Map scrollOptions]) {
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      _scrollBy_1();
       return;
     }
-    if (scrollOptions != null && (y is num) && (x is num)) {
+    if ((options_OR_x is Map) && y == null && scrollOptions == null) {
+      var options_1 = convertDartToNative_Dictionary(options_OR_x);
+      _scrollBy_2(options_1);
+      return;
+    }
+    if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
+      _scrollBy_3(options_OR_x, y);
+      return;
+    }
+    if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
+      _scrollBy_4(options_OR_x, y);
+      return;
+    }
+    if (scrollOptions != null && (y is int) && (options_OR_x is int)) {
       var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
-      _scrollBy_2(x, y, scrollOptions_1);
-      return;
-    }
-    if ((y is int) && (x is int) && scrollOptions == null) {
-      _scrollBy_3(x, y);
-      return;
-    }
-    if (scrollOptions != null && (y is int) && (x is int)) {
-      var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
-      _scrollBy_4(x, y, scrollOptions_1);
+      _scrollBy_5(options_OR_x, y, scrollOptions_1);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -33172,7 +35987,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_1(num x, num y) native;
+  void _scrollBy_1() native;
   @JSName('scrollBy')
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -33184,7 +35999,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_2(num x, num y, scrollOptions) native;
+  void _scrollBy_2(options) native;
   @JSName('scrollBy')
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -33196,7 +36011,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_3(int x, int y) native;
+  void _scrollBy_3(num x, num y) native;
   @JSName('scrollBy')
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -33208,7 +36023,19 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_4(int x, int y, scrollOptions) native;
+  void _scrollBy_4(int x, int y) native;
+  @JSName('scrollBy')
+  /**
+   * Scrolls the page horizontally and vertically by an offset.
+   *
+   * ## Other resources
+   *
+   * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
+   *   from WebPlatform.org.
+   */
+  @DomName('Window.scrollBy')
+  @DocsEditable()
+  void _scrollBy_5(int x, int y, scrollOptions) native;
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -33222,23 +36049,27 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void scrollTo(x, y, [Map scrollOptions]) {
-    if ((y is num) && (x is num) && scrollOptions == null) {
-      _scrollTo_1(x, y);
+  void scrollTo([options_OR_x, y, Map scrollOptions]) {
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      _scrollTo_1();
       return;
     }
-    if (scrollOptions != null && (y is num) && (x is num)) {
+    if ((options_OR_x is Map) && y == null && scrollOptions == null) {
+      var options_1 = convertDartToNative_Dictionary(options_OR_x);
+      _scrollTo_2(options_1);
+      return;
+    }
+    if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
+      _scrollTo_3(options_OR_x, y);
+      return;
+    }
+    if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
+      _scrollTo_4(options_OR_x, y);
+      return;
+    }
+    if (scrollOptions != null && (y is int) && (options_OR_x is int)) {
       var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
-      _scrollTo_2(x, y, scrollOptions_1);
-      return;
-    }
-    if ((y is int) && (x is int) && scrollOptions == null) {
-      _scrollTo_3(x, y);
-      return;
-    }
-    if (scrollOptions != null && (y is int) && (x is int)) {
-      var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
-      _scrollTo_4(x, y, scrollOptions_1);
+      _scrollTo_5(options_OR_x, y, scrollOptions_1);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -33256,7 +36087,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_1(num x, num y) native;
+  void _scrollTo_1() native;
   @JSName('scrollTo')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -33270,7 +36101,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_2(num x, num y, scrollOptions) native;
+  void _scrollTo_2(options) native;
   @JSName('scrollTo')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -33284,7 +36115,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_3(int x, int y) native;
+  void _scrollTo_3(num x, num y) native;
   @JSName('scrollTo')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -33298,21 +36129,21 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_4(int x, int y, scrollOptions) native;
-
+  void _scrollTo_4(int x, int y) native;
+  @JSName('scrollTo')
   /**
-   * Opens a new page as a modal dialog.
+   * Scrolls the page horizontally and vertically to a specific point.
+   *
+   * This method is identical to [scroll].
    *
    * ## Other resources
    *
-   * * [Dialogs implemented using separate
-   *   documents](http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)
-   *   from W3C.
+   * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
+   *   from WebPlatform.org.
    */
-  @DomName('Window.showModalDialog')
+  @DomName('Window.scrollTo')
   @DocsEditable()
-  @Creates('Null')
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native;
+  void _scrollTo_5(int x, int y, scrollOptions) native;
 
   /**
    * Stops the window from loading.
@@ -33393,33 +36224,43 @@
 
   @DomName('Window.atob')
   @DocsEditable()
-  String atob(String string) native;
+  String atob(String atob) native;
 
   @DomName('Window.btoa')
   @DocsEditable()
-  String btoa(String string) native;
+  String btoa(String btoa) native;
 
   // From WindowTimers
 
-  @JSName('clearInterval')
-  @DomName('Window.clearInterval')
-  @DocsEditable()
-  void _clearInterval(int handle) native;
-
-  @JSName('clearTimeout')
-  @DomName('Window.clearTimeout')
-  @DocsEditable()
-  void _clearTimeout(int handle) native;
-
   @JSName('setInterval')
   @DomName('Window.setInterval')
   @DocsEditable()
-  int _setInterval(Object handler, int timeout) native;
+  int _setInterval_String(String handler, [int timeout, Object arguments]) native;
 
   @JSName('setTimeout')
   @DomName('Window.setTimeout')
   @DocsEditable()
-  int _setTimeout(Object handler, int timeout) native;
+  int _setTimeout_String(String handler, [int timeout, Object arguments]) native;
+
+  @JSName('clearInterval')
+  @DomName('Window.clearInterval')
+  @DocsEditable()
+  void _clearInterval([int handle]) native;
+
+  @JSName('clearTimeout')
+  @DomName('Window.clearTimeout')
+  @DocsEditable()
+  void _clearTimeout([int handle]) native;
+
+  @JSName('setInterval')
+  @DomName('Window.setInterval')
+  @DocsEditable()
+  int _setInterval(Object handler, [int timeout]) native;
+
+  @JSName('setTimeout')
+  @DomName('Window.setTimeout')
+  @DocsEditable()
+  int _setTimeout(Object handler, [int timeout]) native;
 
   /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
@@ -33928,9 +36769,37 @@
   // To suppress missing implicit constructor warnings.
   factory WindowBase64._() { throw new UnsupportedError("Not supported"); }
 
-  String atob(String string);
+  String atob(String atob);
 
-  String btoa(String string);
+  String btoa(String btoa);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WindowClient')
+@Experimental() // untriaged
+@Native("WindowClient")
+class WindowClient extends Client {
+  // To suppress missing implicit constructor warnings.
+  factory WindowClient._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WindowClient.focused')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool focused;
+
+  @DomName('WindowClient.visibilityState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String visibilityState;
+
+  @DomName('WindowClient.focus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future focus() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34146,6 +37015,11 @@
   @Experimental() // untriaged
   static const int TEMPORARY = 0;
 
+  @DomName('WorkerGlobalScope.caches')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CacheStorage caches;
+
   @DomName('WorkerGlobalScope.console')
   @DocsEditable()
   @Experimental() // untriaged
@@ -34186,6 +37060,27 @@
   @Experimental() // untriaged
   void close() native;
 
+  @DomName('WorkerGlobalScope.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future fetch(/*RequestInfo*/ input, [Map init]) {
+    if (init != null) {
+      var init_1 = convertDartToNative_Dictionary(init);
+      return _fetch_1(input, init_1);
+    }
+    return _fetch_2(input);
+  }
+  @JSName('fetch')
+  @DomName('WorkerGlobalScope.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _fetch_1(input, init) native;
+  @JSName('fetch')
+  @DomName('WorkerGlobalScope.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _fetch_2(input) native;
+
   @DomName('WorkerGlobalScope.importScripts')
   @DocsEditable()
   @Experimental() // untriaged
@@ -34250,38 +37145,50 @@
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) native;
+  String atob(String atob) native;
 
   @DomName('WorkerGlobalScope.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) native;
+  String btoa(String btoa) native;
 
   // From WindowTimers
 
-  @JSName('clearInterval')
-  @DomName('WorkerGlobalScope.clearInterval')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void _clearInterval(int handle) native;
-
-  @JSName('clearTimeout')
-  @DomName('WorkerGlobalScope.clearTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void _clearTimeout(int handle) native;
-
   @JSName('setInterval')
   @DomName('WorkerGlobalScope.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) native;
+  int _setInterval_String(String handler, [int timeout, Object arguments]) native;
 
   @JSName('setTimeout')
   @DomName('WorkerGlobalScope.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) native;
+  int _setTimeout_String(String handler, [int timeout, Object arguments]) native;
+
+  @JSName('clearInterval')
+  @DomName('WorkerGlobalScope.clearInterval')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _clearInterval([int handle]) native;
+
+  @JSName('clearTimeout')
+  @DomName('WorkerGlobalScope.clearTimeout')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _clearTimeout([int handle]) native;
+
+  @JSName('setInterval')
+  @DomName('WorkerGlobalScope.setInterval')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int _setInterval(Object handler, [int timeout]) native;
+
+  @JSName('setTimeout')
+  @DomName('WorkerGlobalScope.setTimeout')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int _setTimeout(Object handler, [int timeout]) native;
 
   /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
@@ -34298,7 +37205,7 @@
 @DomName('WorkerPerformance')
 @Experimental() // untriaged
 @Native("WorkerPerformance")
-class WorkerPerformance extends Interceptor {
+class WorkerPerformance extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory WorkerPerformance._() { throw new UnsupportedError("Not supported"); }
 
@@ -34307,10 +37214,63 @@
   @Experimental() // untriaged
   final MemoryInfo memory;
 
+  @DomName('WorkerPerformance.clearMarks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearMarks(String markName) native;
+
+  @DomName('WorkerPerformance.clearMeasures')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearMeasures(String measureName) native;
+
+  @DomName('WorkerPerformance.getEntries')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<PerformanceEntry> getEntries() native;
+
+  @DomName('WorkerPerformance.getEntriesByName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) native;
+
+  @DomName('WorkerPerformance.getEntriesByType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<PerformanceEntry> getEntriesByType(String entryType) native;
+
+  @DomName('WorkerPerformance.mark')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void mark(String markName) native;
+
+  @DomName('WorkerPerformance.measure')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void measure(String measureName, String startMark, String endMark) native;
+
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
   double now() native;
+
+  @JSName('webkitClearResourceTimings')
+  @DomName('WorkerPerformance.webkitClearResourceTimings')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  void clearResourceTimings() native;
+
+  @JSName('webkitSetResourceTimingBufferSize')
+  @DomName('WorkerPerformance.webkitSetResourceTimingBufferSize')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  void setResourceTimingBufferSize(int maxSize) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34343,7 +37303,7 @@
 
   @DomName('XPathEvaluator.evaluate')
   @DocsEditable()
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native;
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, [int type, Object inResult]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34361,7 +37321,7 @@
 
   @DomName('XPathExpression.evaluate')
   @DocsEditable()
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native;
+  XPathResult evaluate(Node contextNode, [int type, Object inResult]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34508,7 +37468,7 @@
 
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
-  String serializeToString(Node node) native;
+  String serializeToString(Node root) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34546,7 +37506,7 @@
 
   @DomName('XSLTProcessor.importStylesheet')
   @DocsEditable()
-  void importStylesheet(Node stylesheet) native;
+  void importStylesheet(Node style) native;
 
   @DomName('XSLTProcessor.removeParameter')
   @DocsEditable()
@@ -34566,7 +37526,7 @@
 
   @DomName('XSLTProcessor.transformToFragment')
   @DocsEditable()
-  DocumentFragment transformToFragment(Node source, Document docVal) native;
+  DocumentFragment transformToFragment(Node source, Document output) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34610,48 +37570,6 @@
 
 
 @DocsEditable()
-@DomName('CSSPrimitiveValue')
-// http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
-@deprecated // deprecated
-@Native("CSSPrimitiveValue")
-abstract class _CSSPrimitiveValue extends _CSSValue {
-  // To suppress missing implicit constructor warnings.
-  factory _CSSPrimitiveValue._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('CSSUnknownRule')
-// http://dev.w3.org/csswg/cssom/#the-cssstylesheet-interface
-@deprecated // deprecated
-@Native("CSSUnknownRule")
-abstract class _CSSUnknownRule extends CssRule {
-  // To suppress missing implicit constructor warnings.
-  factory _CSSUnknownRule._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('CSSValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-@Native("CSSValue")
-abstract class _CSSValue extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _CSSValue._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('Cache')
 @Experimental() // untriaged
 @Native("Cache")
@@ -34842,7 +37760,7 @@
 @DocsEditable()
 @DomName('ClientRectList')
 @Native("ClientRectList,DOMRectList")
-class _ClientRectList extends Interceptor with ListMixin<Rectangle>, ImmutableListMixin<Rectangle> implements List<Rectangle>, JavaScriptIndexingBehavior {
+class _ClientRectList extends Interceptor with ListMixin<Rectangle>, ImmutableListMixin<Rectangle> implements List<Rectangle> {
   // To suppress missing implicit constructor warnings.
   factory _ClientRectList._() { throw new UnsupportedError("Not supported"); }
 
@@ -34854,7 +37772,7 @@
     if (JS("bool", "# >>> 0 !== # || # >= #", index,
         index, index, length))
       throw new RangeError.index(index, this);
-    return JS("Rectangle", "#[#]", this, index);
+    return this.item(index);
   }
   void operator[]=(int index, Rectangle value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -34894,6 +37812,11 @@
   Rectangle elementAt(int index) => this[index];
   // -- end List<Rectangle> mixins.
 
+  @DomName('ClientRectList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Rectangle __getter__(int index) native;
+
   @DomName('ClientRectList.item')
   @DocsEditable()
   Rectangle item(int index) native;
@@ -34904,20 +37827,6 @@
 
 
 @DocsEditable()
-@DomName('Counter')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-@Native("Counter")
-abstract class _Counter extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _Counter._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('CSSRuleList')
 @Native("CSSRuleList")
 class _CssRuleList extends Interceptor with ListMixin<CssRule>, ImmutableListMixin<CssRule> implements JavaScriptIndexingBehavior, List<CssRule> {
@@ -34982,72 +37891,6 @@
 
 
 @DocsEditable()
-@DomName('CSSValueList')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-@Native("CSSValueList")
-class _CssValueList extends _CSSValue with ListMixin<_CSSValue>, ImmutableListMixin<_CSSValue> implements JavaScriptIndexingBehavior, List<_CSSValue> {
-  // To suppress missing implicit constructor warnings.
-  factory _CssValueList._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('CSSValueList.length')
-  @DocsEditable()
-  int get length => JS("int", "#.length", this);
-
-  _CSSValue operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
-      throw new RangeError.index(index, this);
-    return JS("_CSSValue", "#[#]", this, index);
-  }
-  void operator[]=(int index, _CSSValue value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<_CSSValue> mixins.
-  // _CSSValue is the element type.
-
-
-  set length(int value) {
-    throw new UnsupportedError("Cannot resize immutable List.");
-  }
-
-  _CSSValue get first {
-    if (this.length > 0) {
-      return JS('_CSSValue', '#[0]', this);
-    }
-    throw new StateError("No elements");
-  }
-
-  _CSSValue get last {
-    int len = this.length;
-    if (len > 0) {
-      return JS('_CSSValue', '#[#]', this, len - 1);
-    }
-    throw new StateError("No elements");
-  }
-
-  _CSSValue get single {
-    int len = this.length;
-    if (len == 1) {
-      return JS('_CSSValue', '#[0]', this);
-    }
-    if (len == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  _CSSValue elementAt(int index) => this[index];
-  // -- end List<_CSSValue> mixins.
-
-  @DomName('CSSValueList.item')
-  @DocsEditable()
-  _CSSValue item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('DOMFileSystemSync')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
@@ -35522,37 +38365,33 @@
   Node elementAt(int index) => this[index];
   // -- end List<Node> mixins.
 
-  @DomName('NamedNodeMap.__getter__')
-  @DocsEditable()
-  Node __getter__(String name) native;
-
   @DomName('NamedNodeMap.getNamedItem')
   @DocsEditable()
-  Node getNamedItem(String name) native;
+  _Attr getNamedItem(String name) native;
 
   @DomName('NamedNodeMap.getNamedItemNS')
   @DocsEditable()
-  Node getNamedItemNS(String namespaceURI, String localName) native;
+  _Attr getNamedItemNS(String namespaceURI, String localName) native;
 
   @DomName('NamedNodeMap.item')
   @DocsEditable()
-  Node item(int index) native;
+  _Attr item(int index) native;
 
   @DomName('NamedNodeMap.removeNamedItem')
   @DocsEditable()
-  Node removeNamedItem(String name) native;
+  _Attr removeNamedItem(String name) native;
 
   @DomName('NamedNodeMap.removeNamedItemNS')
   @DocsEditable()
-  Node removeNamedItemNS(String namespaceURI, String localName) native;
+  _Attr removeNamedItemNS(String namespaceURI, String localName) native;
 
   @DomName('NamedNodeMap.setNamedItem')
   @DocsEditable()
-  Node setNamedItem(Node node) native;
+  _Attr setNamedItem(_Attr attr) native;
 
   @DomName('NamedNodeMap.setNamedItemNS')
   @DocsEditable()
-  Node setNamedItemNS(Node node) native;
+  _Attr setNamedItemNS(_Attr attr) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -35567,20 +38406,6 @@
   // To suppress missing implicit constructor warnings.
   factory _PagePopupController._() { throw new UnsupportedError("Not supported"); }
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('RGBColor')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-@Native("RGBColor")
-abstract class _RGBColor extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _RGBColor._() { throw new UnsupportedError("Not supported"); }
-}
 // 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.
@@ -35596,20 +38421,6 @@
 
 
 @DocsEditable()
-@DomName('Rect')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-@Native("Rect")
-abstract class _Rect extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _Rect._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('Request')
 @Experimental() // untriaged
 @Native("Request")
@@ -35619,27 +38430,20 @@
 
   @DomName('Request.Request')
   @DocsEditable()
-  factory _Request(input, [Map requestInitDict]) {
-    if ((input is String || input == null) && requestInitDict == null) {
-      return _Request._create_1(input);
-    }
-    if ((requestInitDict is Map || requestInitDict == null) && (input is String || input == null)) {
+  factory _Request(Object input, [Map requestInitDict]) {
+    if (requestInitDict != null) {
       var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
-      return _Request._create_2(input, requestInitDict_1);
+      return _Request._create_1(input, requestInitDict_1);
     }
-    if ((input is _Request || input == null) && requestInitDict == null) {
-      return _Request._create_3(input);
-    }
-    if ((requestInitDict is Map || requestInitDict == null) && (input is _Request || input == null)) {
-      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
-      return _Request._create_4(input, requestInitDict_1);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return _Request._create_2(input);
   }
-  static _Request _create_1(input) => JS('_Request', 'new Request(#)', input);
-  static _Request _create_2(input, requestInitDict) => JS('_Request', 'new Request(#,#)', input, requestInitDict);
-  static _Request _create_3(input) => JS('_Request', 'new Request(#)', input);
-  static _Request _create_4(input, requestInitDict) => JS('_Request', 'new Request(#,#)', input, requestInitDict);
+  static _Request _create_1(input, requestInitDict) => JS('_Request', 'new Request(#,#)', input, requestInitDict);
+  static _Request _create_2(input) => JS('_Request', 'new Request(#)', input);
+
+  @DomName('Request.context')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String context;
 
   @DomName('Request.credentials')
   @DocsEditable()
@@ -35686,45 +38490,19 @@
 
   @DomName('Response.Response')
   @DocsEditable()
-  factory _Response(body_OR_input, [Map requestInitDict_OR_responseInitDict]) {
-    if ((body_OR_input is String || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return _Response._create_1(body_OR_input);
+  factory _Response([Object body, Map responseInitDict]) {
+    if (responseInitDict != null) {
+      var responseInitDict_1 = convertDartToNative_Dictionary(responseInitDict);
+      return _Response._create_1(body, responseInitDict_1);
     }
-    if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is String || body_OR_input == null)) {
-      var responseInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
-      return _Response._create_2(body_OR_input, responseInitDict_1);
+    if (body != null) {
+      return _Response._create_2(body);
     }
-    if ((body_OR_input is Blob || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return _Response._create_3(body_OR_input);
-    }
-    if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is Blob || body_OR_input == null)) {
-      var responseInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
-      return _Response._create_4(body_OR_input, responseInitDict_1);
-    }
-    if ((body_OR_input is TypedData || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return _Response._create_5(body_OR_input);
-    }
-    if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is TypedData || body_OR_input == null)) {
-      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
-      return _Response._create_6(body_OR_input, requestInitDict_1);
-    }
-    if ((body_OR_input is ByteBuffer || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return _Response._create_7(body_OR_input);
-    }
-    if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is ByteBuffer || body_OR_input == null)) {
-      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
-      return _Response._create_8(body_OR_input, requestInitDict_1);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return _Response._create_3();
   }
-  static _Response _create_1(body_OR_input) => JS('_Response', 'new Response(#)', body_OR_input);
-  static _Response _create_2(body_OR_input, requestInitDict_OR_responseInitDict) => JS('_Response', 'new Response(#,#)', body_OR_input, requestInitDict_OR_responseInitDict);
-  static _Response _create_3(body_OR_input) => JS('_Response', 'new Response(#)', body_OR_input);
-  static _Response _create_4(body_OR_input, requestInitDict_OR_responseInitDict) => JS('_Response', 'new Response(#,#)', body_OR_input, requestInitDict_OR_responseInitDict);
-  static _Response _create_5(body_OR_input) => JS('_Response', 'new Response(#)', body_OR_input);
-  static _Response _create_6(body_OR_input, requestInitDict_OR_responseInitDict) => JS('_Response', 'new Response(#,#)', body_OR_input, requestInitDict_OR_responseInitDict);
-  static _Response _create_7(body_OR_input) => JS('_Response', 'new Response(#)', body_OR_input);
-  static _Response _create_8(body_OR_input, requestInitDict_OR_responseInitDict) => JS('_Response', 'new Response(#,#)', body_OR_input, requestInitDict_OR_responseInitDict);
+  static _Response _create_1(body, responseInitDict) => JS('_Response', 'new Response(#,#)', body, responseInitDict);
+  static _Response _create_2(body) => JS('_Response', 'new Response(#)', body);
+  static _Response _create_3() => JS('_Response', 'new 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
@@ -35894,20 +38672,6 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSFilterValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-@Native("WebKitCSSFilterValue")
-abstract class _WebKitCSSFilterValue extends _CssValueList {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitCSSFilterValue._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('WebKitCSSMatrix')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -35936,33 +38700,23 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSTransformValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-@Native("WebKitCSSTransformValue")
-abstract class _WebKitCSSTransformValue extends _CssValueList {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitCSSTransformValue._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('WindowTimers')
 @Experimental() // untriaged
 abstract class _WindowTimers extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory _WindowTimers._() { throw new UnsupportedError("Not supported"); }
 
-  void _clearInterval(int handle);
+  int _setInterval_String(String handler, [int timeout, Object arguments]);
 
-  void _clearTimeout(int handle);
+  int _setTimeout_String(String handler, [int timeout, Object arguments]);
 
-  int _setInterval(Object handler, int timeout);
+  void _clearInterval([int handle]);
 
-  int _setTimeout(Object handler, int timeout);
+  void _clearTimeout([int handle]);
+
+  int _setInterval(Object handler, [int timeout]);
+
+  int _setTimeout(Object handler, [int timeout]);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -40419,22 +43173,22 @@
   /** The "fixed" value of whether the alt key is being pressed. */
   bool _shadowAltKey;
 
-  /** Caculated value of what the estimated charCode is for this event. */
+  /** Calculated value of what the estimated charCode is for this event. */
   int _shadowCharCode;
 
-  /** Caculated value of what the estimated keyCode is for this event. */
+  /** Calculated value of what the estimated keyCode is for this event. */
   int _shadowKeyCode;
 
-  /** Caculated value of what the estimated keyCode is for this event. */
+  /** Calculated 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. */
+  /** Calculated 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. */
+  /** Calculated 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. */
+  /** Calculated value of what the estimated keyCode is for this event. */
   int get which => keyCode;
 
   /** Accessor to the underlying keyCode value is the parent event. */
@@ -40571,23 +43325,22 @@
   static EventStreamProvider<KeyEvent> keyPressEvent =
       new _KeyboardEventHandler('keypress');
 
-  /** Accessor to the clipboardData available for this event. */
-  DataTransfer get clipboardData => _parent.clipboardData;
+  String get code => _parent.code;
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
   int get detail => _parent.detail;
+  String get key => _parent.key;
   /**
    * Accessor to the part of the keyboard that the key was pressed from (one of
    * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
    * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
    */
   int get keyLocation => _parent.keyLocation;
-  Point get layer => _parent.layer;
   /** True if the Meta (or Mac command) key is pressed during this event. */
   bool get metaKey => _parent.metaKey;
-  Point get page => _parent.page;
   /** True if the shift key was pressed during this event. */
   bool get shiftKey => _parent.shiftKey;
+  InputDevice get sourceDevice => _parent.sourceDevice;
   Window get view => _parent.view;
   void _initUIEvent(String type, bool canBubble, bool cancelable,
       Window view, int detail) {
@@ -40597,6 +43350,8 @@
 
   int get _charCode => charCode;
   int get _keyCode => keyCode;
+  int get _which => which;
+
   String get _keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
@@ -40606,10 +43361,6 @@
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
-  int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
   @Experimental() // untriaged
   bool getModifierState(String keyArgument) => throw new UnimplementedError();
   @Experimental() // untriaged
@@ -40658,8 +43409,6 @@
 
   bool get cancelable => wrapped.cancelable;
 
-  DataTransfer get clipboardData => wrapped.clipboardData;
-
   EventTarget get currentTarget => wrapped.currentTarget;
 
   bool get defaultPrevented => wrapped.defaultPrevented;
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index c306d5b..bbb5d14 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -131,11 +131,12 @@
   'JsArray': () => js.JsArray,
   'AbstractWorker': () => AbstractWorker,
   'Animation': () => Animation,
-  'AnimationEffect': () => AnimationEffect,
-  'AnimationNode': () => AnimationNode,
-  'AnimationPlayer': () => AnimationPlayer,
+  'AnimationEffectReadOnly': () => AnimationEffectReadOnly,
+  'AnimationEffectTiming': () => AnimationEffectTiming,
+  'AnimationEvent': () => AnimationEvent,
   'AnimationPlayerEvent': () => AnimationPlayerEvent,
   'AnimationTimeline': () => AnimationTimeline,
+  'AppBannerPromptResult': () => AppBannerPromptResult,
   'ApplicationCache': () => ApplicationCache,
   'ApplicationCacheErrorEvent': () => ApplicationCacheErrorEvent,
   'Attr': () => _Attr,
@@ -144,32 +145,36 @@
   'AutocompleteErrorEvent': () => AutocompleteErrorEvent,
   'BarProp': () => BarProp,
   'BatteryManager': () => BatteryManager,
+  'BeforeInstallPromptEvent': () => BeforeInstallPromptEvent,
   'BeforeUnloadEvent': () => BeforeUnloadEvent,
   'Blob': () => Blob,
+  'Bluetooth': () => Bluetooth,
+  'BluetoothDevice': () => BluetoothDevice,
+  'BluetoothGATTCharacteristic': () => BluetoothGattCharacteristic,
+  'BluetoothGATTRemoteServer': () => BluetoothGattRemoteServer,
+  'BluetoothGATTService': () => BluetoothGattService,
+  'BluetoothUUID': () => BluetoothUuid,
   'Body': () => Body,
   'CDATASection': () => CDataSection,
+  'CHROMIUMValuebuffer': () => ChromiumValuebuffer,
   'CSS': () => Css,
   'CSSCharsetRule': () => CssCharsetRule,
   'CSSFontFaceRule': () => CssFontFaceRule,
+  'CSSGroupingRule': () => CssGroupingRule,
   'CSSImportRule': () => CssImportRule,
   'CSSKeyframeRule': () => CssKeyframeRule,
   'CSSKeyframesRule': () => CssKeyframesRule,
   'CSSMediaRule': () => CssMediaRule,
   'CSSPageRule': () => CssPageRule,
-  'CSSPrimitiveValue': () => _CSSPrimitiveValue,
   'CSSRule': () => CssRule,
   'CSSRuleList': () => _CssRuleList,
   'CSSStyleDeclaration': () => CssStyleDeclaration,
   'CSSStyleRule': () => CssStyleRule,
   'CSSStyleSheet': () => CssStyleSheet,
   'CSSSupportsRule': () => CssSupportsRule,
-  'CSSUnknownRule': () => _CSSUnknownRule,
-  'CSSValue': () => _CSSValue,
-  'CSSValueList': () => _CssValueList,
   'CSSViewportRule': () => CssViewportRule,
   'Cache': () => _Cache,
   'CacheStorage': () => CacheStorage,
-  'Canvas2DContextAttributes': () => Canvas2DContextAttributes,
   'CanvasGradient': () => CanvasGradient,
   'CanvasPathMethods': () => _CanvasPathMethods,
   'CanvasPattern': () => CanvasPattern,
@@ -177,17 +182,24 @@
   'CharacterData': () => CharacterData,
   'ChildNode': () => ChildNode,
   'CircularGeofencingRegion': () => CircularGeofencingRegion,
+  'Client': () => Client,
   'ClientRect': () => _ClientRect,
   'ClientRectList': () => _ClientRectList,
+  'Clients': () => Clients,
+  'ClipboardEvent': () => ClipboardEvent,
   'CloseEvent': () => CloseEvent,
   'Comment': () => Comment,
   'CompositionEvent': () => CompositionEvent,
+  'CompositorProxy': () => CompositorProxy,
+  'CompositorWorker': () => CompositorWorker,
+  'CompositorWorkerGlobalScope': () => CompositorWorkerGlobalScope,
   'Console': () => Console,
   'ConsoleBase': () => ConsoleBase,
   'Coordinates': () => Coordinates,
-  'Counter': () => _Counter,
   'Credential': () => Credential,
   'CredentialsContainer': () => CredentialsContainer,
+  'CrossOriginConnectEvent': () => CrossOriginConnectEvent,
+  'CrossOriginServiceWorkerClient': () => CrossOriginServiceWorkerClient,
   'Crypto': () => Crypto,
   'CryptoKey': () => CryptoKey,
   'CustomEvent': () => CustomEvent,
@@ -211,6 +223,7 @@
   'DataTransferItem': () => DataTransferItem,
   'DataTransferItemList': () => DataTransferItemList,
   'DedicatedWorkerGlobalScope': () => DedicatedWorkerGlobalScope,
+  'DefaultSessionStartEvent': () => DefaultSessionStartEvent,
   'DeprecatedStorageInfo': () => DeprecatedStorageInfo,
   'DeprecatedStorageQuota': () => DeprecatedStorageQuota,
   'DeviceAcceleration': () => DeviceAcceleration,
@@ -225,6 +238,7 @@
   'Document': () => Document,
   'DocumentFragment': () => DocumentFragment,
   'DocumentType': () => _DocumentType,
+  'EffectModel': () => EffectModel,
   'Element': () => Element,
   'Entry': () => Entry,
   'EntrySync': () => _EntrySync,
@@ -254,10 +268,12 @@
   'GamepadEvent': () => GamepadEvent,
   'GamepadList': () => _GamepadList,
   'Geofencing': () => Geofencing,
+  'GeofencingEvent': () => GeofencingEvent,
   'GeofencingRegion': () => GeofencingRegion,
   'Geolocation': () => Geolocation,
   'Geoposition': () => Geoposition,
   'GlobalEventHandlers': () => GlobalEventHandlers,
+  'HMDVRDevice': () => HmdvrDevice,
   'HTMLAllCollection': () => _HTMLAllCollection,
   'HTMLAnchorElement': () => AnchorElement,
   'HTMLAppletElement': () => _HTMLAppletElement,
@@ -342,11 +358,10 @@
   'ImageBitmap': () => ImageBitmap,
   'ImageData': () => ImageData,
   'InjectedScriptHost': () => InjectedScriptHost,
-  'InputMethodContext': () => InputMethodContext,
-  'InstallEvent': () => InstallEvent,
+  'InputDevice': () => InputDevice,
   'Iterator': () => DomIterator,
   'KeyboardEvent': () => KeyboardEvent,
-  'LocalCredential': () => LocalCredential,
+  'KeyframeEffect': () => KeyframeEffect,
   'Location': () => Location,
   'MIDIAccess': () => MidiAccess,
   'MIDIConnectionEvent': () => MidiConnectionEvent,
@@ -358,16 +373,20 @@
   'MIDIPort': () => MidiPort,
   'MediaController': () => MediaController,
   'MediaDeviceInfo': () => MediaDeviceInfo,
+  'MediaDevices': () => MediaDevices,
+  'MediaEncryptedEvent': () => MediaEncryptedEvent,
   'MediaError': () => MediaError,
   'MediaKeyError': () => MediaKeyError,
   'MediaKeyEvent': () => MediaKeyEvent,
   'MediaKeyMessageEvent': () => MediaKeyMessageEvent,
-  'MediaKeyNeededEvent': () => MediaKeyNeededEvent,
   'MediaKeySession': () => MediaKeySession,
+  'MediaKeyStatusMap': () => MediaKeyStatusMap,
+  'MediaKeySystemAccess': () => MediaKeySystemAccess,
   'MediaKeys': () => MediaKeys,
   'MediaList': () => MediaList,
   'MediaQueryList': () => MediaQueryList,
   'MediaQueryListEvent': () => MediaQueryListEvent,
+  'MediaSession': () => MediaSession,
   'MediaSource': () => MediaSource,
   'MediaStream': () => MediaStream,
   'MediaStreamEvent': () => MediaStreamEvent,
@@ -390,37 +409,53 @@
   'NavigatorID': () => NavigatorID,
   'NavigatorLanguage': () => NavigatorLanguage,
   'NavigatorOnLine': () => NavigatorOnLine,
+  'NavigatorStorageUtils': () => NavigatorStorageUtils,
   'NavigatorUserMediaError': () => NavigatorUserMediaError,
   'NetworkInformation': () => NetworkInformation,
   'Node': () => Node,
   'NodeFilter': () => NodeFilter,
   'NodeIterator': () => NodeIterator,
   'NodeList': () => NodeList,
+  'NonDocumentTypeChildNode': () => NonDocumentTypeChildNode,
+  'NonElementParentNode': () => NonElementParentNode,
   'Notification': () => Notification,
-  'OverflowEvent': () => OverflowEvent,
+  'NotificationEvent': () => NotificationEvent,
   'PagePopupController': () => _PagePopupController,
   'PageTransitionEvent': () => PageTransitionEvent,
   'ParentNode': () => ParentNode,
+  'PasswordCredential': () => PasswordCredential,
   'Path2D': () => Path2D,
   'Performance': () => Performance,
+  'PerformanceCompositeTiming': () => PerformanceCompositeTiming,
   'PerformanceEntry': () => PerformanceEntry,
   'PerformanceMark': () => PerformanceMark,
   'PerformanceMeasure': () => PerformanceMeasure,
   'PerformanceNavigation': () => PerformanceNavigation,
+  'PerformanceRenderTiming': () => PerformanceRenderTiming,
   'PerformanceResourceTiming': () => PerformanceResourceTiming,
   'PerformanceTiming': () => PerformanceTiming,
+  'PeriodicSyncEvent': () => PeriodicSyncEvent,
+  'PeriodicSyncManager': () => PeriodicSyncManager,
+  'PeriodicSyncRegistration': () => PeriodicSyncRegistration,
+  'PermissionStatus': () => PermissionStatus,
+  'Permissions': () => Permissions,
   'Plugin': () => Plugin,
   'PluginArray': () => PluginArray,
   'PluginPlaceholderElement': () => PluginPlaceholderElement,
+  'PointerEvent': () => PointerEvent,
   'PopStateEvent': () => PopStateEvent,
   'PositionError': () => PositionError,
+  'PositionSensorVRDevice': () => PositionSensorVRDevice,
   'Presentation': () => Presentation,
+  'PresentationAvailability': () => PresentationAvailability,
+  'PresentationSession': () => PresentationSession,
   'ProcessingInstruction': () => ProcessingInstruction,
   'ProgressEvent': () => ProgressEvent,
+  'PromiseRejectionEvent': () => PromiseRejectionEvent,
   'PushEvent': () => PushEvent,
   'PushManager': () => PushManager,
-  'PushRegistration': () => PushRegistration,
-  'RGBColor': () => _RGBColor,
+  'PushMessageData': () => PushMessageData,
+  'PushSubscription': () => PushSubscription,
   'RTCDTMFSender': () => RtcDtmfSender,
   'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent,
   'RTCDataChannel': () => RtcDataChannel,
@@ -433,23 +468,29 @@
   'RTCStatsResponse': () => RtcStatsResponse,
   'RadioNodeList': () => _RadioNodeList,
   'Range': () => Range,
+  'ReadableByteStream': () => ReadableByteStream,
+  'ReadableByteStreamReader': () => ReadableByteStreamReader,
   'ReadableStream': () => ReadableStream,
-  'Rect': () => _Rect,
+  'ReadableStreamReader': () => ReadableStreamReader,
   'RelatedEvent': () => RelatedEvent,
   'Request': () => _Request,
   'ResourceProgressEvent': () => ResourceProgressEvent,
   'Response': () => _Response,
   'Screen': () => Screen,
   'ScreenOrientation': () => ScreenOrientation,
+  'ScrollState': () => ScrollState,
   'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent,
   'Selection': () => Selection,
+  'ServicePort': () => ServicePort,
+  'ServicePortCollection': () => ServicePortCollection,
+  'ServicePortConnectEvent': () => ServicePortConnectEvent,
   'ServiceWorker': () => _ServiceWorker,
-  'ServiceWorkerClient': () => ServiceWorkerClient,
-  'ServiceWorkerClients': () => ServiceWorkerClients,
   'ServiceWorkerContainer': () => ServiceWorkerContainer,
   'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope,
+  'ServiceWorkerMessageEvent': () => ServiceWorkerMessageEvent,
   'ServiceWorkerRegistration': () => ServiceWorkerRegistration,
   'ShadowRoot': () => ShadowRoot,
+  'SharedArrayBuffer': () => SharedArrayBuffer,
   'SharedWorker': () => SharedWorker,
   'SharedWorkerGlobalScope': () => SharedWorkerGlobalScope,
   'SourceBuffer': () => SourceBuffer,
@@ -467,6 +508,8 @@
   'SpeechSynthesisEvent': () => SpeechSynthesisEvent,
   'SpeechSynthesisUtterance': () => SpeechSynthesisUtterance,
   'SpeechSynthesisVoice': () => SpeechSynthesisVoice,
+  'StashedMessagePort': () => StashedMessagePort,
+  'StashedPortCollection': () => StashedPortCollection,
   'Storage': () => Storage,
   'StorageEvent': () => StorageEvent,
   'StorageInfo': () => StorageInfo,
@@ -476,6 +519,9 @@
   'StyleSheet': () => StyleSheet,
   'StyleSheetList': () => _StyleSheetList,
   'SubtleCrypto': () => _SubtleCrypto,
+  'SyncEvent': () => SyncEvent,
+  'SyncManager': () => SyncManager,
+  'SyncRegistration': () => SyncRegistration,
   'Text': () => Text,
   'TextEvent': () => TextEvent,
   'TextMetrics': () => TextMetrics,
@@ -484,10 +530,11 @@
   'TextTrackCueList': () => TextTrackCueList,
   'TextTrackList': () => TextTrackList,
   'TimeRanges': () => TimeRanges,
-  'Timing': () => Timing,
   'Touch': () => Touch,
   'TouchEvent': () => TouchEvent,
   'TouchList': () => TouchList,
+  'TrackDefault': () => TrackDefault,
+  'TrackDefaultList': () => TrackDefaultList,
   'TrackEvent': () => TrackEvent,
   'TransitionEvent': () => TransitionEvent,
   'TreeWalker': () => TreeWalker,
@@ -495,6 +542,10 @@
   'URL': () => Url,
   'URLUtils': () => UrlUtils,
   'URLUtilsReadOnly': () => UrlUtilsReadOnly,
+  'VRDevice': () => VRDevice,
+  'VREyeParameters': () => VREyeParameters,
+  'VRFieldOfView': () => VRFieldOfView,
+  'VRPositionState': () => VRPositionState,
   'VTTCue': () => VttCue,
   'VTTRegion': () => VttRegion,
   'VTTRegionList': () => VttRegionList,
@@ -502,15 +553,12 @@
   'VideoPlaybackQuality': () => VideoPlaybackQuality,
   'VideoTrack': () => VideoTrack,
   'VideoTrackList': () => VideoTrackList,
-  'WebKitAnimationEvent': () => AnimationEvent,
-  'WebKitCSSFilterRule': () => CssFilterRule,
-  'WebKitCSSFilterValue': () => _WebKitCSSFilterValue,
   'WebKitCSSMatrix': () => _WebKitCSSMatrix,
-  'WebKitCSSTransformValue': () => _WebKitCSSTransformValue,
   'WebSocket': () => WebSocket,
   'WheelEvent': () => WheelEvent,
   'Window': () => Window,
   'WindowBase64': () => WindowBase64,
+  'WindowClient': () => WindowClient,
   'WindowEventHandlers': () => WindowEventHandlers,
   'WindowTimers': () => _WindowTimers,
   'Worker': () => Worker,
@@ -625,11 +673,12 @@
 @Deprecated("Internal Use Only")
 final htmlBlinkFunctionMap = {
   'Animation': () => Animation.internalCreateAnimation,
-  'AnimationEffect': () => AnimationEffect.internalCreateAnimationEffect,
-  'AnimationNode': () => AnimationNode.internalCreateAnimationNode,
-  'AnimationPlayer': () => AnimationPlayer.internalCreateAnimationPlayer,
+  'AnimationEffectReadOnly': () => AnimationEffectReadOnly.internalCreateAnimationEffectReadOnly,
+  'AnimationEffectTiming': () => AnimationEffectTiming.internalCreateAnimationEffectTiming,
+  'AnimationEvent': () => AnimationEvent.internalCreateAnimationEvent,
   'AnimationPlayerEvent': () => AnimationPlayerEvent.internalCreateAnimationPlayerEvent,
   'AnimationTimeline': () => AnimationTimeline.internalCreateAnimationTimeline,
+  'AppBannerPromptResult': () => AppBannerPromptResult.internalCreateAppBannerPromptResult,
   'ApplicationCache': () => ApplicationCache.internalCreateApplicationCache,
   'ApplicationCacheErrorEvent': () => ApplicationCacheErrorEvent.internalCreateApplicationCacheErrorEvent,
   'Attr': () => _Attr.internalCreate_Attr,
@@ -638,48 +687,59 @@
   'AutocompleteErrorEvent': () => AutocompleteErrorEvent.internalCreateAutocompleteErrorEvent,
   'BarProp': () => BarProp.internalCreateBarProp,
   'BatteryManager': () => BatteryManager.internalCreateBatteryManager,
+  'BeforeInstallPromptEvent': () => BeforeInstallPromptEvent.internalCreateBeforeInstallPromptEvent,
   'BeforeUnloadEvent': () => BeforeUnloadEvent.internalCreateBeforeUnloadEvent,
   'Blob': () => Blob.internalCreateBlob,
+  'Bluetooth': () => Bluetooth.internalCreateBluetooth,
+  'BluetoothDevice': () => BluetoothDevice.internalCreateBluetoothDevice,
+  'BluetoothGATTCharacteristic': () => BluetoothGattCharacteristic.internalCreateBluetoothGattCharacteristic,
+  'BluetoothGATTRemoteServer': () => BluetoothGattRemoteServer.internalCreateBluetoothGattRemoteServer,
+  'BluetoothGATTService': () => BluetoothGattService.internalCreateBluetoothGattService,
+  'BluetoothUUID': () => BluetoothUuid.internalCreateBluetoothUuid,
   'Body': () => Body.internalCreateBody,
   'CDATASection': () => CDataSection.internalCreateCDataSection,
+  'CHROMIUMValuebuffer': () => ChromiumValuebuffer.internalCreateChromiumValuebuffer,
   'CSS': () => Css.internalCreateCss,
   'CSSCharsetRule': () => CssCharsetRule.internalCreateCssCharsetRule,
   'CSSFontFaceRule': () => CssFontFaceRule.internalCreateCssFontFaceRule,
+  'CSSGroupingRule': () => CssGroupingRule.internalCreateCssGroupingRule,
   'CSSImportRule': () => CssImportRule.internalCreateCssImportRule,
   'CSSKeyframeRule': () => CssKeyframeRule.internalCreateCssKeyframeRule,
   'CSSKeyframesRule': () => CssKeyframesRule.internalCreateCssKeyframesRule,
   'CSSMediaRule': () => CssMediaRule.internalCreateCssMediaRule,
   'CSSPageRule': () => CssPageRule.internalCreateCssPageRule,
-  'CSSPrimitiveValue': () => _CSSPrimitiveValue.internalCreate_CSSPrimitiveValue,
   'CSSRule': () => CssRule.internalCreateCssRule,
   'CSSRuleList': () => _CssRuleList.internalCreate_CssRuleList,
   'CSSStyleDeclaration': () => CssStyleDeclaration.internalCreateCssStyleDeclaration,
   'CSSStyleRule': () => CssStyleRule.internalCreateCssStyleRule,
   'CSSStyleSheet': () => CssStyleSheet.internalCreateCssStyleSheet,
   'CSSSupportsRule': () => CssSupportsRule.internalCreateCssSupportsRule,
-  'CSSUnknownRule': () => _CSSUnknownRule.internalCreate_CSSUnknownRule,
-  'CSSValue': () => _CSSValue.internalCreate_CSSValue,
-  'CSSValueList': () => _CssValueList.internalCreate_CssValueList,
   'CSSViewportRule': () => CssViewportRule.internalCreateCssViewportRule,
   'Cache': () => _Cache.internalCreate_Cache,
   'CacheStorage': () => CacheStorage.internalCreateCacheStorage,
-  'Canvas2DContextAttributes': () => Canvas2DContextAttributes.internalCreateCanvas2DContextAttributes,
   'CanvasGradient': () => CanvasGradient.internalCreateCanvasGradient,
   'CanvasPattern': () => CanvasPattern.internalCreateCanvasPattern,
   'CanvasRenderingContext2D': () => CanvasRenderingContext2D.internalCreateCanvasRenderingContext2D,
   'CharacterData': () => CharacterData.internalCreateCharacterData,
   'CircularGeofencingRegion': () => CircularGeofencingRegion.internalCreateCircularGeofencingRegion,
+  'Client': () => Client.internalCreateClient,
   'ClientRect': () => _ClientRect.internalCreate_ClientRect,
   'ClientRectList': () => _ClientRectList.internalCreate_ClientRectList,
+  'Clients': () => Clients.internalCreateClients,
+  'ClipboardEvent': () => ClipboardEvent.internalCreateClipboardEvent,
   'CloseEvent': () => CloseEvent.internalCreateCloseEvent,
   'Comment': () => Comment.internalCreateComment,
   'CompositionEvent': () => CompositionEvent.internalCreateCompositionEvent,
+  'CompositorProxy': () => CompositorProxy.internalCreateCompositorProxy,
+  'CompositorWorker': () => CompositorWorker.internalCreateCompositorWorker,
+  'CompositorWorkerGlobalScope': () => CompositorWorkerGlobalScope.internalCreateCompositorWorkerGlobalScope,
   'Console': () => Console.internalCreateConsole,
   'ConsoleBase': () => ConsoleBase.internalCreateConsoleBase,
   'Coordinates': () => Coordinates.internalCreateCoordinates,
-  'Counter': () => _Counter.internalCreate_Counter,
   'Credential': () => Credential.internalCreateCredential,
   'CredentialsContainer': () => CredentialsContainer.internalCreateCredentialsContainer,
+  'CrossOriginConnectEvent': () => CrossOriginConnectEvent.internalCreateCrossOriginConnectEvent,
+  'CrossOriginServiceWorkerClient': () => CrossOriginServiceWorkerClient.internalCreateCrossOriginServiceWorkerClient,
   'Crypto': () => Crypto.internalCreateCrypto,
   'CryptoKey': () => CryptoKey.internalCreateCryptoKey,
   'CustomEvent': () => CustomEvent.internalCreateCustomEvent,
@@ -702,6 +762,7 @@
   'DataTransferItem': () => DataTransferItem.internalCreateDataTransferItem,
   'DataTransferItemList': () => DataTransferItemList.internalCreateDataTransferItemList,
   'DedicatedWorkerGlobalScope': () => DedicatedWorkerGlobalScope.internalCreateDedicatedWorkerGlobalScope,
+  'DefaultSessionStartEvent': () => DefaultSessionStartEvent.internalCreateDefaultSessionStartEvent,
   'DeprecatedStorageInfo': () => DeprecatedStorageInfo.internalCreateDeprecatedStorageInfo,
   'DeprecatedStorageQuota': () => DeprecatedStorageQuota.internalCreateDeprecatedStorageQuota,
   'DeviceAcceleration': () => DeviceAcceleration.internalCreateDeviceAcceleration,
@@ -716,6 +777,7 @@
   'Document': () => Document.internalCreateDocument,
   'DocumentFragment': () => DocumentFragment.internalCreateDocumentFragment,
   'DocumentType': () => _DocumentType.internalCreate_DocumentType,
+  'EffectModel': () => EffectModel.internalCreateEffectModel,
   'Element': () => Element.internalCreateElement,
   'Entry': () => Entry.internalCreateEntry,
   'EntrySync': () => _EntrySync.internalCreate_EntrySync,
@@ -745,9 +807,11 @@
   'GamepadEvent': () => GamepadEvent.internalCreateGamepadEvent,
   'GamepadList': () => _GamepadList.internalCreate_GamepadList,
   'Geofencing': () => Geofencing.internalCreateGeofencing,
+  'GeofencingEvent': () => GeofencingEvent.internalCreateGeofencingEvent,
   'GeofencingRegion': () => GeofencingRegion.internalCreateGeofencingRegion,
   'Geolocation': () => Geolocation.internalCreateGeolocation,
   'Geoposition': () => Geoposition.internalCreateGeoposition,
+  'HMDVRDevice': () => HmdvrDevice.internalCreateHmdvrDevice,
   'HTMLAllCollection': () => _HTMLAllCollection.internalCreate_HTMLAllCollection,
   'HTMLAnchorElement': () => AnchorElement.internalCreateAnchorElement,
   'HTMLAppletElement': () => _HTMLAppletElement.internalCreate_HTMLAppletElement,
@@ -832,11 +896,10 @@
   'ImageBitmap': () => ImageBitmap.internalCreateImageBitmap,
   'ImageData': () => ImageData.internalCreateImageData,
   'InjectedScriptHost': () => InjectedScriptHost.internalCreateInjectedScriptHost,
-  'InputMethodContext': () => InputMethodContext.internalCreateInputMethodContext,
-  'InstallEvent': () => InstallEvent.internalCreateInstallEvent,
+  'InputDevice': () => InputDevice.internalCreateInputDevice,
   'Iterator': () => DomIterator.internalCreateDomIterator,
   'KeyboardEvent': () => KeyboardEvent.internalCreateKeyboardEvent,
-  'LocalCredential': () => LocalCredential.internalCreateLocalCredential,
+  'KeyframeEffect': () => KeyframeEffect.internalCreateKeyframeEffect,
   'Location': () => Location.internalCreateLocation,
   'MIDIAccess': () => MidiAccess.internalCreateMidiAccess,
   'MIDIConnectionEvent': () => MidiConnectionEvent.internalCreateMidiConnectionEvent,
@@ -848,16 +911,20 @@
   'MIDIPort': () => MidiPort.internalCreateMidiPort,
   'MediaController': () => MediaController.internalCreateMediaController,
   'MediaDeviceInfo': () => MediaDeviceInfo.internalCreateMediaDeviceInfo,
+  'MediaDevices': () => MediaDevices.internalCreateMediaDevices,
+  'MediaEncryptedEvent': () => MediaEncryptedEvent.internalCreateMediaEncryptedEvent,
   'MediaError': () => MediaError.internalCreateMediaError,
   'MediaKeyError': () => MediaKeyError.internalCreateMediaKeyError,
   'MediaKeyEvent': () => MediaKeyEvent.internalCreateMediaKeyEvent,
   'MediaKeyMessageEvent': () => MediaKeyMessageEvent.internalCreateMediaKeyMessageEvent,
-  'MediaKeyNeededEvent': () => MediaKeyNeededEvent.internalCreateMediaKeyNeededEvent,
   'MediaKeySession': () => MediaKeySession.internalCreateMediaKeySession,
+  'MediaKeyStatusMap': () => MediaKeyStatusMap.internalCreateMediaKeyStatusMap,
+  'MediaKeySystemAccess': () => MediaKeySystemAccess.internalCreateMediaKeySystemAccess,
   'MediaKeys': () => MediaKeys.internalCreateMediaKeys,
   'MediaList': () => MediaList.internalCreateMediaList,
   'MediaQueryList': () => MediaQueryList.internalCreateMediaQueryList,
   'MediaQueryListEvent': () => MediaQueryListEvent.internalCreateMediaQueryListEvent,
+  'MediaSession': () => MediaSession.internalCreateMediaSession,
   'MediaSource': () => MediaSource.internalCreateMediaSource,
   'MediaStream': () => MediaStream.internalCreateMediaStream,
   'MediaStreamEvent': () => MediaStreamEvent.internalCreateMediaStreamEvent,
@@ -876,36 +943,52 @@
   'MutationRecord': () => MutationRecord.internalCreateMutationRecord,
   'NamedNodeMap': () => _NamedNodeMap.internalCreate_NamedNodeMap,
   'Navigator': () => Navigator.internalCreateNavigator,
+  'NavigatorStorageUtils': () => NavigatorStorageUtils.internalCreateNavigatorStorageUtils,
   'NavigatorUserMediaError': () => NavigatorUserMediaError.internalCreateNavigatorUserMediaError,
   'NetworkInformation': () => NetworkInformation.internalCreateNetworkInformation,
   'Node': () => Node.internalCreateNode,
   'NodeFilter': () => NodeFilter.internalCreateNodeFilter,
   'NodeIterator': () => NodeIterator.internalCreateNodeIterator,
   'NodeList': () => NodeList.internalCreateNodeList,
+  'NonDocumentTypeChildNode': () => NonDocumentTypeChildNode.internalCreateNonDocumentTypeChildNode,
+  'NonElementParentNode': () => NonElementParentNode.internalCreateNonElementParentNode,
   'Notification': () => Notification.internalCreateNotification,
-  'OverflowEvent': () => OverflowEvent.internalCreateOverflowEvent,
+  'NotificationEvent': () => NotificationEvent.internalCreateNotificationEvent,
   'PagePopupController': () => _PagePopupController.internalCreate_PagePopupController,
   'PageTransitionEvent': () => PageTransitionEvent.internalCreatePageTransitionEvent,
+  'PasswordCredential': () => PasswordCredential.internalCreatePasswordCredential,
   'Path2D': () => Path2D.internalCreatePath2D,
   'Performance': () => Performance.internalCreatePerformance,
+  'PerformanceCompositeTiming': () => PerformanceCompositeTiming.internalCreatePerformanceCompositeTiming,
   'PerformanceEntry': () => PerformanceEntry.internalCreatePerformanceEntry,
   'PerformanceMark': () => PerformanceMark.internalCreatePerformanceMark,
   'PerformanceMeasure': () => PerformanceMeasure.internalCreatePerformanceMeasure,
   'PerformanceNavigation': () => PerformanceNavigation.internalCreatePerformanceNavigation,
+  'PerformanceRenderTiming': () => PerformanceRenderTiming.internalCreatePerformanceRenderTiming,
   'PerformanceResourceTiming': () => PerformanceResourceTiming.internalCreatePerformanceResourceTiming,
   'PerformanceTiming': () => PerformanceTiming.internalCreatePerformanceTiming,
+  'PeriodicSyncEvent': () => PeriodicSyncEvent.internalCreatePeriodicSyncEvent,
+  'PeriodicSyncManager': () => PeriodicSyncManager.internalCreatePeriodicSyncManager,
+  'PeriodicSyncRegistration': () => PeriodicSyncRegistration.internalCreatePeriodicSyncRegistration,
+  'PermissionStatus': () => PermissionStatus.internalCreatePermissionStatus,
+  'Permissions': () => Permissions.internalCreatePermissions,
   'Plugin': () => Plugin.internalCreatePlugin,
   'PluginArray': () => PluginArray.internalCreatePluginArray,
   'PluginPlaceholderElement': () => PluginPlaceholderElement.internalCreatePluginPlaceholderElement,
+  'PointerEvent': () => PointerEvent.internalCreatePointerEvent,
   'PopStateEvent': () => PopStateEvent.internalCreatePopStateEvent,
   'PositionError': () => PositionError.internalCreatePositionError,
+  'PositionSensorVRDevice': () => PositionSensorVRDevice.internalCreatePositionSensorVRDevice,
   'Presentation': () => Presentation.internalCreatePresentation,
+  'PresentationAvailability': () => PresentationAvailability.internalCreatePresentationAvailability,
+  'PresentationSession': () => PresentationSession.internalCreatePresentationSession,
   'ProcessingInstruction': () => ProcessingInstruction.internalCreateProcessingInstruction,
   'ProgressEvent': () => ProgressEvent.internalCreateProgressEvent,
+  'PromiseRejectionEvent': () => PromiseRejectionEvent.internalCreatePromiseRejectionEvent,
   'PushEvent': () => PushEvent.internalCreatePushEvent,
   'PushManager': () => PushManager.internalCreatePushManager,
-  'PushRegistration': () => PushRegistration.internalCreatePushRegistration,
-  'RGBColor': () => _RGBColor.internalCreate_RGBColor,
+  'PushMessageData': () => PushMessageData.internalCreatePushMessageData,
+  'PushSubscription': () => PushSubscription.internalCreatePushSubscription,
   'RTCDTMFSender': () => RtcDtmfSender.internalCreateRtcDtmfSender,
   'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent.internalCreateRtcDtmfToneChangeEvent,
   'RTCDataChannel': () => RtcDataChannel.internalCreateRtcDataChannel,
@@ -918,23 +1001,29 @@
   'RTCStatsResponse': () => RtcStatsResponse.internalCreateRtcStatsResponse,
   'RadioNodeList': () => _RadioNodeList.internalCreate_RadioNodeList,
   'Range': () => Range.internalCreateRange,
+  'ReadableByteStream': () => ReadableByteStream.internalCreateReadableByteStream,
+  'ReadableByteStreamReader': () => ReadableByteStreamReader.internalCreateReadableByteStreamReader,
   'ReadableStream': () => ReadableStream.internalCreateReadableStream,
-  'Rect': () => _Rect.internalCreate_Rect,
+  'ReadableStreamReader': () => ReadableStreamReader.internalCreateReadableStreamReader,
   'RelatedEvent': () => RelatedEvent.internalCreateRelatedEvent,
   'Request': () => _Request.internalCreate_Request,
   'ResourceProgressEvent': () => ResourceProgressEvent.internalCreateResourceProgressEvent,
   'Response': () => _Response.internalCreate_Response,
   'Screen': () => Screen.internalCreateScreen,
   'ScreenOrientation': () => ScreenOrientation.internalCreateScreenOrientation,
+  'ScrollState': () => ScrollState.internalCreateScrollState,
   'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent.internalCreateSecurityPolicyViolationEvent,
   'Selection': () => Selection.internalCreateSelection,
+  'ServicePort': () => ServicePort.internalCreateServicePort,
+  'ServicePortCollection': () => ServicePortCollection.internalCreateServicePortCollection,
+  'ServicePortConnectEvent': () => ServicePortConnectEvent.internalCreateServicePortConnectEvent,
   'ServiceWorker': () => _ServiceWorker.internalCreate_ServiceWorker,
-  'ServiceWorkerClient': () => ServiceWorkerClient.internalCreateServiceWorkerClient,
-  'ServiceWorkerClients': () => ServiceWorkerClients.internalCreateServiceWorkerClients,
   'ServiceWorkerContainer': () => ServiceWorkerContainer.internalCreateServiceWorkerContainer,
   'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope.internalCreateServiceWorkerGlobalScope,
+  'ServiceWorkerMessageEvent': () => ServiceWorkerMessageEvent.internalCreateServiceWorkerMessageEvent,
   'ServiceWorkerRegistration': () => ServiceWorkerRegistration.internalCreateServiceWorkerRegistration,
   'ShadowRoot': () => ShadowRoot.internalCreateShadowRoot,
+  'SharedArrayBuffer': () => SharedArrayBuffer.internalCreateSharedArrayBuffer,
   'SharedWorker': () => SharedWorker.internalCreateSharedWorker,
   'SharedWorkerGlobalScope': () => SharedWorkerGlobalScope.internalCreateSharedWorkerGlobalScope,
   'SourceBuffer': () => SourceBuffer.internalCreateSourceBuffer,
@@ -952,6 +1041,8 @@
   'SpeechSynthesisEvent': () => SpeechSynthesisEvent.internalCreateSpeechSynthesisEvent,
   'SpeechSynthesisUtterance': () => SpeechSynthesisUtterance.internalCreateSpeechSynthesisUtterance,
   'SpeechSynthesisVoice': () => SpeechSynthesisVoice.internalCreateSpeechSynthesisVoice,
+  'StashedMessagePort': () => StashedMessagePort.internalCreateStashedMessagePort,
+  'StashedPortCollection': () => StashedPortCollection.internalCreateStashedPortCollection,
   'Storage': () => Storage.internalCreateStorage,
   'StorageEvent': () => StorageEvent.internalCreateStorageEvent,
   'StorageInfo': () => StorageInfo.internalCreateStorageInfo,
@@ -961,6 +1052,9 @@
   'StyleSheet': () => StyleSheet.internalCreateStyleSheet,
   'StyleSheetList': () => _StyleSheetList.internalCreate_StyleSheetList,
   'SubtleCrypto': () => _SubtleCrypto.internalCreate_SubtleCrypto,
+  'SyncEvent': () => SyncEvent.internalCreateSyncEvent,
+  'SyncManager': () => SyncManager.internalCreateSyncManager,
+  'SyncRegistration': () => SyncRegistration.internalCreateSyncRegistration,
   'Text': () => Text.internalCreateText,
   'TextEvent': () => TextEvent.internalCreateTextEvent,
   'TextMetrics': () => TextMetrics.internalCreateTextMetrics,
@@ -969,15 +1063,20 @@
   'TextTrackCueList': () => TextTrackCueList.internalCreateTextTrackCueList,
   'TextTrackList': () => TextTrackList.internalCreateTextTrackList,
   'TimeRanges': () => TimeRanges.internalCreateTimeRanges,
-  'Timing': () => Timing.internalCreateTiming,
   'Touch': () => Touch.internalCreateTouch,
   'TouchEvent': () => TouchEvent.internalCreateTouchEvent,
   'TouchList': () => TouchList.internalCreateTouchList,
+  'TrackDefault': () => TrackDefault.internalCreateTrackDefault,
+  'TrackDefaultList': () => TrackDefaultList.internalCreateTrackDefaultList,
   'TrackEvent': () => TrackEvent.internalCreateTrackEvent,
   'TransitionEvent': () => TransitionEvent.internalCreateTransitionEvent,
   'TreeWalker': () => TreeWalker.internalCreateTreeWalker,
   'UIEvent': () => UIEvent.internalCreateUIEvent,
   'URL': () => Url.internalCreateUrl,
+  'VRDevice': () => VRDevice.internalCreateVRDevice,
+  'VREyeParameters': () => VREyeParameters.internalCreateVREyeParameters,
+  'VRFieldOfView': () => VRFieldOfView.internalCreateVRFieldOfView,
+  'VRPositionState': () => VRPositionState.internalCreateVRPositionState,
   'VTTCue': () => VttCue.internalCreateVttCue,
   'VTTRegion': () => VttRegion.internalCreateVttRegion,
   'VTTRegionList': () => VttRegionList.internalCreateVttRegionList,
@@ -985,14 +1084,11 @@
   'VideoPlaybackQuality': () => VideoPlaybackQuality.internalCreateVideoPlaybackQuality,
   'VideoTrack': () => VideoTrack.internalCreateVideoTrack,
   'VideoTrackList': () => VideoTrackList.internalCreateVideoTrackList,
-  'WebKitAnimationEvent': () => AnimationEvent.internalCreateAnimationEvent,
-  'WebKitCSSFilterRule': () => CssFilterRule.internalCreateCssFilterRule,
-  'WebKitCSSFilterValue': () => _WebKitCSSFilterValue.internalCreate_WebKitCSSFilterValue,
   'WebKitCSSMatrix': () => _WebKitCSSMatrix.internalCreate_WebKitCSSMatrix,
-  'WebKitCSSTransformValue': () => _WebKitCSSTransformValue.internalCreate_WebKitCSSTransformValue,
   'WebSocket': () => WebSocket.internalCreateWebSocket,
   'WheelEvent': () => WheelEvent.internalCreateWheelEvent,
   'Window': () => Window.internalCreateWindow,
+  'WindowClient': () => WindowClient.internalCreateWindowClient,
   'Worker': () => Worker.internalCreateWorker,
   'WorkerConsole': () => WorkerConsole.internalCreateWorkerConsole,
   'WorkerGlobalScope': () => WorkerGlobalScope.internalCreateWorkerGlobalScope,
@@ -1283,16 +1379,6 @@
   @DocsEditable()
   set hreflang(String value) => _blink.BlinkHTMLAnchorElement.instance.hreflang_Setter_(unwrap_jso(this), value);
   
-  @DomName('HTMLAnchorElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLAnchorElement.instance.integrity_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLAnchorElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLAnchorElement.instance.integrity_Setter_(unwrap_jso(this), value);
-  
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
   String get rel => _blink.BlinkHTMLAnchorElement.instance.rel_Getter_(unwrap_jso(this));
@@ -1422,26 +1508,10 @@
 @DocsEditable()
 @DomName('Animation')
 @Experimental() // untriaged
-class Animation extends AnimationNode {
+class Animation extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory Animation._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Animation.Animation')
-  @DocsEditable()
-  factory Animation(Element target, List<Map> keyframes, [timingInput]) {
-    if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
-      return wrap_jso(_blink.BlinkAnimation.instance.constructorCallback_2_(target, keyframes));
-    }
-    if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return wrap_jso(_blink.BlinkAnimation.instance.constructorCallback_3_(target, keyframes, timingInput));
-    }
-    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      var timingInput_1 = convertDartToNative_Dictionary(timingInput);
-      return wrap_jso(_blink.BlinkAnimation.instance.constructorCallback_3_(target, keyframes, timingInput_1));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
 
   @Deprecated("Internal Use Only")
   static Animation internalCreateAnimation() {
@@ -1454,6 +1524,109 @@
   Animation.internal_() : super.internal_();
 
 
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => true;
+
+  @DomName('Animation.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get currentTime => _blink.BlinkAnimation.instance.currentTime_Getter_(unwrap_jso(this));
+  
+  @DomName('Animation.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set currentTime(num value) => _blink.BlinkAnimation.instance.currentTime_Setter_(unwrap_jso(this), value);
+  
+  @DomName('Animation.effect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationEffectReadOnly get effect => wrap_jso(_blink.BlinkAnimation.instance.effect_Getter_(unwrap_jso(this)));
+  
+  @DomName('Animation.effect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set effect(AnimationEffectReadOnly value) => _blink.BlinkAnimation.instance.effect_Setter_(unwrap_jso(this), unwrap_jso(value));
+  
+  @DomName('Animation.endClip')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get endClip => _blink.BlinkAnimation.instance.endClip_Getter_(unwrap_jso(this));
+  
+  @DomName('Animation.endClip')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set endClip(num value) => _blink.BlinkAnimation.instance.endClip_Setter_(unwrap_jso(this), value);
+  
+  @DomName('Animation.finished')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future get finished => wrap_jso(_blink.BlinkAnimation.instance.finished_Getter_(unwrap_jso(this)));
+  
+  @DomName('Animation.playState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get playState => _blink.BlinkAnimation.instance.playState_Getter_(unwrap_jso(this));
+  
+  @DomName('Animation.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get playbackRate => _blink.BlinkAnimation.instance.playbackRate_Getter_(unwrap_jso(this));
+  
+  @DomName('Animation.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set playbackRate(num value) => _blink.BlinkAnimation.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  
+  @DomName('Animation.ready')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future get ready => wrap_jso(_blink.BlinkAnimation.instance.ready_Getter_(unwrap_jso(this)));
+  
+  @DomName('Animation.startClip')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get startClip => _blink.BlinkAnimation.instance.startClip_Getter_(unwrap_jso(this));
+  
+  @DomName('Animation.startClip')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set startClip(num value) => _blink.BlinkAnimation.instance.startClip_Setter_(unwrap_jso(this), value);
+  
+  @DomName('Animation.startTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get startTime => _blink.BlinkAnimation.instance.startTime_Getter_(unwrap_jso(this));
+  
+  @DomName('Animation.startTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set startTime(num value) => _blink.BlinkAnimation.instance.startTime_Setter_(unwrap_jso(this), value);
+  
+  @DomName('Animation.cancel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cancel() => _blink.BlinkAnimation.instance.cancel_Callback_0_(unwrap_jso(this));
+  
+  @DomName('Animation.finish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void finish() => _blink.BlinkAnimation.instance.finish_Callback_0_(unwrap_jso(this));
+  
+  @DomName('Animation.pause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void pause() => _blink.BlinkAnimation.instance.pause_Callback_0_(unwrap_jso(this));
+  
+  @DomName('Animation.play')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void play() => _blink.BlinkAnimation.instance.play_Callback_0_(unwrap_jso(this));
+  
+  @DomName('Animation.reverse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void reverse() => _blink.BlinkAnimation.instance.reverse_Callback_0_(unwrap_jso(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
@@ -1463,27 +1636,37 @@
 
 
 @DocsEditable()
-@DomName('AnimationEffect')
+@DomName('AnimationEffectReadOnly')
 @Experimental() // untriaged
-class AnimationEffect extends DartHtmlDomObject {
+class AnimationEffectReadOnly extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
-  factory AnimationEffect._() { throw new UnsupportedError("Not supported"); }
+  factory AnimationEffectReadOnly._() { throw new UnsupportedError("Not supported"); }
 
   @Deprecated("Internal Use Only")
-  static AnimationEffect internalCreateAnimationEffect() {
-    return new AnimationEffect._internalWrap();
+  static AnimationEffectReadOnly internalCreateAnimationEffectReadOnly() {
+    return new AnimationEffectReadOnly._internalWrap();
   }
 
-  factory AnimationEffect._internalWrap() {
-    return new AnimationEffect.internal_();
+  factory AnimationEffectReadOnly._internalWrap() {
+    return new AnimationEffectReadOnly.internal_();
   }
 
   @Deprecated("Internal Use Only")
-  AnimationEffect.internal_() { }
+  AnimationEffectReadOnly.internal_() { }
 
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
+  @DomName('AnimationEffectReadOnly.computedTiming')
+  @DocsEditable()
+  @Experimental() // untriaged
+   get computedTiming => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkAnimationEffectReadOnly.instance.computedTiming_Getter_(unwrap_jso(this))));
+  
+  @DomName('AnimationEffectReadOnly.timing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationEffectTiming get timing => wrap_jso(_blink.BlinkAnimationEffectReadOnly.instance.timing_Getter_(unwrap_jso(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
@@ -1493,14 +1676,142 @@
 
 
 @DocsEditable()
-@DomName('WebKitAnimationEvent')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
+@DomName('AnimationEffectTiming')
+@Experimental() // untriaged
+class AnimationEffectTiming extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationEffectTiming._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static AnimationEffectTiming internalCreateAnimationEffectTiming() {
+    return new AnimationEffectTiming._internalWrap();
+  }
+
+  factory AnimationEffectTiming._internalWrap() {
+    return new AnimationEffectTiming.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  AnimationEffectTiming.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('AnimationEffectTiming.delay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get delay => _blink.BlinkAnimationEffectTiming.instance.delay_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationEffectTiming.delay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set delay(num value) => _blink.BlinkAnimationEffectTiming.instance.delay_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationEffectTiming.direction')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get direction => _blink.BlinkAnimationEffectTiming.instance.direction_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationEffectTiming.direction')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set direction(String value) => _blink.BlinkAnimationEffectTiming.instance.direction_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationEffectTiming.duration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object get duration => wrap_jso(_blink.BlinkAnimationEffectTiming.instance.duration_Getter_(unwrap_jso(this)));
+  
+  @DomName('AnimationEffectTiming.duration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set duration(Object value) => _blink.BlinkAnimationEffectTiming.instance.duration_Setter_(unwrap_jso(this), unwrap_jso(value));
+  
+  @DomName('AnimationEffectTiming.easing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get easing => _blink.BlinkAnimationEffectTiming.instance.easing_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationEffectTiming.easing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set easing(String value) => _blink.BlinkAnimationEffectTiming.instance.easing_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationEffectTiming.endDelay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get endDelay => _blink.BlinkAnimationEffectTiming.instance.endDelay_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationEffectTiming.endDelay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set endDelay(num value) => _blink.BlinkAnimationEffectTiming.instance.endDelay_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationEffectTiming.fill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get fill => _blink.BlinkAnimationEffectTiming.instance.fill_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationEffectTiming.fill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set fill(String value) => _blink.BlinkAnimationEffectTiming.instance.fill_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationEffectTiming.iterationStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get iterationStart => _blink.BlinkAnimationEffectTiming.instance.iterationStart_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationEffectTiming.iterationStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set iterationStart(num value) => _blink.BlinkAnimationEffectTiming.instance.iterationStart_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationEffectTiming.iterations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get iterations => _blink.BlinkAnimationEffectTiming.instance.iterations_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationEffectTiming.iterations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set iterations(num value) => _blink.BlinkAnimationEffectTiming.instance.iterations_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationEffectTiming.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get playbackRate => _blink.BlinkAnimationEffectTiming.instance.playbackRate_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationEffectTiming.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set playbackRate(num value) => _blink.BlinkAnimationEffectTiming.instance.playbackRate_Setter_(unwrap_jso(this), 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('AnimationEvent')
+@Experimental() // untriaged
 class AnimationEvent extends Event {
   // To suppress missing implicit constructor warnings.
   factory AnimationEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('AnimationEvent.AnimationEvent')
+  @DocsEditable()
+  factory AnimationEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkAnimationEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkAnimationEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static AnimationEvent internalCreateAnimationEvent() {
@@ -1513,183 +1824,15 @@
   AnimationEvent.internal_() : super.internal_();
 
 
-  @DomName('WebKitAnimationEvent.animationName')
-  @DocsEditable()
-  String get animationName => _blink.BlinkWebKitAnimationEvent.instance.animationName_Getter_(unwrap_jso(this));
-  
-  @DomName('WebKitAnimationEvent.elapsedTime')
-  @DocsEditable()
-  num get elapsedTime => _blink.BlinkWebKitAnimationEvent.instance.elapsedTime_Getter_(unwrap_jso(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('AnimationNode')
-@Experimental() // untriaged
-class AnimationNode extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory AnimationNode._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static AnimationNode internalCreateAnimationNode() {
-    return new AnimationNode._internalWrap();
-  }
-
-  factory AnimationNode._internalWrap() {
-    return new AnimationNode.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  AnimationNode.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
-  @DomName('AnimationNode.activeDuration')
+  @DomName('AnimationEvent.animationName')
   @DocsEditable()
   @Experimental() // untriaged
-  num get activeDuration => _blink.BlinkAnimationNode.instance.activeDuration_Getter_(unwrap_jso(this));
+  String get animationName => _blink.BlinkAnimationEvent.instance.animationName_Getter_(unwrap_jso(this));
   
-  @DomName('AnimationNode.currentIteration')
+  @DomName('AnimationEvent.elapsedTime')
   @DocsEditable()
   @Experimental() // untriaged
-  int get currentIteration => _blink.BlinkAnimationNode.instance.currentIteration_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationNode.duration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get duration => _blink.BlinkAnimationNode.instance.duration_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationNode.endTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get endTime => _blink.BlinkAnimationNode.instance.endTime_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationNode.localTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get localTime => _blink.BlinkAnimationNode.instance.localTime_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationNode.player')
-  @DocsEditable()
-  @Experimental() // untriaged
-  AnimationPlayer get player => wrap_jso(_blink.BlinkAnimationNode.instance.player_Getter_(unwrap_jso(this)));
-  
-  @DomName('AnimationNode.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get startTime => _blink.BlinkAnimationNode.instance.startTime_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationNode.timing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Timing get timing => wrap_jso(_blink.BlinkAnimationNode.instance.timing_Getter_(unwrap_jso(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('AnimationPlayer')
-@Experimental() // untriaged
-class AnimationPlayer extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory AnimationPlayer._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static AnimationPlayer internalCreateAnimationPlayer() {
-    return new AnimationPlayer._internalWrap();
-  }
-
-  external factory AnimationPlayer._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  AnimationPlayer.internal_() : super.internal_();
-
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => true;
-
-  @DomName('AnimationPlayer.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get currentTime => _blink.BlinkAnimationPlayer.instance.currentTime_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationPlayer.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set currentTime(num value) => _blink.BlinkAnimationPlayer.instance.currentTime_Setter_(unwrap_jso(this), value);
-  
-  @DomName('AnimationPlayer.playState')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get playState => _blink.BlinkAnimationPlayer.instance.playState_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationPlayer.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get playbackRate => _blink.BlinkAnimationPlayer.instance.playbackRate_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationPlayer.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set playbackRate(num value) => _blink.BlinkAnimationPlayer.instance.playbackRate_Setter_(unwrap_jso(this), value);
-  
-  @DomName('AnimationPlayer.source')
-  @DocsEditable()
-  @Experimental() // untriaged
-  AnimationNode get source => wrap_jso(_blink.BlinkAnimationPlayer.instance.source_Getter_(unwrap_jso(this)));
-  
-  @DomName('AnimationPlayer.source')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set source(AnimationNode value) => _blink.BlinkAnimationPlayer.instance.source_Setter_(unwrap_jso(this), unwrap_jso(value));
-  
-  @DomName('AnimationPlayer.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get startTime => _blink.BlinkAnimationPlayer.instance.startTime_Getter_(unwrap_jso(this));
-  
-  @DomName('AnimationPlayer.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set startTime(num value) => _blink.BlinkAnimationPlayer.instance.startTime_Setter_(unwrap_jso(this), value);
-  
-  @DomName('AnimationPlayer.cancel')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void cancel() => _blink.BlinkAnimationPlayer.instance.cancel_Callback_0_(unwrap_jso(this));
-  
-  @DomName('AnimationPlayer.finish')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void finish() => _blink.BlinkAnimationPlayer.instance.finish_Callback_0_(unwrap_jso(this));
-  
-  @DomName('AnimationPlayer.pause')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void pause() => _blink.BlinkAnimationPlayer.instance.pause_Callback_0_(unwrap_jso(this));
-  
-  @DomName('AnimationPlayer.play')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void play() => _blink.BlinkAnimationPlayer.instance.play_Callback_0_(unwrap_jso(this));
-  
-  @DomName('AnimationPlayer.reverse')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void reverse() => _blink.BlinkAnimationPlayer.instance.reverse_Callback_0_(unwrap_jso(this));
+  num get elapsedTime => _blink.BlinkAnimationEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1706,6 +1849,16 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationPlayerEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('AnimationPlayerEvent.AnimationPlayerEvent')
+  @DocsEditable()
+  factory AnimationPlayerEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkAnimationPlayerEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkAnimationPlayerEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static AnimationPlayerEvent internalCreateAnimationPlayerEvent() {
@@ -1763,15 +1916,70 @@
   @Experimental() // untriaged
   num get currentTime => _blink.BlinkAnimationTimeline.instance.currentTime_Getter_(unwrap_jso(this));
   
-  @DomName('AnimationTimeline.getAnimationPlayers')
+  @DomName('AnimationTimeline.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  List<AnimationPlayer> getAnimationPlayers() => wrap_jso(_blink.BlinkAnimationTimeline.instance.getAnimationPlayers_Callback_0_(unwrap_jso(this)));
+  set currentTime(num value) => _blink.BlinkAnimationTimeline.instance.currentTime_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationTimeline.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get playbackRate => _blink.BlinkAnimationTimeline.instance.playbackRate_Getter_(unwrap_jso(this));
+  
+  @DomName('AnimationTimeline.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set playbackRate(num value) => _blink.BlinkAnimationTimeline.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  
+  @DomName('AnimationTimeline.getAnimations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Animation> getAnimations() => wrap_jso(_blink.BlinkAnimationTimeline.instance.getAnimations_Callback_0_(unwrap_jso(this)));
   
   @DomName('AnimationTimeline.play')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationPlayer play(AnimationNode source) => wrap_jso(_blink.BlinkAnimationTimeline.instance.play_Callback_1_(unwrap_jso(this), unwrap_jso(source)));
+  Animation play(AnimationEffectReadOnly source) => wrap_jso(_blink.BlinkAnimationTimeline.instance.play_Callback_1_(unwrap_jso(this), unwrap_jso(source)));
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('AppBannerPromptResult')
+@Experimental() // untriaged
+class AppBannerPromptResult extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory AppBannerPromptResult._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static AppBannerPromptResult internalCreateAppBannerPromptResult() {
+    return new AppBannerPromptResult._internalWrap();
+  }
+
+  factory AppBannerPromptResult._internalWrap() {
+    return new AppBannerPromptResult.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  AppBannerPromptResult.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('AppBannerPromptResult.outcome')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get outcome => _blink.BlinkAppBannerPromptResult.instance.outcome_Getter_(unwrap_jso(this));
+  
+  @DomName('AppBannerPromptResult.platform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get platform => _blink.BlinkAppBannerPromptResult.instance.platform_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1986,6 +2194,16 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCacheErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ApplicationCacheErrorEvent.ApplicationCacheErrorEvent')
+  @DocsEditable()
+  factory ApplicationCacheErrorEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkApplicationCacheErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkApplicationCacheErrorEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static ApplicationCacheErrorEvent internalCreateApplicationCacheErrorEvent() {
@@ -2358,6 +2576,16 @@
   // To suppress missing implicit constructor warnings.
   factory AutocompleteErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('AutocompleteErrorEvent.AutocompleteErrorEvent')
+  @DocsEditable()
+  factory AutocompleteErrorEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkAutocompleteErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkAutocompleteErrorEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static AutocompleteErrorEvent internalCreateAutocompleteErrorEvent() {
@@ -2550,6 +2778,58 @@
 
 
 @DocsEditable()
+@DomName('BeforeInstallPromptEvent')
+@Experimental() // untriaged
+class BeforeInstallPromptEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory BeforeInstallPromptEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('BeforeInstallPromptEvent.BeforeInstallPromptEvent')
+  @DocsEditable()
+  factory BeforeInstallPromptEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkBeforeInstallPromptEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkBeforeInstallPromptEvent.instance.constructorCallback_1_(type));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static BeforeInstallPromptEvent internalCreateBeforeInstallPromptEvent() {
+    return new BeforeInstallPromptEvent._internalWrap();
+  }
+
+  external factory BeforeInstallPromptEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  BeforeInstallPromptEvent.internal_() : super.internal_();
+
+
+  @DomName('BeforeInstallPromptEvent.platforms')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> get platforms => _blink.BlinkBeforeInstallPromptEvent.instance.platforms_Getter_(unwrap_jso(this));
+  
+  @DomName('BeforeInstallPromptEvent.userChoice')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future get userChoice => wrap_jso(_blink.BlinkBeforeInstallPromptEvent.instance.userChoice_Getter_(unwrap_jso(this)));
+  
+  @DomName('BeforeInstallPromptEvent.prompt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future prompt() => wrap_jso(_blink.BlinkBeforeInstallPromptEvent.instance.prompt_Callback_0_(unwrap_jso(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('BeforeUnloadEvent')
 class BeforeUnloadEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -2650,6 +2930,296 @@
 
 
 @DocsEditable()
+@DomName('Bluetooth')
+@Experimental() // untriaged
+class Bluetooth extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory Bluetooth._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static Bluetooth internalCreateBluetooth() {
+    return new Bluetooth._internalWrap();
+  }
+
+  factory Bluetooth._internalWrap() {
+    return new Bluetooth.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  Bluetooth.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('Bluetooth.requestDevice')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestDevice(Map options) => wrap_jso(_blink.BlinkBluetooth.instance.requestDevice_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(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('BluetoothDevice')
+@Experimental() // untriaged
+class BluetoothDevice extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothDevice._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static BluetoothDevice internalCreateBluetoothDevice() {
+    return new BluetoothDevice._internalWrap();
+  }
+
+  factory BluetoothDevice._internalWrap() {
+    return new BluetoothDevice.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  BluetoothDevice.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('BluetoothDevice.deviceClass')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get deviceClass => _blink.BlinkBluetoothDevice.instance.deviceClass_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothDevice.instanceID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get instanceID => _blink.BlinkBluetoothDevice.instance.instanceID_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothDevice.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get name => _blink.BlinkBluetoothDevice.instance.name_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothDevice.paired')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get paired => _blink.BlinkBluetoothDevice.instance.paired_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothDevice.productID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get productID => _blink.BlinkBluetoothDevice.instance.productID_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothDevice.productVersion')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get productVersion => _blink.BlinkBluetoothDevice.instance.productVersion_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothDevice.vendorID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get vendorID => _blink.BlinkBluetoothDevice.instance.vendorID_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothDevice.vendorIDSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get vendorIDSource => _blink.BlinkBluetoothDevice.instance.vendorIDSource_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothDevice.connectGATT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future connectGatt() => wrap_jso(_blink.BlinkBluetoothDevice.instance.connectGATT_Callback_0_(unwrap_jso(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('BluetoothGATTCharacteristic')
+@Experimental() // untriaged
+class BluetoothGattCharacteristic extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothGattCharacteristic._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static BluetoothGattCharacteristic internalCreateBluetoothGattCharacteristic() {
+    return new BluetoothGattCharacteristic._internalWrap();
+  }
+
+  factory BluetoothGattCharacteristic._internalWrap() {
+    return new BluetoothGattCharacteristic.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  BluetoothGattCharacteristic.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('BluetoothGATTCharacteristic.uuid')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get uuid => _blink.BlinkBluetoothGATTCharacteristic.instance.uuid_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothGATTCharacteristic.readValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future readValue() => wrap_jso(_blink.BlinkBluetoothGATTCharacteristic.instance.readValue_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('BluetoothGATTCharacteristic.writeValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future writeValue(/*BufferSource*/ value) => wrap_jso(_blink.BlinkBluetoothGATTCharacteristic.instance.writeValue_Callback_1_(unwrap_jso(this), 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('BluetoothGATTRemoteServer')
+@Experimental() // untriaged
+class BluetoothGattRemoteServer extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothGattRemoteServer._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static BluetoothGattRemoteServer internalCreateBluetoothGattRemoteServer() {
+    return new BluetoothGattRemoteServer._internalWrap();
+  }
+
+  factory BluetoothGattRemoteServer._internalWrap() {
+    return new BluetoothGattRemoteServer.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  BluetoothGattRemoteServer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('BluetoothGATTRemoteServer.connected')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get connected => _blink.BlinkBluetoothGATTRemoteServer.instance.connected_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothGATTRemoteServer.getPrimaryService')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getPrimaryService(/*BluetoothServiceUUID*/ service) => wrap_jso(_blink.BlinkBluetoothGATTRemoteServer.instance.getPrimaryService_Callback_1_(unwrap_jso(this), service));
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('BluetoothGATTService')
+@Experimental() // untriaged
+class BluetoothGattService extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothGattService._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static BluetoothGattService internalCreateBluetoothGattService() {
+    return new BluetoothGattService._internalWrap();
+  }
+
+  factory BluetoothGattService._internalWrap() {
+    return new BluetoothGattService.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  BluetoothGattService.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('BluetoothGATTService.isPrimary')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get isPrimary => _blink.BlinkBluetoothGATTService.instance.isPrimary_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothGATTService.uuid')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get uuid => _blink.BlinkBluetoothGATTService.instance.uuid_Getter_(unwrap_jso(this));
+  
+  @DomName('BluetoothGATTService.getCharacteristic')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getCharacteristic(/*BluetoothCharacteristicUUID*/ characteristic) => wrap_jso(_blink.BlinkBluetoothGATTService.instance.getCharacteristic_Callback_1_(unwrap_jso(this), characteristic));
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('BluetoothUUID')
+@Experimental() // untriaged
+class BluetoothUuid extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothUuid._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static BluetoothUuid internalCreateBluetoothUuid() {
+    return new BluetoothUuid._internalWrap();
+  }
+
+  factory BluetoothUuid._internalWrap() {
+    return new BluetoothUuid.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  BluetoothUuid.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('BluetoothUUID.canonicalUUID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static String canonicalUuid(int alias) => _blink.BlinkBluetoothUUID.instance.canonicalUUID_Callback_1_(alias);
+  
+  @DomName('BluetoothUUID.getCharacteristic')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static String getCharacteristic(Object name) => _blink.BlinkBluetoothUUID.instance.getCharacteristic_Callback_1_(name);
+  
+  @DomName('BluetoothUUID.getDescriptor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static String getDescriptor(Object name) => _blink.BlinkBluetoothUUID.instance.getDescriptor_Callback_1_(name);
+  
+  @DomName('BluetoothUUID.getService')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static String getService(Object name) => _blink.BlinkBluetoothUUID.instance.getService_Callback_1_(name);
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('Body')
 @Experimental() // untriaged
 class Body extends DartHtmlDomObject {
@@ -3063,6 +3633,11 @@
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLButtonElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLButtonElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLButtonElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLButtonElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) => _blink.BlinkHTMLButtonElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
@@ -3125,21 +3700,11 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('CacheStorage.create')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future create(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.create_Callback_1_(unwrap_jso(this), cacheName));
-  
   @DomName('CacheStorage.delete')
   @DocsEditable()
   @Experimental() // untriaged
   Future delete(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.delete_Callback_1_(unwrap_jso(this), cacheName));
   
-  @DomName('CacheStorage.get')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future get(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.get_Callback_1_(unwrap_jso(this), cacheName));
-  
   @DomName('CacheStorage.has')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3150,54 +3715,17 @@
   @Experimental() // untriaged
   Future keys() => wrap_jso(_blink.BlinkCacheStorage.instance.keys_Callback_0_(unwrap_jso(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('Canvas2DContextAttributes')
-// http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
-@Experimental()
-class Canvas2DContextAttributes extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory Canvas2DContextAttributes._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static Canvas2DContextAttributes internalCreateCanvas2DContextAttributes() {
-    return new Canvas2DContextAttributes._internalWrap();
+  Future match(/*RequestInfo*/ request, [Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkCacheStorage.instance.match_Callback_2_(unwrap_jso(this), request, convertDartToNative_Dictionary(options)));
+    }
+    return wrap_jso(_blink.BlinkCacheStorage.instance.match_Callback_1_(unwrap_jso(this), request));
   }
 
-  factory Canvas2DContextAttributes._internalWrap() {
-    return new Canvas2DContextAttributes.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  Canvas2DContextAttributes.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
-  @DomName('Canvas2DContextAttributes.alpha')
-  @DocsEditable()
-  bool get alpha => _blink.BlinkCanvas2DContextAttributes.instance.alpha_Getter_(unwrap_jso(this));
-  
-  @DomName('Canvas2DContextAttributes.alpha')
-  @DocsEditable()
-  set alpha(bool value) => _blink.BlinkCanvas2DContextAttributes.instance.alpha_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Canvas2DContextAttributes.storage')
+  @DomName('CacheStorage.open')
   @DocsEditable()
   @Experimental() // untriaged
-  String get storage => _blink.BlinkCanvas2DContextAttributes.instance.storage_Getter_(unwrap_jso(this));
-  
-  @DomName('Canvas2DContextAttributes.storage')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set storage(String value) => _blink.BlinkCanvas2DContextAttributes.instance.storage_Setter_(unwrap_jso(this), value);
+  Future open(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.open_Callback_1_(unwrap_jso(this), cacheName));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3277,14 +3805,29 @@
   @DocsEditable()
   set width(int value) => _blink.BlinkHTMLCanvasElement.instance.width_Setter_(unwrap_jso(this), value);
   
-  @DomName('HTMLCanvasElement.getContext')
-  @DocsEditable()
-  Object getContext(String contextId, [Map attrs]) => wrap_jso(_blink.BlinkHTMLCanvasElement.instance.getContext_Callback_2_(unwrap_jso(this), contextId, convertDartToNative_Dictionary(attrs)));
-  
-  @DomName('HTMLCanvasElement.toDataURL')
-  @DocsEditable()
-  String _toDataUrl(String type, [num quality]) => _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_2_(unwrap_jso(this), type, quality);
-  
+  Object getContext(String contextId, [Map attributes]) {
+    if (attributes != null) {
+      return wrap_jso(_blink.BlinkHTMLCanvasElement.instance.getContext_Callback_2_(unwrap_jso(this), contextId, convertDartToNative_Dictionary(attributes)));
+    }
+    return wrap_jso(_blink.BlinkHTMLCanvasElement.instance.getContext_Callback_1_(unwrap_jso(this), contextId));
+  }
+
+  String _toDataUrl(String type, [arguments_OR_quality]) {
+    if ((type is String || type == null) && arguments_OR_quality == null) {
+      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_1_(unwrap_jso(this), type);
+    }
+    if (arguments_OR_quality != null && (type is String || type == null)) {
+      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_2_(unwrap_jso(this), type, unwrap_jso(arguments_OR_quality));
+    }
+    if ((type is String || type == null) && arguments_OR_quality == null) {
+      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_1_(unwrap_jso(this), type);
+    }
+    if ((arguments_OR_quality is num || arguments_OR_quality == null) && (type is String || type == null)) {
+      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_2_(unwrap_jso(this), type, unwrap_jso(arguments_OR_quality));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
@@ -3568,6 +4111,16 @@
   @DocsEditable()
   set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Setter_(unwrap_jso(this), unwrap_jso(value));
   
+  @DomName('CanvasRenderingContext2D.filter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get filter => _blink.BlinkCanvasRenderingContext2D.instance.filter_Getter_(unwrap_jso(this));
+  
+  @DomName('CanvasRenderingContext2D.filter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set filter(String value) => _blink.BlinkCanvasRenderingContext2D.instance.filter_Setter_(unwrap_jso(this), value);
+  
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
   String get font => _blink.BlinkCanvasRenderingContext2D.instance.font_Getter_(unwrap_jso(this));
@@ -3760,31 +4313,23 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('CanvasRenderingContext2D.createImageData')
-  @DocsEditable()
-  ImageData createImageData(num sw, num sh) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_2_(unwrap_jso(this), sw, sh));
-  
-  @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
-  @DocsEditable()
-  ImageData createImageDataFromImageData(ImageData imagedata) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_1_(unwrap_jso(this), unwrap_jso(imagedata)));
-  
-  @DomName('CanvasRenderingContext2D.createLinearGradient')
-  @DocsEditable()
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createLinearGradient_Callback_4_(unwrap_jso(this), x0, y0, x1, y1));
-  
-  CanvasPattern createPattern(canvas_OR_image, String repetitionType) {
-    if ((repetitionType is String || repetitionType == null) && (canvas_OR_image is CanvasElement)) {
-      return wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(unwrap_jso(this), unwrap_jso(canvas_OR_image), repetitionType));
+  ImageData createImageData(imagedata_OR_sw, [num sh]) {
+    if ((imagedata_OR_sw is ImageData) && sh == null) {
+      return wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_1_(unwrap_jso(this), unwrap_jso(imagedata_OR_sw)));
     }
-    if ((repetitionType is String || repetitionType == null) && (canvas_OR_image is VideoElement)) {
-      return wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(unwrap_jso(this), unwrap_jso(canvas_OR_image), repetitionType));
+    if ((sh is num) && (imagedata_OR_sw is num)) {
+      return wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_2_(unwrap_jso(this), unwrap_jso(imagedata_OR_sw), sh));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('CanvasRenderingContext2D.createPatternFromImage')
+  @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
-  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(unwrap_jso(this), unwrap_jso(image), repetitionType));
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createLinearGradient_Callback_4_(unwrap_jso(this), x0, y0, x1, y1));
+  
+  @DomName('CanvasRenderingContext2D.createPattern')
+  @DocsEditable()
+  CanvasPattern createPattern(Object image, String repetitionType) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(unwrap_jso(this), image, repetitionType));
   
   @DomName('CanvasRenderingContext2D.createRadialGradient')
   @DocsEditable()
@@ -3802,53 +4347,17 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _drawImage(canvas_OR_image_OR_imageBitmap_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 ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y);
+  void _drawImage(Object image, 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 ((sy_OR_y is num) && (sx_OR_x is num) && image != null && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(unwrap_jso(this), image, sx_OR_x, sy_OR_y);
       return;
     }
-    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement) && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && image != null && dx == null && dy == null && dw == null && dh == null) {
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(unwrap_jso(this), image, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
-    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-      return;
-    }
-    if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y);
-      return;
-    }
-    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement) && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-      return;
-    }
-    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-      return;
-    }
-    if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y);
-      return;
-    }
-    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement) && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-      return;
-    }
-    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-      return;
-    }
-    if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y);
-      return;
-    }
-    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap) && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-      return;
-    }
-    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(unwrap_jso(this), unwrap_jso(canvas_OR_image_OR_imageBitmap_OR_video), sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && image != null) {
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(unwrap_jso(this), image, 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");
@@ -3891,7 +4400,7 @@
   @DocsEditable()
   // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
   @Experimental()
-  Canvas2DContextAttributes getContextAttributes() => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.getContextAttributes_Callback_0_(unwrap_jso(this)));
+   getContextAttributes() => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.getContextAttributes_Callback_0_(unwrap_jso(this))));
   
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
@@ -4062,6 +4571,11 @@
   void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.rect_Callback_4_(unwrap_jso(this), x, y, width, height);
   
 
+  @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
+  @DocsEditable()
+  ImageData createImageDataFromImageData(ImageData imagedata) =>
+    this.createImageData(imagedata);
+
   /**
    * Sets the color used inside shapes.
    * [r], [g], [b] are 0-255, [a] is 0-1.
@@ -4105,6 +4619,10 @@
     _arc(x, y, radius, startAngle, endAngle, anticlockwise);
   }
 
+  @DomName('CanvasRenderingContext2D.createPatternFromImage')
+  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) =>
+    createPattern(image, repetitionType);
+
   /**
    * Draws an image from a CanvasImageSource to an area of this canvas.
    *
@@ -4305,7 +4823,7 @@
 
 @DocsEditable()
 @DomName('CharacterData')
-class CharacterData extends Node implements ChildNode {
+class CharacterData extends Node implements NonDocumentTypeChildNode, ChildNode {
   // To suppress missing implicit constructor warnings.
   factory CharacterData._() { throw new UnsupportedError("Not supported"); }
 
@@ -4339,7 +4857,7 @@
   
   @DomName('CharacterData.deleteData')
   @DocsEditable()
-  void deleteData(int offset, int length) => _blink.BlinkCharacterData.instance.deleteData_Callback_2_(unwrap_jso(this), offset, length);
+  void deleteData(int offset, int count) => _blink.BlinkCharacterData.instance.deleteData_Callback_2_(unwrap_jso(this), offset, count);
   
   @DomName('CharacterData.insertData')
   @DocsEditable()
@@ -4347,11 +4865,21 @@
   
   @DomName('CharacterData.replaceData')
   @DocsEditable()
-  void replaceData(int offset, int length, String data) => _blink.BlinkCharacterData.instance.replaceData_Callback_3_(unwrap_jso(this), offset, length, data);
+  void replaceData(int offset, int count, String data) => _blink.BlinkCharacterData.instance.replaceData_Callback_3_(unwrap_jso(this), offset, count, data);
   
   @DomName('CharacterData.substringData')
   @DocsEditable()
-  String substringData(int offset, int length) => _blink.BlinkCharacterData.instance.substringData_Callback_2_(unwrap_jso(this), offset, length);
+  String substringData(int offset, int count) => _blink.BlinkCharacterData.instance.substringData_Callback_2_(unwrap_jso(this), offset, count);
+  
+  @DomName('CharacterData.after')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void after(Object nodes) => _blink.BlinkCharacterData.instance.after_Callback_1_(unwrap_jso(this), nodes);
+  
+  @DomName('CharacterData.before')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void before(Object nodes) => _blink.BlinkCharacterData.instance.before_Callback_1_(unwrap_jso(this), nodes);
   
   @DomName('CharacterData.nextElementSibling')
   @DocsEditable()
@@ -4376,15 +4904,15 @@
   // To suppress missing implicit constructor warnings.
   factory ChildNode._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('ChildNode.nextElementSibling')
+  @DomName('ChildNode.after')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get nextElementSibling;
+  void after(Object nodes);
 
-  @DomName('ChildNode.previousElementSibling')
+  @DomName('ChildNode.before')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get previousElementSibling;
+  void before(Object nodes);
 
   @DomName('ChildNode.remove')
   @DocsEditable()
@@ -4400,6 +4928,36 @@
 
 
 @DocsEditable()
+@DomName('CHROMIUMValuebuffer')
+@Experimental() // untriaged
+class ChromiumValuebuffer extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory ChromiumValuebuffer._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static ChromiumValuebuffer internalCreateChromiumValuebuffer() {
+    return new ChromiumValuebuffer._internalWrap();
+  }
+
+  factory ChromiumValuebuffer._internalWrap() {
+    return new ChromiumValuebuffer.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  ChromiumValuebuffer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('CircularGeofencingRegion')
 @Experimental() // untriaged
 class CircularGeofencingRegion extends GeofencingRegion {
@@ -4459,11 +5017,154 @@
 
 
 @DocsEditable()
+@DomName('Client')
+@Experimental() // untriaged
+class Client extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory Client._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static Client internalCreateClient() {
+    return new Client._internalWrap();
+  }
+
+  factory Client._internalWrap() {
+    return new Client.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  Client.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('Client.frameType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get frameType => _blink.BlinkClient.instance.frameType_Getter_(unwrap_jso(this));
+  
+  @DomName('Client.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get id => _blink.BlinkClient.instance.id_Getter_(unwrap_jso(this));
+  
+  @DomName('Client.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get url => _blink.BlinkClient.instance.url_Getter_(unwrap_jso(this));
+  
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      _blink.BlinkClient.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      return;
+    }
+    _blink.BlinkClient.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    return;
+  }
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('Clients')
+@Experimental() // untriaged
+class Clients extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory Clients._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static Clients internalCreateClients() {
+    return new Clients._internalWrap();
+  }
+
+  factory Clients._internalWrap() {
+    return new Clients.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  Clients.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('Clients.claim')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future claim() => wrap_jso(_blink.BlinkClients.instance.claim_Callback_0_(unwrap_jso(this)));
+  
+  Future matchAll([Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkClients.instance.matchAll_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+    }
+    return wrap_jso(_blink.BlinkClients.instance.matchAll_Callback_0_(unwrap_jso(this)));
+  }
+
+  @DomName('Clients.openWindow')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future openWindow(String url) => wrap_jso(_blink.BlinkClients.instance.openWindow_Callback_1_(unwrap_jso(this), url));
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('ClipboardEvent')
+@Experimental() // untriaged
+class ClipboardEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory ClipboardEvent._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static ClipboardEvent internalCreateClipboardEvent() {
+    return new ClipboardEvent._internalWrap();
+  }
+
+  external factory ClipboardEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  ClipboardEvent.internal_() : super.internal_();
+
+
+  @DomName('ClipboardEvent.clipboardData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DataTransfer get clipboardData => wrap_jso(_blink.BlinkClipboardEvent.instance.clipboardData_Getter_(unwrap_jso(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('CloseEvent')
 class CloseEvent extends Event {
   // To suppress missing implicit constructor warnings.
   factory CloseEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('CloseEvent.CloseEvent')
+  @DocsEditable()
+  factory CloseEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkCloseEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkCloseEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static CloseEvent internalCreateCloseEvent() {
@@ -4543,8 +5244,16 @@
     return e;
   }
 
-  // To suppress missing implicit constructor warnings.
-  factory CompositionEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CompositionEvent.CompositionEvent')
+  @DocsEditable()
+  factory CompositionEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkCompositionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkCompositionEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -4558,28 +5267,13 @@
   CompositionEvent.internal_() : super.internal_();
 
 
-  @DomName('CompositionEvent.activeSegmentEnd')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int get activeSegmentEnd => _blink.BlinkCompositionEvent.instance.activeSegmentEnd_Getter_(unwrap_jso(this));
-  
-  @DomName('CompositionEvent.activeSegmentStart')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int get activeSegmentStart => _blink.BlinkCompositionEvent.instance.activeSegmentStart_Getter_(unwrap_jso(this));
-  
   @DomName('CompositionEvent.data')
   @DocsEditable()
   String get data => _blink.BlinkCompositionEvent.instance.data_Getter_(unwrap_jso(this));
   
-  @DomName('CompositionEvent.getSegments')
-  @DocsEditable()
-  @Experimental() // untriaged
-  List<int> getSegments() => _blink.BlinkCompositionEvent.instance.getSegments_Callback_0_(unwrap_jso(this));
-  
   @DomName('CompositionEvent.initCompositionEvent')
   @DocsEditable()
-  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkCompositionEvent.instance.initCompositionEvent_Callback_5_(unwrap_jso(this), typeArg, canBubbleArg, cancelableArg, unwrap_jso(viewArg), dataArg);
+  void _initCompositionEvent(String type, bool bubbles, bool cancelable, Window view, String data) => _blink.BlinkCompositionEvent.instance.initCompositionEvent_Callback_5_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(view), data);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4590,6 +5284,215 @@
 
 
 @DocsEditable()
+@DomName('CompositorProxy')
+@Experimental() // untriaged
+class CompositorProxy extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory CompositorProxy._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CompositorProxy.CompositorProxy')
+  @DocsEditable()
+  factory CompositorProxy(Element element, List<String> attributeArray) {
+    return wrap_jso(_blink.BlinkCompositorProxy.instance.constructorCallback_2_(element, attributeArray));
+  }
+
+  @Deprecated("Internal Use Only")
+  static CompositorProxy internalCreateCompositorProxy() {
+    return new CompositorProxy._internalWrap();
+  }
+
+  factory CompositorProxy._internalWrap() {
+    return new CompositorProxy.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  CompositorProxy.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('CompositorProxy.opacity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get opacity => _blink.BlinkCompositorProxy.instance.opacity_Getter_(unwrap_jso(this));
+  
+  @DomName('CompositorProxy.opacity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set opacity(num value) => _blink.BlinkCompositorProxy.instance.opacity_Setter_(unwrap_jso(this), value);
+  
+  @DomName('CompositorProxy.scrollLeft')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get scrollLeft => _blink.BlinkCompositorProxy.instance.scrollLeft_Getter_(unwrap_jso(this));
+  
+  @DomName('CompositorProxy.scrollLeft')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set scrollLeft(num value) => _blink.BlinkCompositorProxy.instance.scrollLeft_Setter_(unwrap_jso(this), value);
+  
+  @DomName('CompositorProxy.scrollTop')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get scrollTop => _blink.BlinkCompositorProxy.instance.scrollTop_Getter_(unwrap_jso(this));
+  
+  @DomName('CompositorProxy.scrollTop')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set scrollTop(num value) => _blink.BlinkCompositorProxy.instance.scrollTop_Setter_(unwrap_jso(this), value);
+  
+  @DomName('CompositorProxy.transform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix get transform => wrap_jso(_blink.BlinkCompositorProxy.instance.transform_Getter_(unwrap_jso(this)));
+  
+  @DomName('CompositorProxy.transform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set transform(DomMatrix value) => _blink.BlinkCompositorProxy.instance.transform_Setter_(unwrap_jso(this), unwrap_jso(value));
+  
+  @DomName('CompositorProxy.disconnect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disconnect() => _blink.BlinkCompositorProxy.instance.disconnect_Callback_0_(unwrap_jso(this));
+  
+  @DomName('CompositorProxy.supports')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool supports(String attribute) => _blink.BlinkCompositorProxy.instance.supports_Callback_1_(unwrap_jso(this), attribute);
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('CompositorWorker')
+@Experimental() // untriaged
+class CompositorWorker extends EventTarget implements AbstractWorker {
+  // To suppress missing implicit constructor warnings.
+  factory CompositorWorker._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CompositorWorker.errorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+
+  @DomName('CompositorWorker.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('CompositorWorker.CompositorWorker')
+  @DocsEditable()
+  factory CompositorWorker(String scriptUrl) {
+    return wrap_jso(_blink.BlinkCompositorWorker.instance.constructorCallback_1_(scriptUrl));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static CompositorWorker internalCreateCompositorWorker() {
+    return new CompositorWorker._internalWrap();
+  }
+
+  external factory CompositorWorker._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  CompositorWorker.internal_() : super.internal_();
+
+
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      _blink.BlinkCompositorWorker.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      return;
+    }
+    _blink.BlinkCompositorWorker.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    return;
+  }
+
+  @DomName('CompositorWorker.terminate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void terminate() => _blink.BlinkCompositorWorker.instance.terminate_Callback_0_(unwrap_jso(this));
+  
+  @DomName('CompositorWorker.onerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onError => errorEvent.forTarget(this);
+
+  @DomName('CompositorWorker.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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('CompositorWorkerGlobalScope')
+@Experimental() // untriaged
+class CompositorWorkerGlobalScope extends WorkerGlobalScope {
+  // To suppress missing implicit constructor warnings.
+  factory CompositorWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CompositorWorkerGlobalScope.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+
+  @Deprecated("Internal Use Only")
+  static CompositorWorkerGlobalScope internalCreateCompositorWorkerGlobalScope() {
+    return new CompositorWorkerGlobalScope._internalWrap();
+  }
+
+  external factory CompositorWorkerGlobalScope._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  CompositorWorkerGlobalScope.internal_() : super.internal_();
+
+
+  @DomName('CompositorWorkerGlobalScope.cancelAnimationFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cancelAnimationFrame(int handle) => _blink.BlinkCompositorWorkerGlobalScope.instance.cancelAnimationFrame_Callback_1_(unwrap_jso(this), handle);
+  
+  void postMessage(Object message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      _blink.BlinkCompositorWorkerGlobalScope.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      return;
+    }
+    _blink.BlinkCompositorWorkerGlobalScope.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    return;
+  }
+
+  @DomName('CompositorWorkerGlobalScope.requestAnimationFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int requestAnimationFrame(FrameRequestCallback callback) => _blink.BlinkCompositorWorkerGlobalScope.instance.requestAnimationFrame_Callback_1_(unwrap_jso(this), unwrap_jso((highResTime) => callback(highResTime)));
+  
+  @DomName('CompositorWorkerGlobalScope.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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('Console')
 class Console extends ConsoleBase {
   // To suppress missing implicit constructor warnings.
@@ -4612,6 +5515,11 @@
   @Experimental()
   MemoryInfo get memory => wrap_jso(_blink.BlinkConsole.instance.memory_Getter_(unwrap_jso(this)));
   
+  @DomName('Console.memory')
+  @DocsEditable()
+  @Experimental()
+  set memory(MemoryInfo value) => _blink.BlinkConsole.instance.memory_Setter_(unwrap_jso(this), unwrap_jso(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
@@ -4642,7 +5550,7 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('ConsoleBase.assertCondition')
+  @DomName('ConsoleBase.assert')
   @DocsEditable()
   @Experimental() // untriaged
   void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.instance.assert_Callback_2_(unwrap_jso(this), condition, arg);
@@ -4898,10 +5806,10 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('Credential.avatarURL')
+  @DomName('Credential.iconURL')
   @DocsEditable()
   @Experimental() // untriaged
-  String get avatarUrl => _blink.BlinkCredential.instance.avatarURL_Getter_(unwrap_jso(this));
+  String get iconUrl => _blink.BlinkCredential.instance.iconURL_Getter_(unwrap_jso(this));
   
   @DomName('Credential.id')
   @DocsEditable()
@@ -4913,6 +5821,11 @@
   @Experimental() // untriaged
   String get name => _blink.BlinkCredential.instance.name_Getter_(unwrap_jso(this));
   
+  @DomName('Credential.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get type => _blink.BlinkCredential.instance.type_Getter_(unwrap_jso(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
@@ -4943,21 +5856,11 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('CredentialsContainer.notifyFailedSignIn')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future notifyFailedSignIn(Credential credential) => wrap_jso(_blink.BlinkCredentialsContainer.instance.notifyFailedSignIn_Callback_1_(unwrap_jso(this), unwrap_jso(credential)));
-  
   @DomName('CredentialsContainer.notifySignedIn')
   @DocsEditable()
   @Experimental() // untriaged
   Future notifySignedIn(Credential credential) => wrap_jso(_blink.BlinkCredentialsContainer.instance.notifySignedIn_Callback_1_(unwrap_jso(this), unwrap_jso(credential)));
   
-  @DomName('CredentialsContainer.notifySignedOut')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future notifySignedOut() => wrap_jso(_blink.BlinkCredentialsContainer.instance.notifySignedOut_Callback_0_(unwrap_jso(this)));
-  
   Future request([Map options]) {
     if (options != null) {
       return wrap_jso(_blink.BlinkCredentialsContainer.instance.request_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
@@ -4965,6 +5868,94 @@
     return wrap_jso(_blink.BlinkCredentialsContainer.instance.request_Callback_0_(unwrap_jso(this)));
   }
 
+  @DomName('CredentialsContainer.requireUserMediation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requireUserMediation() => wrap_jso(_blink.BlinkCredentialsContainer.instance.requireUserMediation_Callback_0_(unwrap_jso(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('CrossOriginConnectEvent')
+@Experimental() // untriaged
+class CrossOriginConnectEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory CrossOriginConnectEvent._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static CrossOriginConnectEvent internalCreateCrossOriginConnectEvent() {
+    return new CrossOriginConnectEvent._internalWrap();
+  }
+
+  external factory CrossOriginConnectEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  CrossOriginConnectEvent.internal_() : super.internal_();
+
+
+  @DomName('CrossOriginConnectEvent.client')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CrossOriginServiceWorkerClient get client => wrap_jso(_blink.BlinkCrossOriginConnectEvent.instance.client_Getter_(unwrap_jso(this)));
+  
+  @DomName('CrossOriginConnectEvent.acceptConnection')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void acceptConnection(Future shouldAccept) => _blink.BlinkCrossOriginConnectEvent.instance.acceptConnection_Callback_1_(unwrap_jso(this), shouldAccept);
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('CrossOriginServiceWorkerClient')
+@Experimental() // untriaged
+class CrossOriginServiceWorkerClient extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory CrossOriginServiceWorkerClient._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static CrossOriginServiceWorkerClient internalCreateCrossOriginServiceWorkerClient() {
+    return new CrossOriginServiceWorkerClient._internalWrap();
+  }
+
+  external factory CrossOriginServiceWorkerClient._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  CrossOriginServiceWorkerClient.internal_() : super.internal_();
+
+
+  @DomName('CrossOriginServiceWorkerClient.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get origin => _blink.BlinkCrossOriginServiceWorkerClient.instance.origin_Getter_(unwrap_jso(this));
+  
+  @DomName('CrossOriginServiceWorkerClient.targetUrl')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get targetUrl => _blink.BlinkCrossOriginServiceWorkerClient.instance.targetUrl_Getter_(unwrap_jso(this));
+  
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      _blink.BlinkCrossOriginServiceWorkerClient.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      return;
+    }
+    _blink.BlinkCrossOriginServiceWorkerClient.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    return;
+  }
+
 }
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -5103,11 +6094,11 @@
 
   @DomName('CSS.supports')
   @DocsEditable()
-  bool supports(String property, String value) => _blink.BlinkCSS.instance.supports_Callback_2_(unwrap_jso(this), property, value);
+  static bool supports(String property, String value) => _blink.BlinkCSS.instance.supports_Callback_2_(property, value);
   
   @DomName('CSS.supportsCondition')
   @DocsEditable()
-  bool supportsCondition(String conditionText) => _blink.BlinkCSS.instance.supports_Callback_1_(unwrap_jso(this), conditionText);
+  static bool supportsCondition(String conditionText) => _blink.BlinkCSS.instance.supports_Callback_1_(conditionText);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5154,40 +6145,6 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSFilterRule')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/filter-effects/
-class CssFilterRule extends CssRule {
-  // To suppress missing implicit constructor warnings.
-  factory CssFilterRule._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static CssFilterRule internalCreateCssFilterRule() {
-    return new CssFilterRule._internalWrap();
-  }
-
-  external factory CssFilterRule._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  CssFilterRule.internal_() : super.internal_();
-
-
-  @DomName('WebKitCSSFilterRule.style')
-  @DocsEditable()
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkWebKitCSSFilterRule.instance.style_Getter_(unwrap_jso(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('CSSFontFaceRule')
 class CssFontFaceRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -5218,6 +6175,48 @@
 
 
 @DocsEditable()
+@DomName('CSSGroupingRule')
+@Experimental() // untriaged
+class CssGroupingRule extends CssRule {
+  // To suppress missing implicit constructor warnings.
+  factory CssGroupingRule._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static CssGroupingRule internalCreateCssGroupingRule() {
+    return new CssGroupingRule._internalWrap();
+  }
+
+  external factory CssGroupingRule._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  CssGroupingRule.internal_() : super.internal_();
+
+
+  @DomName('CSSGroupingRule.cssRules')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSGroupingRule.instance.cssRules_Getter_(unwrap_jso(this)));
+  
+  @DomName('CSSGroupingRule.deleteRule')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteRule(int index) => _blink.BlinkCSSGroupingRule.instance.deleteRule_Callback_1_(unwrap_jso(this), index);
+  
+  @DomName('CSSGroupingRule.insertRule')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int insertRule(String rule, int index) => _blink.BlinkCSSGroupingRule.instance.insertRule_Callback_2_(unwrap_jso(this), rule, index);
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('CSSImportRule')
 class CssImportRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -5336,20 +6335,20 @@
   @Experimental() // untriaged
   CssKeyframeRule __getter__(int index) => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.$__getter___Callback_1_(unwrap_jso(this), index));
   
+  @DomName('CSSKeyframesRule.appendRule')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void appendRule(String rule) => _blink.BlinkCSSKeyframesRule.instance.appendRule_Callback_1_(unwrap_jso(this), rule);
+  
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(String key) => _blink.BlinkCSSKeyframesRule.instance.deleteRule_Callback_1_(unwrap_jso(this), key);
+  void deleteRule(String select) => _blink.BlinkCSSKeyframesRule.instance.deleteRule_Callback_1_(unwrap_jso(this), select);
   
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String key) => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.findRule_Callback_1_(unwrap_jso(this), key));
-  
-  @DomName('CSSKeyframesRule.insertRule')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void appendRule(String rule) => _blink.BlinkCSSKeyframesRule.instance.insertRule_Callback_1_(unwrap_jso(this), rule);
+  CssKeyframeRule findRule(String select) => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.findRule_Callback_1_(unwrap_jso(this), select));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5361,7 +6360,7 @@
 
 @DocsEditable()
 @DomName('CSSMediaRule')
-class CssMediaRule extends CssRule {
+class CssMediaRule extends CssGroupingRule {
   // To suppress missing implicit constructor warnings.
   factory CssMediaRule._() { throw new UnsupportedError("Not supported"); }
 
@@ -5377,22 +6376,10 @@
   CssMediaRule.internal_() : super.internal_();
 
 
-  @DomName('CSSMediaRule.cssRules')
-  @DocsEditable()
-  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSMediaRule.instance.cssRules_Getter_(unwrap_jso(this)));
-  
   @DomName('CSSMediaRule.media')
   @DocsEditable()
   MediaList get media => wrap_jso(_blink.BlinkCSSMediaRule.instance.media_Getter_(unwrap_jso(this)));
   
-  @DomName('CSSMediaRule.deleteRule')
-  @DocsEditable()
-  void deleteRule(int index) => _blink.BlinkCSSMediaRule.instance.deleteRule_Callback_1_(unwrap_jso(this), index);
-  
-  @DomName('CSSMediaRule.insertRule')
-  @DocsEditable()
-  int insertRule(String rule, int index) => _blink.BlinkCSSMediaRule.instance.insertRule_Callback_2_(unwrap_jso(this), rule, index);
-  
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -5503,12 +6490,6 @@
   @Experimental() // untriaged
   static const int VIEWPORT_RULE = 15;
 
-  @DomName('CSSRule.WEBKIT_FILTER_RULE')
-  @DocsEditable()
-  // http://www.w3.org/TR/filter-effects/
-  @Experimental()
-  static const int WEBKIT_FILTER_RULE = 17;
-
   @DomName('CSSRule.WEBKIT_KEYFRAMES_RULE')
   @DocsEditable()
   // http://www.w3.org/TR/css3-animations/#cssrule
@@ -5676,27 +6657,18 @@
   @DocsEditable()
   CssRule get parentRule => wrap_jso(_blink.BlinkCSSStyleDeclaration.instance.parentRule_Getter_(unwrap_jso(this)));
   
-  @DomName('CSSStyleDeclaration.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object __getter__(String name) => wrap_jso(_blink.BlinkCSSStyleDeclaration.instance.$__getter___Callback_1_(unwrap_jso(this), name));
-  
   @DomName('CSSStyleDeclaration.__propertyQuery__')
   @DocsEditable()
   @Experimental() // untriaged
   bool __propertyQuery__(String name) => _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(unwrap_jso(this), name);
   
-  @DomName('CSSStyleDeclaration.__setter__')
-  @DocsEditable()
-  void __setter__(String propertyName, String propertyValue) => _blink.BlinkCSSStyleDeclaration.instance.$__setter___Callback_2_(unwrap_jso(this), propertyName, propertyValue);
-  
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable()
-  String getPropertyPriority(String propertyName) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyPriority_Callback_1_(unwrap_jso(this), propertyName);
+  String getPropertyPriority(String property) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyPriority_Callback_1_(unwrap_jso(this), property);
   
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable()
-  String _getPropertyValue(String propertyName) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyValue_Callback_1_(unwrap_jso(this), propertyName);
+  String _getPropertyValue(String property) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyValue_Callback_1_(unwrap_jso(this), property);
   
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable()
@@ -5704,11 +6676,11 @@
   
   @DomName('CSSStyleDeclaration.removeProperty')
   @DocsEditable()
-  String removeProperty(String propertyName) => _blink.BlinkCSSStyleDeclaration.instance.removeProperty_Callback_1_(unwrap_jso(this), propertyName);
+  String removeProperty(String property) => _blink.BlinkCSSStyleDeclaration.instance.removeProperty_Callback_1_(unwrap_jso(this), property);
   
   @DomName('CSSStyleDeclaration.setProperty')
   @DocsEditable()
-  void _setProperty(String propertyName, String value, String priority) => _blink.BlinkCSSStyleDeclaration.instance.setProperty_Callback_3_(unwrap_jso(this), propertyName, value, priority);
+  void _setProperty(String property, String value, String priority) => _blink.BlinkCSSStyleDeclaration.instance.setProperty_Callback_3_(unwrap_jso(this), property, value, priority);
   
 }
 
@@ -9046,8 +10018,16 @@
     }
     return _detail;
   }
-  // To suppress missing implicit constructor warnings.
-  factory CustomEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CustomEvent.CustomEvent')
+  @DocsEditable()
+  factory CustomEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkCustomEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkCustomEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -9067,7 +10047,7 @@
   
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) => _blink.BlinkCustomEvent.instance.initCustomEvent_Callback_4_(unwrap_jso(this), typeArg, canBubbleArg, cancelableArg, detailArg);
+  void _initCustomEvent(String type, bool bubbles, bool cancelable, Object detail) => _blink.BlinkCustomEvent.instance.initCustomEvent_Callback_4_(unwrap_jso(this), type, bubbles, cancelable, detail);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9217,9 +10197,9 @@
   @Experimental() // untriaged
   List<String> get types => _blink.BlinkDataTransfer.instance.types_Getter_(unwrap_jso(this));
   
-  void clearData([String type]) {
-    if (type != null) {
-      _blink.BlinkDataTransfer.instance.clearData_Callback_1_(unwrap_jso(this), type);
+  void clearData([String format]) {
+    if (format != null) {
+      _blink.BlinkDataTransfer.instance.clearData_Callback_1_(unwrap_jso(this), format);
       return;
     }
     _blink.BlinkDataTransfer.instance.clearData_Callback_0_(unwrap_jso(this));
@@ -9229,12 +10209,12 @@
   @DomName('DataTransfer.getData')
   @DocsEditable()
   @Experimental() // untriaged
-  String getData(String type) => _blink.BlinkDataTransfer.instance.getData_Callback_1_(unwrap_jso(this), type);
+  String getData(String format) => _blink.BlinkDataTransfer.instance.getData_Callback_1_(unwrap_jso(this), format);
   
   @DomName('DataTransfer.setData')
   @DocsEditable()
   @Experimental() // untriaged
-  void setData(String type, String data) => _blink.BlinkDataTransfer.instance.setData_Callback_2_(unwrap_jso(this), type, data);
+  void setData(String format, String data) => _blink.BlinkDataTransfer.instance.setData_Callback_2_(unwrap_jso(this), format, data);
   
   @DomName('DataTransfer.setDragImage')
   @DocsEditable()
@@ -9335,11 +10315,6 @@
   @DocsEditable()
   int get length => _blink.BlinkDataTransferItemList.instance.length_Getter_(unwrap_jso(this));
   
-  @DomName('DataTransferItemList.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DataTransferItem __getter__(int index) => wrap_jso(_blink.BlinkDataTransferItemList.instance.$__getter___Callback_1_(unwrap_jso(this), index));
-  
   DataTransferItem add(data_OR_file, [String type]) {
     if ((type is String) && (data_OR_file is String)) {
       return wrap_jso(_blink.BlinkDataTransferItemList.instance.add_Callback_2_(unwrap_jso(this), unwrap_jso(data_OR_file), type));
@@ -9362,6 +10337,10 @@
   @DocsEditable()
   void clear() => _blink.BlinkDataTransferItemList.instance.clear_Callback_0_(unwrap_jso(this));
   
+  @DomName('DataTransferItemList.item')
+  @DocsEditable()
+  DataTransferItem item(int index) => wrap_jso(_blink.BlinkDataTransferItemList.instance.item_Callback_1_(unwrap_jso(this), index));
+  
   @DomName('DataTransferItemList.remove')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9424,11 +10403,15 @@
   DedicatedWorkerGlobalScope.internal_() : super.internal_();
 
 
-  @DomName('DedicatedWorkerGlobalScope.postMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void postMessage(Object message, [List<MessagePort> transfer]) => _blink.BlinkDedicatedWorkerGlobalScope.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
-  
+  void postMessage(Object message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      _blink.BlinkDedicatedWorkerGlobalScope.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      return;
+    }
+    _blink.BlinkDedicatedWorkerGlobalScope.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    return;
+  }
+
   /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
   @DocsEditable()
@@ -9444,6 +10427,48 @@
 
 
 @DocsEditable()
+@DomName('DefaultSessionStartEvent')
+@Experimental() // untriaged
+class DefaultSessionStartEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory DefaultSessionStartEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('DefaultSessionStartEvent.DefaultSessionStartEvent')
+  @DocsEditable()
+  factory DefaultSessionStartEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkDefaultSessionStartEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkDefaultSessionStartEvent.instance.constructorCallback_1_(type));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static DefaultSessionStartEvent internalCreateDefaultSessionStartEvent() {
+    return new DefaultSessionStartEvent._internalWrap();
+  }
+
+  external factory DefaultSessionStartEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  DefaultSessionStartEvent.internal_() : super.internal_();
+
+
+  @DomName('DefaultSessionStartEvent.session')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PresentationSession get session => wrap_jso(_blink.BlinkDefaultSessionStartEvent.instance.session_Getter_(unwrap_jso(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('DeprecatedStorageInfo')
 @Experimental() // untriaged
 class DeprecatedStorageInfo extends DartHtmlDomObject {
@@ -9661,6 +10686,16 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceLightEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('DeviceLightEvent.DeviceLightEvent')
+  @DocsEditable()
+  factory DeviceLightEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkDeviceLightEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkDeviceLightEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static DeviceLightEvent internalCreateDeviceLightEvent() {
@@ -10278,6 +11313,11 @@
   @DocsEditable()
   String get _lastModified => _blink.BlinkDocument.instance.lastModified_Getter_(unwrap_jso(this));
   
+  @DomName('Document.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get origin => _blink.BlinkDocument.instance.origin_Getter_(unwrap_jso(this));
+  
   @DomName('Document.pointerLockElement')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10300,6 +11340,11 @@
   @Experimental() // untriaged
   SvgSvgElement get rootElement => wrap_jso(_blink.BlinkDocument.instance.rootElement_Getter_(unwrap_jso(this)));
   
+  @DomName('Document.scrollingElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element get scrollingElement => wrap_jso(_blink.BlinkDocument.instance.scrollingElement_Getter_(unwrap_jso(this)));
+  
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
   String get _selectedStylesheetSet => _blink.BlinkDocument.instance.selectedStylesheetSet_Getter_(unwrap_jso(this));
@@ -10407,7 +11452,7 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num webkitRadiusX, num webkitRadiusY, num webkitRotationAngle, num webkitForce) => wrap_jso(_blink.BlinkDocument.instance.createTouch_Callback_11_(unwrap_jso(this), unwrap_jso(window), unwrap_jso(target), identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce));
+  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num radiusX, num radiusY, num rotationAngle, num force) => wrap_jso(_blink.BlinkDocument.instance.createTouch_Callback_11_(unwrap_jso(this), unwrap_jso(window), unwrap_jso(target), identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force));
   
   @DomName('Document.createTouchList')
   @DocsEditable()
@@ -10426,10 +11471,21 @@
   @DocsEditable()
   Element _elementFromPoint(int x, int y) => wrap_jso(_blink.BlinkDocument.instance.elementFromPoint_Callback_2_(unwrap_jso(this), x, y));
   
-  @DomName('Document.execCommand')
+  @DomName('Document.elementsFromPoint')
   @DocsEditable()
-  bool execCommand(String command, bool userInterface, String value) => _blink.BlinkDocument.instance.execCommand_Callback_3_(unwrap_jso(this), command, userInterface, value);
+  @Experimental() // untriaged
+  List<Element> elementsFromPoint(int x, int y) => wrap_jso(_blink.BlinkDocument.instance.elementsFromPoint_Callback_2_(unwrap_jso(this), x, y));
   
+  bool execCommand(String commandId, [bool showUI, String value]) {
+    if (value != null) {
+      return _blink.BlinkDocument.instance.execCommand_Callback_3_(unwrap_jso(this), commandId, showUI, value);
+    }
+    if (showUI != null) {
+      return _blink.BlinkDocument.instance.execCommand_Callback_2_(unwrap_jso(this), commandId, showUI);
+    }
+    return _blink.BlinkDocument.instance.execCommand_Callback_1_(unwrap_jso(this), commandId);
+  }
+
   @DomName('Document.exitFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10446,10 +11502,6 @@
   @Experimental() // non-standard
   Object _getCssCanvasContext(String contextId, String name, int width, int height) => wrap_jso(_blink.BlinkDocument.instance.getCSSCanvasContext_Callback_4_(unwrap_jso(this), contextId, name, width, height));
   
-  @DomName('Document.getElementById')
-  @DocsEditable()
-  Element getElementById(String elementId) => wrap_jso(_blink.BlinkDocument.instance.getElementById_Callback_1_(unwrap_jso(this), elementId));
-  
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
   List<Node> getElementsByClassName(String classNames) => wrap_jso(_blink.BlinkDocument.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), classNames));
@@ -10471,23 +11523,23 @@
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
-  bool queryCommandEnabled(String command) => _blink.BlinkDocument.instance.queryCommandEnabled_Callback_1_(unwrap_jso(this), command);
+  bool queryCommandEnabled(String commandId) => _blink.BlinkDocument.instance.queryCommandEnabled_Callback_1_(unwrap_jso(this), commandId);
   
   @DomName('Document.queryCommandIndeterm')
   @DocsEditable()
-  bool queryCommandIndeterm(String command) => _blink.BlinkDocument.instance.queryCommandIndeterm_Callback_1_(unwrap_jso(this), command);
+  bool queryCommandIndeterm(String commandId) => _blink.BlinkDocument.instance.queryCommandIndeterm_Callback_1_(unwrap_jso(this), commandId);
   
   @DomName('Document.queryCommandState')
   @DocsEditable()
-  bool queryCommandState(String command) => _blink.BlinkDocument.instance.queryCommandState_Callback_1_(unwrap_jso(this), command);
+  bool queryCommandState(String commandId) => _blink.BlinkDocument.instance.queryCommandState_Callback_1_(unwrap_jso(this), commandId);
   
   @DomName('Document.queryCommandSupported')
   @DocsEditable()
-  bool queryCommandSupported(String command) => _blink.BlinkDocument.instance.queryCommandSupported_Callback_1_(unwrap_jso(this), command);
+  bool queryCommandSupported(String commandId) => _blink.BlinkDocument.instance.queryCommandSupported_Callback_1_(unwrap_jso(this), commandId);
   
   @DomName('Document.queryCommandValue')
   @DocsEditable()
-  String queryCommandValue(String command) => _blink.BlinkDocument.instance.queryCommandValue_Callback_1_(unwrap_jso(this), command);
+  String queryCommandValue(String commandId) => _blink.BlinkDocument.instance.queryCommandValue_Callback_1_(unwrap_jso(this), commandId);
   
   @DomName('Document.transformDocumentToTreeView')
   @DocsEditable()
@@ -10502,6 +11554,10 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
   void _webkitExitFullscreen() => _blink.BlinkDocument.instance.webkitExitFullscreen_Callback_0_(unwrap_jso(this));
   
+  @DomName('Document.getElementById')
+  @DocsEditable()
+  Element getElementById(String elementId) => wrap_jso(_blink.BlinkDocument.instance.getElementById_Callback_1_(unwrap_jso(this), elementId));
+  
   @DomName('Document.childElementCount')
   @DocsEditable()
   int get _childElementCount => _blink.BlinkDocument.instance.childElementCount_Getter_(unwrap_jso(this));
@@ -10596,12 +11652,12 @@
   /// Stream of `copy` events handled by this [Document].
   @DomName('Document.oncopy')
   @DocsEditable()
-  Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
+  Stream<ClipboardEvent> get onCopy => Element.copyEvent.forTarget(this);
 
   /// Stream of `cut` events handled by this [Document].
   @DomName('Document.oncut')
   @DocsEditable()
-  Stream<Event> get onCut => Element.cutEvent.forTarget(this);
+  Stream<ClipboardEvent> get onCut => Element.cutEvent.forTarget(this);
 
   /// Stream of `doubleclick` events handled by this [Document].
   @DomName('Document.ondblclick')
@@ -10753,7 +11809,7 @@
   /// Stream of `paste` events handled by this [Document].
   @DomName('Document.onpaste')
   @DocsEditable()
-  Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
+  Stream<ClipboardEvent> get onPaste => Element.pasteEvent.forTarget(this);
 
   @DomName('Document.onpause')
   @DocsEditable()
@@ -11016,7 +12072,7 @@
 
 
 @DomName('DocumentFragment')
-class DocumentFragment extends Node implements ParentNode {
+class DocumentFragment extends Node implements NonElementParentNode, ParentNode {
   factory DocumentFragment() => document.createDocumentFragment();
 
   factory DocumentFragment.html(String html,
@@ -11336,7 +12392,7 @@
   
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
-  bool hasFeature(String feature, String version) => _blink.BlinkDOMImplementation.instance.hasFeature_Callback_2_(unwrap_jso(this), feature, version);
+  bool hasFeature() => _blink.BlinkDOMImplementation.instance.hasFeature_Callback_0_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11644,44 +12700,44 @@
   @Experimental() // untriaged
   DomMatrix preMultiplySelf(DomMatrix other) => wrap_jso(_blink.BlinkDOMMatrix.instance.preMultiplySelf_Callback_1_(unwrap_jso(this), unwrap_jso(other)));
   
-  DomMatrix scale3dSelf(num scale, [num ox, num oy, num oz]) {
-    if (oz != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_4_(unwrap_jso(this), scale, ox, oy, oz));
+  DomMatrix scale3dSelf(num scale, [num originX, num originY, num originZ]) {
+    if (originZ != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_4_(unwrap_jso(this), scale, originX, originY, originZ));
     }
-    if (oy != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_3_(unwrap_jso(this), scale, ox, oy));
+    if (originY != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_3_(unwrap_jso(this), scale, originX, originY));
     }
-    if (ox != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_2_(unwrap_jso(this), scale, ox));
+    if (originX != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_2_(unwrap_jso(this), scale, originX));
     }
     return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_1_(unwrap_jso(this), scale));
   }
 
-  DomMatrix scaleNonUniformSelf(num sx, [num sy, num sz, num ox, num oy, num oz]) {
-    if (oz != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_6_(unwrap_jso(this), sx, sy, sz, ox, oy, oz));
+  DomMatrix scaleNonUniformSelf(num scaleX, [num scaleY, num scaleZ, num originX, num originY, num originZ]) {
+    if (originZ != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_6_(unwrap_jso(this), scaleX, scaleY, scaleZ, originX, originY, originZ));
     }
-    if (oy != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_5_(unwrap_jso(this), sx, sy, sz, ox, oy));
+    if (originY != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_5_(unwrap_jso(this), scaleX, scaleY, scaleZ, originX, originY));
     }
-    if (ox != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_4_(unwrap_jso(this), sx, sy, sz, ox));
+    if (originX != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_4_(unwrap_jso(this), scaleX, scaleY, scaleZ, originX));
     }
-    if (sz != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_3_(unwrap_jso(this), sx, sy, sz));
+    if (scaleZ != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_3_(unwrap_jso(this), scaleX, scaleY, scaleZ));
     }
-    if (sy != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_2_(unwrap_jso(this), sx, sy));
+    if (scaleY != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_2_(unwrap_jso(this), scaleX, scaleY));
     }
-    return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_1_(unwrap_jso(this), sx));
+    return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_1_(unwrap_jso(this), scaleX));
   }
 
-  DomMatrix scaleSelf(num scale, [num ox, num oy]) {
-    if (oy != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_3_(unwrap_jso(this), scale, ox, oy));
+  DomMatrix scaleSelf(num scale, [num originX, num originY]) {
+    if (originY != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_3_(unwrap_jso(this), scale, originX, originY));
     }
-    if (ox != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_2_(unwrap_jso(this), scale, ox));
+    if (originX != null) {
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_2_(unwrap_jso(this), scale, originX));
     }
     return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_1_(unwrap_jso(this), scale));
   }
@@ -11848,57 +12904,57 @@
   @Experimental() // untriaged
   DomMatrix multiply(DomMatrix other) => wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.multiply_Callback_1_(unwrap_jso(this), unwrap_jso(other)));
   
-  DomMatrix scale(num scale, [num ox, num oy]) {
-    if (oy != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_3_(unwrap_jso(this), scale, ox, oy));
+  DomMatrix scale(num scale, [num originX, num originY]) {
+    if (originY != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_3_(unwrap_jso(this), scale, originX, originY));
     }
-    if (ox != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_2_(unwrap_jso(this), scale, ox));
+    if (originX != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_2_(unwrap_jso(this), scale, originX));
     }
     return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_1_(unwrap_jso(this), scale));
   }
 
-  DomMatrix scale3d(num scale, [num ox, num oy, num oz]) {
-    if (oz != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_4_(unwrap_jso(this), scale, ox, oy, oz));
+  DomMatrix scale3d(num scale, [num originX, num originY, num originZ]) {
+    if (originZ != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_4_(unwrap_jso(this), scale, originX, originY, originZ));
     }
-    if (oy != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_3_(unwrap_jso(this), scale, ox, oy));
+    if (originY != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_3_(unwrap_jso(this), scale, originX, originY));
     }
-    if (ox != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_2_(unwrap_jso(this), scale, ox));
+    if (originX != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_2_(unwrap_jso(this), scale, originX));
     }
     return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_1_(unwrap_jso(this), scale));
   }
 
-  DomMatrix scaleNonUniform(num sx, [num sy, num sz, num ox, num oy, num oz]) {
-    if (oz != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_6_(unwrap_jso(this), sx, sy, sz, ox, oy, oz));
+  DomMatrix scaleNonUniform(num scaleX, [num scaleY, num scaleZn, num originX, num originY, num originZ]) {
+    if (originZ != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_6_(unwrap_jso(this), scaleX, scaleY, scaleZn, originX, originY, originZ));
     }
-    if (oy != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_5_(unwrap_jso(this), sx, sy, sz, ox, oy));
+    if (originY != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_5_(unwrap_jso(this), scaleX, scaleY, scaleZn, originX, originY));
     }
-    if (ox != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_4_(unwrap_jso(this), sx, sy, sz, ox));
+    if (originX != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_4_(unwrap_jso(this), scaleX, scaleY, scaleZn, originX));
     }
-    if (sz != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_3_(unwrap_jso(this), sx, sy, sz));
+    if (scaleZn != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_3_(unwrap_jso(this), scaleX, scaleY, scaleZn));
     }
-    if (sy != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_2_(unwrap_jso(this), sx, sy));
+    if (scaleY != null) {
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_2_(unwrap_jso(this), scaleX, scaleY));
     }
-    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_1_(unwrap_jso(this), sx));
+    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_1_(unwrap_jso(this), scaleX));
   }
 
   @DomName('DOMMatrixReadOnly.toFloat32Array')
   @DocsEditable()
   @Experimental() // untriaged
-  Float32List toFloat32Array() => _blink.BlinkDOMMatrixReadOnly.instance.toFloat32Array_Callback_0_(unwrap_jso(this));
+  Float32List toFloat32Array() => wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.toFloat32Array_Callback_0_(unwrap_jso(this)));
   
   @DomName('DOMMatrixReadOnly.toFloat64Array')
   @DocsEditable()
   @Experimental() // untriaged
-  Float64List toFloat64Array() => _blink.BlinkDOMMatrixReadOnly.instance.toFloat64Array_Callback_0_(unwrap_jso(this));
+  Float64List toFloat64Array() => wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.toFloat64Array_Callback_0_(unwrap_jso(this)));
   
   DomMatrix translate(num tx, num ty, [num tz]) {
     if (tz != null) {
@@ -11944,7 +13000,7 @@
 
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
-  Document parseFromString(String str, String contentType) => wrap_jso(_blink.BlinkDOMParser.instance.parseFromString_Callback_2_(unwrap_jso(this), str, contentType));
+  Document parseFromString(String str, String type) => wrap_jso(_blink.BlinkDOMParser.instance.parseFromString_Callback_2_(unwrap_jso(this), str, type));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11964,13 +13020,16 @@
   @DomName('DOMPoint.DOMPoint')
   @DocsEditable()
   factory DomPoint([point_OR_x, num y, num z, num w]) {
-    if (point_OR_x == null && y == null && z == null && w == null) {
-      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_0_());
-    }
     if ((point_OR_x is Map || point_OR_x == null) && y == null && z == null && w == null) {
       var point_1 = convertDartToNative_Dictionary(point_OR_x);
       return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_1_(point_1));
     }
+    if (point_OR_x == null && y == null && z == null && w == null) {
+      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_0_());
+    }
+    if ((point_OR_x is num || point_OR_x == null) && y == null && z == null && w == null) {
+      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_1_(point_OR_x));
+    }
     if ((y is num || y == null) && (point_OR_x is num || point_OR_x == null) && z == null && w == null) {
       return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_2_(point_OR_x, y));
     }
@@ -12290,9 +13349,10 @@
   @DocsEditable()
   set value(String value) => _blink.BlinkDOMSettableTokenList.instance.value_Setter_(unwrap_jso(this), value);
   
-  @DomName('DOMSettableTokenList.__getter__')
+  @DomName('DOMSettableTokenList.item')
   @DocsEditable()
-  String __getter__(int index) => _blink.BlinkDOMSettableTokenList.instance.$__getter___Callback_1_(unwrap_jso(this), index);
+  @Experimental() // untriaged
+  String item(int index) => _blink.BlinkDOMSettableTokenList.instance.item_Callback_1_(unwrap_jso(this), index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12373,6 +13433,11 @@
   String elementAt(int index) => this[index];
   // -- end List<String> mixins.
 
+  @DomName('DOMStringList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String __getter__(int index) => _blink.BlinkDOMStringList.instance.$__getter___Callback_1_(unwrap_jso(this), index);
+  
   @DomName('DOMStringList.contains')
   @DocsEditable()
   bool contains(String string) => _blink.BlinkDOMStringList.instance.contains_Callback_1_(unwrap_jso(this), string);
@@ -12395,38 +13460,39 @@
   // To suppress missing implicit constructor warnings.
   factory DomStringMap._() { throw new UnsupportedError("Not supported"); }
 
-  bool __delete__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
-    }
+  void __delete__(index_OR_name) {
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  String __getter__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkDOMStringMap.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
-    }
-    if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkDOMStringMap.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void __setter__(index_OR_name, String value) {
-    if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), value);
+      _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
       return;
     }
+    if ((index_OR_name is int || index_OR_name == null)) {
+      _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('DOMStringMap.__getter__')
+  @DocsEditable()
+  String __getter__(int index);
+
+  void __setter__(index_OR_name, String value) {
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
       _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), value);
       return;
     }
+    if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
+      _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), value);
+      return;
+    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  @DomName('DOMStringMap.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String item(String name);
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -12490,6 +13556,36 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('EffectModel')
+@Experimental() // untriaged
+class EffectModel extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory EffectModel._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static EffectModel internalCreateEffectModel() {
+    return new EffectModel._internalWrap();
+  }
+
+  factory EffectModel._internalWrap() {
+    return new EffectModel.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  EffectModel.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 
 class _ChildrenElementList extends ListBase<Element>
     implements NodeListWrapper {
@@ -12792,12 +13888,12 @@
   /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
-  ElementStream<Event> get onCopy;
+  ElementStream<ClipboardEvent> get onCopy;
 
   /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
-  ElementStream<Event> get onCut;
+  ElementStream<ClipboardEvent> get onCut;
 
   /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
@@ -13045,7 +14141,7 @@
   /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
-  ElementStream<Event> get onPaste;
+  ElementStream<ClipboardEvent> get onPaste;
 
   @DomName('Element.onpause')
   @DocsEditable()
@@ -13328,12 +14424,12 @@
   /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
-  ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onCopy => Element.copyEvent._forElementList(this);
 
   /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
-  ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onCut => Element.cutEvent._forElementList(this);
 
   /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
@@ -13581,7 +14677,7 @@
   /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
-  ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onPaste => Element.pasteEvent._forElementList(this);
 
   @DomName('Element.onpause')
   @DocsEditable()
@@ -13748,7 +14844,7 @@
  * An abstract class, which all HTML elements extend.
  */
 @DomName('Element')
-class Element extends Node implements GlobalEventHandlers, ParentNode, ChildNode {
+class Element extends Node implements NonDocumentTypeChildNode, GlobalEventHandlers, ParentNode, ChildNode {
 
   /**
    * Creates an HTML element from a valid fragment of HTML.
@@ -14211,7 +15307,7 @@
    * on which the method is called, and calls the play() method of the
    * AnimationTimeline object of the document timeline of the node document
    * of the element, passing the newly created AnimationEffect as the argument
-   * to the method. Returns an AnimationPlayer for the effect.
+   * to the method. Returns an Animation for the effect.
    *
    * Examples
    *
@@ -14230,7 +15326,7 @@
   **/
   @Experimental()
   @SupportedBrowser(SupportedBrowser.CHROME, '36')
-  AnimationPlayer animate(Iterable<Map<String, dynamic>> frames, [timing]) {
+  Animation animate(Iterable<Map<String, dynamic>> frames, [timing]) {
     if (frames is! Iterable || !(frames.every((x) => x is Map))) {
       throw new ArgumentError("The frames parameter should be a List of Maps "
           "with frame information");
@@ -14723,37 +15819,25 @@
   bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(unwrap_jso(this));
   void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(unwrap_jso(this));
 
+  @DomName('Element.offsetParent')
+  @DocsEditable()
+  Element get offsetParent => wrap_jso(_blink.BlinkElement.instance.offsetParent_Getter_(unwrap_jso(this)));
+
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this)).round();
+  int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this));
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(unwrap_jso(this)).round();
+  int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(unwrap_jso(this));
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(unwrap_jso(this)).round();
+  int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(unwrap_jso(this));
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(unwrap_jso(this)).round();
-
-  @DomName('Element.clientHeight')
-  @DocsEditable()
-  int get clientHeight => _blink.BlinkElement.instance.clientHeight_Getter_(unwrap_jso(this)).round();
-
-  @DomName('Element.clientLeft')
-  @DocsEditable()
-  int get clientLeft => _blink.BlinkElement.instance.clientLeft_Getter_(unwrap_jso(this)).round();
-
-  @DomName('Element.clientTop')
-  @DocsEditable()
-  int get clientTop => _blink.BlinkElement.instance.clientTop_Getter_(unwrap_jso(this)).round();
-
-  @DomName('Element.clientWidth')
-  @DocsEditable()
-  int get clientWidth => _blink.BlinkElement.instance.clientWidth_Getter_(unwrap_jso(this)).round();
+  int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(unwrap_jso(this));
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
@@ -14880,7 +15964,7 @@
    */
   @DomName('Element.copyEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
+  static const EventStreamProvider<ClipboardEvent> copyEvent = const EventStreamProvider<ClipboardEvent>('copy');
 
   /**
    * Static factory designed to expose `cut` events to event
@@ -14890,7 +15974,7 @@
    */
   @DomName('Element.cutEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
+  static const EventStreamProvider<ClipboardEvent> cutEvent = const EventStreamProvider<ClipboardEvent>('cut');
 
   /**
    * Static factory designed to expose `doubleclick` events to event
@@ -15221,7 +16305,7 @@
    */
   @DomName('Element.pasteEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
+  static const EventStreamProvider<ClipboardEvent> pasteEvent = const EventStreamProvider<ClipboardEvent>('paste');
 
   @DomName('Element.pauseEvent')
   @DocsEditable()
@@ -15476,6 +16560,8 @@
 
   bool spellcheck;
 
+  CssStyleDeclaration get style;
+
   int tabIndex;
 
   String title;
@@ -15484,6 +16570,10 @@
 
   String dropzone;
 
+  void blur();
+
+  void focus();
+
   @DomName('Element.attributes')
   @DocsEditable()
   _NamedNodeMap get _attributes => wrap_jso(_blink.BlinkElement.instance.attributes_Getter_(unwrap_jso(this)));
@@ -15498,19 +16588,29 @@
   
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get _clientHeight => _blink.BlinkElement.instance.clientHeight_Getter_(unwrap_jso(this));
+  int get clientHeight => _blink.BlinkElement.instance.clientHeight_Getter_(unwrap_jso(this));
   
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get _clientLeft => _blink.BlinkElement.instance.clientLeft_Getter_(unwrap_jso(this));
+  int get clientLeft => _blink.BlinkElement.instance.clientLeft_Getter_(unwrap_jso(this));
   
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get _clientTop => _blink.BlinkElement.instance.clientTop_Getter_(unwrap_jso(this));
+  int get clientTop => _blink.BlinkElement.instance.clientTop_Getter_(unwrap_jso(this));
   
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get _clientWidth => _blink.BlinkElement.instance.clientWidth_Getter_(unwrap_jso(this));
+  int get clientWidth => _blink.BlinkElement.instance.clientWidth_Getter_(unwrap_jso(this));
+  
+  @DomName('Element.computedName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get computedName => _blink.BlinkElement.instance.computedName_Getter_(unwrap_jso(this));
+  
+  @DomName('Element.computedRole')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get computedRole => _blink.BlinkElement.instance.computedRole_Getter_(unwrap_jso(this));
   
   @DomName('Element.id')
   @DocsEditable()
@@ -15538,26 +16638,6 @@
   @Experimental() // untriaged
   String get _namespaceUri => _blink.BlinkElement.instance.namespaceURI_Getter_(unwrap_jso(this));
   
-  @DomName('Element.offsetHeight')
-  @DocsEditable()
-  int get _offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this));
-  
-  @DomName('Element.offsetLeft')
-  @DocsEditable()
-  int get _offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(unwrap_jso(this));
-  
-  @DomName('Element.offsetParent')
-  @DocsEditable()
-  Element get offsetParent => wrap_jso(_blink.BlinkElement.instance.offsetParent_Getter_(unwrap_jso(this)));
-  
-  @DomName('Element.offsetTop')
-  @DocsEditable()
-  int get _offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(unwrap_jso(this));
-  
-  @DomName('Element.offsetWidth')
-  @DocsEditable()
-  int get _offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(unwrap_jso(this));
-  
   @DomName('Element.outerHTML')
   @DocsEditable()
   String get outerHtml => _blink.BlinkElement.instance.outerHTML_Getter_(unwrap_jso(this));
@@ -15592,38 +16672,42 @@
   @Experimental()
   ShadowRoot get shadowRoot => wrap_jso(_blink.BlinkElement.instance.shadowRoot_Getter_(unwrap_jso(this)));
   
-  @DomName('Element.style')
-  @DocsEditable()
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkElement.instance.style_Getter_(unwrap_jso(this)));
-  
   @DomName('Element.tagName')
   @DocsEditable()
   String get tagName => _blink.BlinkElement.instance.tagName_Getter_(unwrap_jso(this));
   
-  @DomName('Element.animate')
+  Animation _animate(Object effect, [timing]) {
+    if (effect != null && timing == null) {
+      return wrap_jso(_blink.BlinkElement.instance.animate_Callback_1_(unwrap_jso(this), effect));
+    }
+    if ((timing is num) && effect != null) {
+      return wrap_jso(_blink.BlinkElement.instance.animate_Callback_2_(unwrap_jso(this), effect, unwrap_jso(timing)));
+    }
+    if (timing != null && effect != null) {
+      return wrap_jso(_blink.BlinkElement.instance.animate_Callback_2_(unwrap_jso(this), effect, unwrap_jso(timing)));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('Element.closest')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationPlayer _animate(Object effect, [Object timing]) => wrap_jso(_blink.BlinkElement.instance.animate_Callback_2_(unwrap_jso(this), effect, timing));
+  Element closest(String selectors) => wrap_jso(_blink.BlinkElement.instance.closest_Callback_1_(unwrap_jso(this), selectors));
   
-  @DomName('Element.blur')
-  @DocsEditable()
-  void blur() => _blink.BlinkElement.instance.blur_Callback_0_(unwrap_jso(this));
-  
-  @DomName('Element.createShadowRoot')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME, '25')
-  @Experimental()
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  ShadowRoot createShadowRoot() => wrap_jso(_blink.BlinkElement.instance.createShadowRoot_Callback_0_(unwrap_jso(this)));
-  
-  @DomName('Element.focus')
-  @DocsEditable()
-  void focus() => _blink.BlinkElement.instance.focus_Callback_0_(unwrap_jso(this));
-  
-  @DomName('Element.getAnimationPlayers')
+  ShadowRoot createShadowRoot([Map shadowRootInitDict]) {
+    if (shadowRootInitDict == null) {
+      return wrap_jso(_blink.BlinkElement.instance.createShadowRoot_Callback_0_(unwrap_jso(this)));
+    }
+    if ((shadowRootInitDict is Map)) {
+      return wrap_jso(_blink.BlinkElement.instance.createShadowRoot_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(shadowRootInitDict)));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('Element.getAnimations')
   @DocsEditable()
   @Experimental() // untriaged
-  List<AnimationPlayer> getAnimationPlayers() => wrap_jso(_blink.BlinkElement.instance.getAnimationPlayers_Callback_0_(unwrap_jso(this)));
+  List<Animation> getAnimations() => wrap_jso(_blink.BlinkElement.instance.getAnimations_Callback_0_(unwrap_jso(this)));
   
   @DomName('Element.getAttribute')
   @DocsEditable()
@@ -15697,7 +16781,7 @@
   
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  List<Node> _getElementsByTagName(String name) => wrap_jso(_blink.BlinkElement.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), name));
+  List<Node> _getElementsByTagName(String localName) => wrap_jso(_blink.BlinkElement.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), localName));
   
   @DomName('Element.hasAttribute')
   @DocsEditable()
@@ -15715,7 +16799,7 @@
   @DomName('Element.insertAdjacentHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  void _insertAdjacentHtml(String where, String html) => _blink.BlinkElement.instance.insertAdjacentHTML_Callback_2_(unwrap_jso(this), where, html);
+  void _insertAdjacentHtml(String position, String text) => _blink.BlinkElement.instance.insertAdjacentHTML_Callback_2_(unwrap_jso(this), position, text);
   
   @DomName('Element.insertAdjacentText')
   @DocsEditable()
@@ -15745,6 +16829,38 @@
   @Experimental() // untriaged
   void requestPointerLock() => _blink.BlinkElement.instance.requestPointerLock_Callback_0_(unwrap_jso(this));
   
+  void scroll([options_OR_x, num y]) {
+    if (options_OR_x == null && y == null) {
+      _blink.BlinkElement.instance.scroll_Callback_0_(unwrap_jso(this));
+      return;
+    }
+    if ((options_OR_x is Map) && y == null) {
+      _blink.BlinkElement.instance.scroll_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      return;
+    }
+    if ((y is num) && (options_OR_x is num)) {
+      _blink.BlinkElement.instance.scroll_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), y);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void scrollBy([options_OR_x, num y]) {
+    if (options_OR_x == null && y == null) {
+      _blink.BlinkElement.instance.scrollBy_Callback_0_(unwrap_jso(this));
+      return;
+    }
+    if ((options_OR_x is Map) && y == null) {
+      _blink.BlinkElement.instance.scrollBy_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      return;
+    }
+    if ((y is num) && (options_OR_x is num)) {
+      _blink.BlinkElement.instance.scrollBy_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), y);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   void _scrollIntoView([bool alignWithTop]) {
     if (alignWithTop != null) {
       _blink.BlinkElement.instance.scrollIntoView_Callback_1_(unwrap_jso(this), alignWithTop);
@@ -15763,13 +16879,43 @@
     return;
   }
 
+  void scrollTo([options_OR_x, num y]) {
+    if (options_OR_x == null && y == null) {
+      _blink.BlinkElement.instance.scrollTo_Callback_0_(unwrap_jso(this));
+      return;
+    }
+    if ((options_OR_x is Map) && y == null) {
+      _blink.BlinkElement.instance.scrollTo_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      return;
+    }
+    if ((y is num) && (options_OR_x is num)) {
+      _blink.BlinkElement.instance.scrollTo_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), y);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('Element.setAttribute')
   @DocsEditable()
   void setAttribute(String name, String value) => _blink.BlinkElement.instance.setAttribute_Callback_2_(unwrap_jso(this), name, value);
   
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void setAttributeNS(String namespaceURI, String qualifiedName, String value) => _blink.BlinkElement.instance.setAttributeNS_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, value);
+  void setAttributeNS(String namespaceURI, String name, String value) => _blink.BlinkElement.instance.setAttributeNS_Callback_3_(unwrap_jso(this), namespaceURI, name, value);
+  
+  @DomName('Element.after')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void after(Object nodes) => _blink.BlinkElement.instance.after_Callback_1_(unwrap_jso(this), nodes);
+  
+  @DomName('Element.before')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void before(Object nodes) => _blink.BlinkElement.instance.before_Callback_1_(unwrap_jso(this), nodes);
+  
+  @DomName('Element.remove')
+  @DocsEditable()
+  void remove() => _blink.BlinkElement.instance.remove_Callback_0_(unwrap_jso(this));
   
   @DomName('Element.nextElementSibling')
   @DocsEditable()
@@ -15779,10 +16925,6 @@
   @DocsEditable()
   Element get previousElementSibling => wrap_jso(_blink.BlinkElement.instance.previousElementSibling_Getter_(unwrap_jso(this)));
   
-  @DomName('Element.remove')
-  @DocsEditable()
-  void remove() => _blink.BlinkElement.instance.remove_Callback_0_(unwrap_jso(this));
-  
   @DomName('Element.childElementCount')
   @DocsEditable()
   int get _childElementCount => _blink.BlinkElement.instance.childElementCount_Getter_(unwrap_jso(this));
@@ -15876,12 +17018,12 @@
   /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
-  ElementStream<Event> get onCopy => copyEvent.forElement(this);
+  ElementStream<ClipboardEvent> get onCopy => copyEvent.forElement(this);
 
   /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
-  ElementStream<Event> get onCut => cutEvent.forElement(this);
+  ElementStream<ClipboardEvent> get onCut => cutEvent.forElement(this);
 
   /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
@@ -16129,7 +17271,7 @@
   /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
-  ElementStream<Event> get onPaste => pasteEvent.forElement(this);
+  ElementStream<ClipboardEvent> get onPaste => pasteEvent.forElement(this);
 
   @DomName('Element.onpause')
   @DocsEditable()
@@ -16365,16 +17507,6 @@
   @DocsEditable()
   set height(String value) => _blink.BlinkHTMLEmbedElement.instance.height_Setter_(unwrap_jso(this), value);
   
-  @DomName('HTMLEmbedElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLEmbedElement.instance.integrity_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLEmbedElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLEmbedElement.instance.integrity_Setter_(unwrap_jso(this), value);
-  
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
   String get name => _blink.BlinkHTMLEmbedElement.instance.name_Getter_(unwrap_jso(this));
@@ -16623,6 +17755,16 @@
   // To suppress missing implicit constructor warnings.
   factory ErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ErrorEvent.ErrorEvent')
+  @DocsEditable()
+  factory ErrorEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkErrorEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static ErrorEvent internalCreateErrorEvent() {
@@ -16716,8 +17858,16 @@
     } while (target != null && target != currentTarget.parent);
     throw new StateError('No selector matched for populating matchedTarget.');
   }
-  // To suppress missing implicit constructor warnings.
-  factory Event._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Event.Event')
+  @DocsEditable()
+  factory Event._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkEvent.instance.constructorCallback_1_(type));
+  }
 
   @Deprecated("Internal Use Only")
   static Event internalCreateEvent() {
@@ -16779,24 +17929,6 @@
   @DocsEditable()
   bool get cancelable => _blink.BlinkEvent.instance.cancelable_Getter_(unwrap_jso(this));
   
-  /**
-   * Access to the system's clipboard data during copy, cut, and paste events.
-   *
-   * ## Other resources
-   *
-   * * [clipboardData specification](http://www.w3.org/TR/clipboard-apis/#attributes)
-   *   from W3C.
-   */
-  @DomName('Event.clipboardData')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // Part of copy/paste
-  @Experimental() // nonstandard
-  DataTransfer get clipboardData => wrap_jso(_blink.BlinkEvent.instance.clipboardData_Getter_(unwrap_jso(this)));
-  
   @DomName('Event.currentTarget')
   @DocsEditable()
   EventTarget get currentTarget => wrap_jso(_blink.BlinkEvent.instance.currentTarget_Getter_(unwrap_jso(this)));
@@ -16822,7 +17954,7 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
   @Experimental()
-  List<Node> get path => wrap_jso(_blink.BlinkEvent.instance.path_Getter_(unwrap_jso(this)));
+  List<EventTarget> get path => wrap_jso(_blink.BlinkEvent.instance.path_Getter_(unwrap_jso(this)));
   
   @DomName('Event.target')
   @DocsEditable()
@@ -16838,7 +17970,7 @@
   
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) => _blink.BlinkEvent.instance.initEvent_Callback_3_(unwrap_jso(this), eventTypeArg, canBubbleArg, cancelableArg);
+  void _initEvent(String type, bool bubbles, bool cancelable) => _blink.BlinkEvent.instance.initEvent_Callback_3_(unwrap_jso(this), type, bubbles, cancelable);
   
   @DomName('Event.preventDefault')
   @DocsEditable()
@@ -16903,10 +18035,10 @@
 
   @DomName('EventSource.EventSource')
   @DocsEditable()
-  static EventSource _factoryEventSource(String url, [Map eventSourceInit]) {
-    if (eventSourceInit != null) {
-      var eventSourceInit_1 = convertDartToNative_Dictionary(eventSourceInit);
-      return wrap_jso(_blink.BlinkEventSource.instance.constructorCallback_2_(url, eventSourceInit_1));
+  static EventSource _factoryEventSource(String url, [Map eventSourceInitDict]) {
+    if (eventSourceInitDict != null) {
+      var eventSourceInitDict_1 = convertDartToNative_Dictionary(eventSourceInitDict);
+      return wrap_jso(_blink.BlinkEventSource.instance.constructorCallback_2_(url, eventSourceInitDict_1));
     }
     return wrap_jso(_blink.BlinkEventSource.instance.constructorCallback_1_(url));
   }
@@ -17110,44 +18242,18 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  void _addEventListener([String type, EventListener listener, bool useCapture]) {
-    if (useCapture != null) {
-      _blink.BlinkEventTarget.instance.addEventListener_Callback_3_(unwrap_jso(this), type, unwrap_jso(js.allowInterop(listener)), useCapture);
-      return;
-    }
-    if (listener != null) {
-      _blink.BlinkEventTarget.instance.addEventListener_Callback_2_(unwrap_jso(this), type, unwrap_jso(js.allowInterop(listener)));
-      return;
-    }
-    if (type != null) {
-      _blink.BlinkEventTarget.instance.addEventListener_Callback_1_(unwrap_jso(this), type);
-      return;
-    }
-    _blink.BlinkEventTarget.instance.addEventListener_Callback_0_(unwrap_jso(this));
-    return;
-  }
-
+  @DomName('EventTarget.addEventListener')
+  @DocsEditable()
+  void _addEventListener(String type, EventListener listener, [bool capture]) => _blink.BlinkEventTarget.instance.addEventListener_Callback_3_(unwrap_jso(this), type, unwrap_jso(js.allowInterop(listener)), capture);
+  
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
   bool dispatchEvent(Event event) => _blink.BlinkEventTarget.instance.dispatchEvent_Callback_1_(unwrap_jso(this), unwrap_jso(event));
   
-  void _removeEventListener([String type, EventListener listener, bool useCapture]) {
-    if (useCapture != null) {
-      _blink.BlinkEventTarget.instance.removeEventListener_Callback_3_(unwrap_jso(this), type, unwrap_jso(js.allowInterop(listener)), useCapture);
-      return;
-    }
-    if (listener != null) {
-      _blink.BlinkEventTarget.instance.removeEventListener_Callback_2_(unwrap_jso(this), type, unwrap_jso(js.allowInterop(listener)));
-      return;
-    }
-    if (type != null) {
-      _blink.BlinkEventTarget.instance.removeEventListener_Callback_1_(unwrap_jso(this), type);
-      return;
-    }
-    _blink.BlinkEventTarget.instance.removeEventListener_Callback_0_(unwrap_jso(this));
-    return;
-  }
-
+  @DomName('EventTarget.removeEventListener')
+  @DocsEditable()
+  void _removeEventListener(String type, EventListener listener, [bool capture]) => _blink.BlinkEventTarget.instance.removeEventListener_Callback_3_(unwrap_jso(this), type, unwrap_jso(js.allowInterop(listener)), capture);
+  
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -17163,6 +18269,16 @@
   // To suppress missing implicit constructor warnings.
   factory ExtendableEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ExtendableEvent.ExtendableEvent')
+  @DocsEditable()
+  factory ExtendableEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkExtendableEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkExtendableEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static ExtendableEvent internalCreateExtendableEvent() {
@@ -17197,8 +18313,9 @@
 
   @DomName('FederatedCredential.FederatedCredential')
   @DocsEditable()
-  factory FederatedCredential(String id, String name, String avatarURL, String federation) {
-    return wrap_jso(_blink.BlinkFederatedCredential.instance.constructorCallback_4_(id, name, avatarURL, federation));
+  factory FederatedCredential(Map data) {
+    var data_1 = convertDartToNative_Dictionary(data);
+    return wrap_jso(_blink.BlinkFederatedCredential.instance.constructorCallback_1_(data_1));
   }
 
 
@@ -17213,10 +18330,15 @@
   FederatedCredential.internal_() : super.internal_();
 
 
-  @DomName('FederatedCredential.federation')
+  @DomName('FederatedCredential.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get federation => _blink.BlinkFederatedCredential.instance.federation_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkFederatedCredential.instance.protocol_Getter_(unwrap_jso(this));
+  
+  @DomName('FederatedCredential.provider')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get provider => _blink.BlinkFederatedCredential.instance.provider_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17229,10 +18351,20 @@
 @DocsEditable()
 @DomName('FetchEvent')
 @Experimental() // untriaged
-class FetchEvent extends Event {
+class FetchEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
   factory FetchEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('FetchEvent.FetchEvent')
+  @DocsEditable()
+  factory FetchEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkFetchEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkFetchEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static FetchEvent internalCreateFetchEvent() {
@@ -17307,7 +18439,7 @@
   
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  List<Node> get elements => wrap_jso(_blink.BlinkHTMLFieldSetElement.instance.elements_Getter_(unwrap_jso(this)));
+  HtmlFormControlsCollection get elements => wrap_jso(_blink.BlinkHTMLFieldSetElement.instance.elements_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
@@ -17341,6 +18473,11 @@
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLFieldSetElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLFieldSetElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLFieldSetElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLFieldSetElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) => _blink.BlinkHTMLFieldSetElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
@@ -17359,6 +18496,16 @@
   // To suppress missing implicit constructor warnings.
   factory File._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('File.File')
+  @DocsEditable()
+  factory File(List<Object> fileBits, String fileName, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return wrap_jso(_blink.BlinkFile.instance.constructorCallback_3_(fileBits, fileName, options_1));
+    }
+    return wrap_jso(_blink.BlinkFile.instance.constructorCallback_2_(fileBits, fileName));
+  }
+
 
   @Deprecated("Internal Use Only")
   static File internalCreateFile() {
@@ -17765,9 +18912,9 @@
   @DocsEditable()
   void readAsDataUrl(Blob blob) => _blink.BlinkFileReader.instance.readAsDataURL_Callback_1_(unwrap_jso(this), unwrap_jso(blob));
   
-  void readAsText(Blob blob, [String encoding]) {
-    if (encoding != null) {
-      _blink.BlinkFileReader.instance.readAsText_Callback_2_(unwrap_jso(this), unwrap_jso(blob), encoding);
+  void readAsText(Blob blob, [String label]) {
+    if (label != null) {
+      _blink.BlinkFileReader.instance.readAsText_Callback_2_(unwrap_jso(this), unwrap_jso(blob), label);
       return;
     }
     _blink.BlinkFileReader.instance.readAsText_Callback_1_(unwrap_jso(this), unwrap_jso(blob));
@@ -18080,6 +19227,16 @@
   // To suppress missing implicit constructor warnings.
   factory FocusEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('FocusEvent.FocusEvent')
+  @DocsEditable()
+  factory FocusEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkFocusEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkFocusEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static FocusEvent internalCreateFocusEvent() {
@@ -18113,29 +19270,12 @@
 
   @DomName('FontFace.FontFace')
   @DocsEditable()
-  factory FontFace(String family, source, [Map descriptors]) {
-    if ((source is String || source == null) && (family is String || family == null) && descriptors == null) {
-      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_2_(family, source));
-    }
-    if ((descriptors is Map || descriptors == null) && (source is String || source == null) && (family is String || family == null)) {
+  factory FontFace(String family, Object source, [Map descriptors]) {
+    if (descriptors != null) {
       var descriptors_1 = convertDartToNative_Dictionary(descriptors);
       return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors_1));
     }
-    if ((source is TypedData || source == null) && (family is String || family == null) && descriptors == null) {
-      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_2_(family, source));
-    }
-    if ((descriptors is Map || descriptors == null) && (source is TypedData || source == null) && (family is String || family == null)) {
-      var descriptors_1 = convertDartToNative_Dictionary(descriptors);
-      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors_1));
-    }
-    if ((source is ByteBuffer || source == null) && (family is String || family == null) && descriptors == null) {
-      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_2_(family, source));
-    }
-    if ((descriptors is Map || descriptors == null) && (source is ByteBuffer || source == null) && (family is String || family == null)) {
-      var descriptors_1 = convertDartToNative_Dictionary(descriptors);
-      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors_1));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_2_(family, source));
   }
 
   @Deprecated("Internal Use Only")
@@ -18404,6 +19544,42 @@
   @DocsEditable()
   void appendBlob(String name, Blob value, [String filename]) => _blink.BlinkFormData.instance.append_Callback_3_(unwrap_jso(this), name, unwrap_jso(value), filename);
   
+  @DomName('FormData.delete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void delete(String name) => _blink.BlinkFormData.instance.delete_Callback_1_(unwrap_jso(this), name);
+  
+  @DomName('FormData.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object get(String name) => wrap_jso(_blink.BlinkFormData.instance.get_Callback_1_(unwrap_jso(this), name));
+  
+  @DomName('FormData.getAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Object> getAll(String name) => _blink.BlinkFormData.instance.getAll_Callback_1_(unwrap_jso(this), name);
+  
+  @DomName('FormData.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool has(String name) => _blink.BlinkFormData.instance.has_Callback_1_(unwrap_jso(this), name);
+  
+  void set(String name, value, [String filename]) {
+    if ((value is Blob || value == null) && (name is String || name == null) && filename == null) {
+      _blink.BlinkFormData.instance.set_Callback_2_(unwrap_jso(this), name, unwrap_jso(value));
+      return;
+    }
+    if ((filename is String || filename == null) && (value is Blob || value == null) && (name is String || name == null)) {
+      _blink.BlinkFormData.instance.set_Callback_3_(unwrap_jso(this), name, unwrap_jso(value), filename);
+      return;
+    }
+    if ((value is String || value == null) && (name is String || name == null) && filename == null) {
+      _blink.BlinkFormData.instance.set_Callback_2_(unwrap_jso(this), name, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18520,20 +19696,24 @@
   @DocsEditable()
   set target(String value) => _blink.BlinkHTMLFormElement.instance.target_Setter_(unwrap_jso(this), value);
   
-  Element __getter__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
-      return wrap_jso(_blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name)));
-    }
-    if ((index_OR_name is String || index_OR_name == null)) {
-      return wrap_jso(_blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name)));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
+  @DomName('HTMLFormElement.__getter__')
+  @DocsEditable()
+  Object __getter__(String name) => wrap_jso(_blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(unwrap_jso(this), name));
+  
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLFormElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLFormElement.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element item(int index) => wrap_jso(_blink.BlinkHTMLFormElement.instance.item_Callback_1_(unwrap_jso(this), index));
+  
+  @DomName('HTMLFormElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLFormElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
@@ -18556,6 +19736,16 @@
 // WARNING: Do not edit - generated code.
 
 
+@DomName('FrameRequestCallback')
+@Experimental() // untriaged
+typedef void FrameRequestCallback(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('Gamepad')
 // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepad-interface
@@ -18583,6 +19773,10 @@
   @DocsEditable()
   List<num> get axes => wrap_jso(_blink.BlinkGamepad.instance.axes_Getter_(unwrap_jso(this)));
   
+  @DomName('Gamepad.buttons')
+  @DocsEditable()
+  List<GamepadButton> get buttons => wrap_jso(_blink.BlinkGamepad.instance.buttons_Getter_(unwrap_jso(this)));
+  
   @DomName('Gamepad.connected')
   @DocsEditable()
   @Experimental() // untriaged
@@ -18660,6 +19854,16 @@
   // To suppress missing implicit constructor warnings.
   factory GamepadEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('GamepadEvent.GamepadEvent')
+  @DocsEditable()
+  factory GamepadEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkGamepadEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkGamepadEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static GamepadEvent internalCreateGamepadEvent() {
@@ -18731,6 +19935,43 @@
 
 
 @DocsEditable()
+@DomName('GeofencingEvent')
+@Experimental() // untriaged
+class GeofencingEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory GeofencingEvent._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static GeofencingEvent internalCreateGeofencingEvent() {
+    return new GeofencingEvent._internalWrap();
+  }
+
+  external factory GeofencingEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  GeofencingEvent.internal_() : super.internal_();
+
+
+  @DomName('GeofencingEvent.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get id => _blink.BlinkGeofencingEvent.instance.id_Getter_(unwrap_jso(this));
+  
+  @DomName('GeofencingEvent.region')
+  @DocsEditable()
+  @Experimental() // untriaged
+  GeofencingRegion get region => wrap_jso(_blink.BlinkGeofencingEvent.instance.region_Getter_(unwrap_jso(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('GeofencingRegion')
 @Experimental() // untriaged
 class GeofencingRegion extends DartHtmlDomObject {
@@ -19535,8 +20776,16 @@
     return event;
   }
 
-  // To suppress missing implicit constructor warnings.
-  factory HashChangeEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HashChangeEvent.HashChangeEvent')
+  @DocsEditable()
+  factory HashChangeEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkHashChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkHashChangeEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -19622,13 +20871,16 @@
     if (input == null) {
       return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_0_());
     }
-    if ((input is Headers || input == null)) {
+    if ((input is Headers)) {
       return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_1_(input));
     }
-    if ((input is Map || input == null)) {
+    if ((input is Map)) {
       var input_1 = convertDartToNative_Dictionary(input);
       return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_1_(input_1));
     }
+    if ((input is List<Object>)) {
+      return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_1_(input));
+    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
@@ -19647,20 +20899,6 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('Headers.size')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int get size => _blink.BlinkHeaders.instance.size_Getter_(unwrap_jso(this));
-  
-  void forEach(HeadersForEachCallback callback, [Object thisArg]) {
-    if (thisArg != null) {
-      _blink.BlinkHeaders.instance.forEach_Callback_2_(unwrap_jso(this), unwrap_jso((String value, String key, map) => callback(value, key, wrap_jso(map))), thisArg);
-      return;
-    }
-    _blink.BlinkHeaders.instance.forEach_Callback_1_(unwrap_jso(this), unwrap_jso((String value, String key, map) => callback(value, key, wrap_jso(map))));
-    return;
-  }
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -19669,16 +20907,6 @@
 // WARNING: Do not edit - generated code.
 
 
-@DomName('HeadersForEachCallback')
-@Experimental() // untriaged
-typedef void HeadersForEachCallback(String value, String key, Headers map);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source 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 HtmlElement {
@@ -19768,6 +20996,11 @@
   @DocsEditable()
   int get length => _blink.BlinkHistory.instance.length_Getter_(unwrap_jso(this));
   
+  @DomName('History.options')
+  @DocsEditable()
+  @Experimental() // untriaged
+   get options => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkHistory.instance.options_Getter_(unwrap_jso(this))));
+  
   @DomName('History.state')
   @DocsEditable()
   dynamic get state => wrap_jso(_blink.BlinkHistory.instance.state_Getter_(unwrap_jso(this)));
@@ -19780,26 +21013,78 @@
   @DocsEditable()
   void forward() => _blink.BlinkHistory.instance.forward_Callback_0_(unwrap_jso(this));
   
-  @DomName('History.go')
-  @DocsEditable()
-  void go(int distance) => _blink.BlinkHistory.instance.go_Callback_1_(unwrap_jso(this), distance);
-  
-  @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]) => _blink.BlinkHistory.instance.pushState_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url);
-  
-  @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]) => _blink.BlinkHistory.instance.replaceState_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url);
+  void go([int delta]) {
+    if (delta != null) {
+      _blink.BlinkHistory.instance.go_Callback_1_(unwrap_jso(this), delta);
+      return;
+    }
+    _blink.BlinkHistory.instance.go_Callback_0_(unwrap_jso(this));
+    return;
   }
+
+  void pushState(/*SerializedScriptValue*/ data, String title, String url, [Map options]) {
+    if (options != null) {
+      _blink.BlinkHistory.instance.pushState_Callback_4_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url, convertDartToNative_Dictionary(options));
+      return;
+    }
+    _blink.BlinkHistory.instance.pushState_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url);
+    return;
+  }
+
+  void replaceState(/*SerializedScriptValue*/ data, String title, String url, [Map options]) {
+    if (options != null) {
+      _blink.BlinkHistory.instance.replaceState_Callback_4_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url, convertDartToNative_Dictionary(options));
+      return;
+    }
+    _blink.BlinkHistory.instance.replaceState_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url);
+    return;
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('HMDVRDevice')
+@Experimental() // untriaged
+class HmdvrDevice extends VRDevice {
+  // To suppress missing implicit constructor warnings.
+  factory HmdvrDevice._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static HmdvrDevice internalCreateHmdvrDevice() {
+    return new HmdvrDevice._internalWrap();
+  }
+
+  external factory HmdvrDevice._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  HmdvrDevice.internal_() : super.internal_();
+
+
+  @DomName('HMDVRDevice.getEyeParameters')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VREyeParameters getEyeParameters(String whichEye) => wrap_jso(_blink.BlinkHMDVRDevice.instance.getEyeParameters_Callback_1_(unwrap_jso(this), whichEye));
+  
+  void setFieldOfView([VRFieldOfView leftFov, VRFieldOfView rightFov]) {
+    if (rightFov != null) {
+      _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_2_(unwrap_jso(this), unwrap_jso(leftFov), unwrap_jso(rightFov));
+      return;
+    }
+    if (leftFov != null) {
+      _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_1_(unwrap_jso(this), unwrap_jso(leftFov));
+      return;
+    }
+    _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_0_(unwrap_jso(this));
+    return;
+  }
+
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -20759,11 +22044,6 @@
   @DocsEditable()
   set hidden(bool value) => _blink.BlinkHTMLElement.instance.hidden_Setter_(unwrap_jso(this), value);
   
-  @DomName('HTMLElement.inputMethodContext')
-  @DocsEditable()
-  @Experimental() // untriaged
-  InputMethodContext get inputMethodContext => wrap_jso(_blink.BlinkHTMLElement.instance.inputMethodContext_Getter_(unwrap_jso(this)));
-  
   @DomName('HTMLElement.isContentEditable')
   @DocsEditable()
   bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(unwrap_jso(this));
@@ -20788,6 +22068,11 @@
   @Experimental() // nonstandard
   set spellcheck(bool value) => _blink.BlinkHTMLElement.instance.spellcheck_Setter_(unwrap_jso(this), value);
   
+  @DomName('HTMLElement.style')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssStyleDeclaration get style => wrap_jso(_blink.BlinkHTMLElement.instance.style_Getter_(unwrap_jso(this)));
+  
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
   int get tabIndex => _blink.BlinkHTMLElement.instance.tabIndex_Getter_(unwrap_jso(this));
@@ -20828,10 +22113,20 @@
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
   set dropzone(String value) => _blink.BlinkHTMLElement.instance.webkitdropzone_Setter_(unwrap_jso(this), value);
   
+  @DomName('HTMLElement.blur')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blur() => _blink.BlinkHTMLElement.instance.blur_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLElement.click')
   @DocsEditable()
   void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLElement.focus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void focus() => _blink.BlinkHTMLElement.instance.focus_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLElement.onabort')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21130,6 +22425,11 @@
   HtmlFormControlsCollection.internal_() : super.internal_();
 
 
+  @DomName('HTMLFormControlsCollection.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Node item(int index) => wrap_jso(_blink.BlinkHTMLFormControlsCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+  
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable()
   Object namedItem(String name) => wrap_jso(_blink.BlinkHTMLFormControlsCollection.instance.namedItem_Callback_1_(unwrap_jso(this), name));
@@ -21196,6 +22496,11 @@
   HtmlOptionsCollection.internal_() : super.internal_();
 
 
+  @DomName('HTMLOptionsCollection.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Node _item(int index) => wrap_jso(_blink.BlinkHTMLOptionsCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+  
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21589,10 +22894,9 @@
    */
   @DomName('XMLHttpRequest.XMLHttpRequest')
   @DocsEditable()
-  factory HttpRequest() => wrap_jso(_create());
-
-  @DocsEditable()
-  static HttpRequest _create() => wrap_jso(_blink.BlinkXMLHttpRequest.instance.constructorCallback_0_());
+  factory HttpRequest() {
+    return wrap_jso(_blink.BlinkXMLHttpRequest.instance.constructorCallback_0_());
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -21850,7 +23154,7 @@
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable()
   @Unstable()
-  String getResponseHeader(String header) => _blink.BlinkXMLHttpRequest.instance.getResponseHeader_Callback_1_(unwrap_jso(this), header);
+  String getResponseHeader(String name) => _blink.BlinkXMLHttpRequest.instance.getResponseHeader_Callback_1_(unwrap_jso(this), name);
   
   /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
@@ -21864,25 +23168,44 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void overrideMimeType(String override) => _blink.BlinkXMLHttpRequest.instance.overrideMimeType_Callback_1_(unwrap_jso(this), override);
+  void overrideMimeType(String mime) => _blink.BlinkXMLHttpRequest.instance.overrideMimeType_Callback_1_(unwrap_jso(this), mime);
   
-  /**
-   * Send the request with any given `data`.
-   *
-   * Note: Most simple HTTP requests can be accomplished using the [getString],
-   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `send` method is intended only for more complext HTTP requests where
-   * finer-grained control is needed.
-   *
-   * ## Other resources
-   *
-   * * [XMLHttpRequest.send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
-   *   from MDN.
-   */
-  @DomName('XMLHttpRequest.send')
-  @DocsEditable()
-  void send([data]) => _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
-  
+  void send([body_OR_data]) {
+    if (body_OR_data != null) {
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      return;
+    }
+    if ((body_OR_data is TypedData || body_OR_data == null)) {
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      return;
+    }
+    if ((body_OR_data is ByteBuffer || body_OR_data == null)) {
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      return;
+    }
+    if ((body_OR_data is Document || body_OR_data == null)) {
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      return;
+    }
+    if ((body_OR_data is String || body_OR_data == null)) {
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      return;
+    }
+    if ((body_OR_data is FormData || body_OR_data == null)) {
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      return;
+    }
+    if ((body_OR_data is Blob || body_OR_data == null)) {
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      return;
+    }
+    if (body_OR_data == null) {
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_0_(unwrap_jso(this));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   /**
    * Sets the value of an HTTP requst header.
    *
@@ -21902,7 +23225,7 @@
    */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
-  void setRequestHeader(String header, String value) => _blink.BlinkXMLHttpRequest.instance.setRequestHeader_Callback_2_(unwrap_jso(this), header, value);
+  void setRequestHeader(String name, String value) => _blink.BlinkXMLHttpRequest.instance.setRequestHeader_Callback_2_(unwrap_jso(this), name, value);
   
   /// Stream of `readystatechange` events handled by this [HttpRequest].
 /**
@@ -22153,16 +23476,6 @@
   @DocsEditable()
   set height(String value) => _blink.BlinkHTMLIFrameElement.instance.height_Setter_(unwrap_jso(this), value);
   
-  @DomName('HTMLIFrameElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLIFrameElement.instance.integrity_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLIFrameElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLIFrameElement.instance.integrity_Setter_(unwrap_jso(this), value);
-  
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
   String get name => _blink.BlinkHTMLIFrameElement.instance.name_Getter_(unwrap_jso(this));
@@ -22173,11 +23486,7 @@
   
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  String get sandbox => _blink.BlinkHTMLIFrameElement.instance.sandbox_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLIFrameElement.sandbox')
-  @DocsEditable()
-  set sandbox(String value) => _blink.BlinkHTMLIFrameElement.instance.sandbox_Setter_(unwrap_jso(this), value);
+  DomSettableTokenList get sandbox => wrap_jso(_blink.BlinkHTMLIFrameElement.instance.sandbox_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
@@ -22264,12 +23573,15 @@
 
   @DomName('ImageData.ImageData')
   @DocsEditable()
-  factory ImageData(data_OR_width, int height_OR_width, [int height]) {
-    if ((height_OR_width is int || height_OR_width == null) && (data_OR_width is int || data_OR_width == null) && height == null) {
-      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_2_(data_OR_width, height_OR_width));
+  factory ImageData(data_OR_sw, int sh_OR_sw, [int sh]) {
+    if ((sh_OR_sw is int) && (data_OR_sw is int) && sh == null) {
+      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_2_(data_OR_sw, sh_OR_sw));
     }
-    if ((height is int || height == null) && (height_OR_width is int || height_OR_width == null) && (data_OR_width is Uint8ClampedList || data_OR_width == null)) {
-      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_3_(data_OR_width, height_OR_width, height));
+    if ((sh_OR_sw is int) && (data_OR_sw is Uint8ClampedList) && sh == null) {
+      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_2_(data_OR_sw, sh_OR_sw));
+    }
+    if ((sh is int) && (sh_OR_sw is int) && (data_OR_sw is Uint8ClampedList)) {
+      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_3_(data_OR_sw, sh_OR_sw, sh));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -22291,7 +23603,7 @@
 
   @DomName('ImageData.data')
   @DocsEditable()
-  Uint8ClampedList get _data => _blink.BlinkImageData.instance.data_Getter_(unwrap_jso(this));
+  Uint8ClampedList get _data => wrap_jso(_blink.BlinkImageData.instance.data_Getter_(unwrap_jso(this)));
   
   @DomName('ImageData.height')
   @DocsEditable()
@@ -22373,16 +23685,6 @@
   @DocsEditable()
   set height(int value) => _blink.BlinkHTMLImageElement.instance.height_Setter_(unwrap_jso(this), value);
   
-  @DomName('HTMLImageElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLImageElement.instance.integrity_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLImageElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLImageElement.instance.integrity_Setter_(unwrap_jso(this), value);
-  
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
   bool get isMap => _blink.BlinkHTMLImageElement.instance.isMap_Getter_(unwrap_jso(this));
@@ -22483,6 +23785,51 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('InputDevice')
+@Experimental() // untriaged
+class InputDevice extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory InputDevice._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('InputDevice.InputDevice')
+  @DocsEditable()
+  factory InputDevice([Map deviceInitDict]) {
+    if (deviceInitDict != null) {
+      var deviceInitDict_1 = convertDartToNative_Dictionary(deviceInitDict);
+      return wrap_jso(_blink.BlinkInputDevice.instance.constructorCallback_1_(deviceInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkInputDevice.instance.constructorCallback_0_());
+  }
+
+  @Deprecated("Internal Use Only")
+  static InputDevice internalCreateInputDevice() {
+    return new InputDevice._internalWrap();
+  }
+
+  factory InputDevice._internalWrap() {
+    return new InputDevice.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  InputDevice.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('InputDevice.firesTouchEvents')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get firesTouchEvents => _blink.BlinkInputDevice.instance.firesTouchEvents_Getter_(unwrap_jso(this));
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 
 @DomName('HTMLInputElement')
 class InputElement extends HtmlElement implements
@@ -22556,6 +23903,16 @@
   @DocsEditable()
   set alt(String value) => _blink.BlinkHTMLInputElement.instance.alt_Setter_(unwrap_jso(this), value);
   
+  @DomName('HTMLInputElement.autocapitalize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get autocapitalize => _blink.BlinkHTMLInputElement.instance.autocapitalize_Getter_(unwrap_jso(this));
+  
+  @DomName('HTMLInputElement.autocapitalize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set autocapitalize(String value) => _blink.BlinkHTMLInputElement.instance.autocapitalize_Setter_(unwrap_jso(this), value);
+  
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
   String get autocomplete => _blink.BlinkHTMLInputElement.instance.autocomplete_Getter_(unwrap_jso(this));
@@ -22744,6 +24101,16 @@
   @DocsEditable()
   set min(String value) => _blink.BlinkHTMLInputElement.instance.min_Setter_(unwrap_jso(this), value);
   
+  @DomName('HTMLInputElement.minLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get minLength => _blink.BlinkHTMLInputElement.instance.minLength_Getter_(unwrap_jso(this));
+  
+  @DomName('HTMLInputElement.minLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set minLength(int value) => _blink.BlinkHTMLInputElement.instance.minLength_Setter_(unwrap_jso(this), value);
+  
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
   bool get multiple => _blink.BlinkHTMLInputElement.instance.multiple_Getter_(unwrap_jso(this));
@@ -22920,6 +24287,11 @@
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLInputElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLInputElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLInputElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLInputElement.select')
   @DocsEditable()
   void select() => _blink.BlinkHTMLInputElement.instance.select_Callback_0_(unwrap_jso(this));
@@ -23531,94 +24903,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('InputMethodContext')
-// http://www.w3.org/TR/ime-api/#idl-def-InputMethodContext
-@Experimental()
-class InputMethodContext extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory InputMethodContext._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static InputMethodContext internalCreateInputMethodContext() {
-    return new InputMethodContext._internalWrap();
-  }
-
-  external factory InputMethodContext._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  InputMethodContext.internal_() : super.internal_();
-
-
-  @DomName('InputMethodContext.compositionEndOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int get compositionEndOffset => _blink.BlinkInputMethodContext.instance.compositionEndOffset_Getter_(unwrap_jso(this));
-  
-  @DomName('InputMethodContext.compositionStartOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int get compositionStartOffset => _blink.BlinkInputMethodContext.instance.compositionStartOffset_Getter_(unwrap_jso(this));
-  
-  @DomName('InputMethodContext.locale')
-  @DocsEditable()
-  String get locale => _blink.BlinkInputMethodContext.instance.locale_Getter_(unwrap_jso(this));
-  
-  @DomName('InputMethodContext.target')
-  @DocsEditable()
-  @Experimental() // untriaged
-  HtmlElement get target => wrap_jso(_blink.BlinkInputMethodContext.instance.target_Getter_(unwrap_jso(this)));
-  
-  @DomName('InputMethodContext.confirmComposition')
-  @DocsEditable()
-  void confirmComposition() => _blink.BlinkInputMethodContext.instance.confirmComposition_Callback_0_(unwrap_jso(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('InstallEvent')
-@Experimental() // untriaged
-class InstallEvent extends ExtendableEvent {
-  // To suppress missing implicit constructor warnings.
-  factory InstallEvent._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static InstallEvent internalCreateInstallEvent() {
-    return new InstallEvent._internalWrap();
-  }
-
-  external factory InstallEvent._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  InstallEvent.internal_() : super.internal_();
-
-
-  @DomName('InstallEvent.reloadAll')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future reloadAll() => wrap_jso(_blink.BlinkInstallEvent.instance.reloadAll_Callback_0_(unwrap_jso(this)));
-  
-  @DomName('InstallEvent.replace')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void replace() => _blink.BlinkInstallEvent.instance.replace_Callback_0_(unwrap_jso(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('KeyboardEvent')
 class KeyboardEvent extends UIEvent {
@@ -23641,8 +24925,19 @@
 
   @DomName('KeyboardEvent.charCode')
   int get charCode => _charCode;
-  // To suppress missing implicit constructor warnings.
-  factory KeyboardEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('KeyboardEvent.which')
+  int get which => _which;
+
+  @DomName('KeyboardEvent.KeyboardEvent')
+  @DocsEditable()
+  factory KeyboardEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkKeyboardEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkKeyboardEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -23680,10 +24975,20 @@
   @DocsEditable()
   bool get altKey => _blink.BlinkKeyboardEvent.instance.altKey_Getter_(unwrap_jso(this));
   
+  @DomName('KeyboardEvent.code')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get code => _blink.BlinkKeyboardEvent.instance.code_Getter_(unwrap_jso(this));
+  
   @DomName('KeyboardEvent.ctrlKey')
   @DocsEditable()
   bool get ctrlKey => _blink.BlinkKeyboardEvent.instance.ctrlKey_Getter_(unwrap_jso(this));
   
+  @DomName('KeyboardEvent.key')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get key => _blink.BlinkKeyboardEvent.instance.key_Getter_(unwrap_jso(this));
+  
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -23715,11 +25020,11 @@
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
-  bool getModifierState(String keyArgument) => _blink.BlinkKeyboardEvent.instance.getModifierState_Callback_1_(unwrap_jso(this), keyArgument);
+  bool getModifierState(String keyArg) => _blink.BlinkKeyboardEvent.instance.getModifierState_Callback_1_(unwrap_jso(this), keyArg);
   
   @DomName('KeyboardEvent.initKeyboardEvent')
   @DocsEditable()
-  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkKeyboardEvent.instance.initKeyboardEvent_Callback_10_(unwrap_jso(this), type, canBubble, cancelable, unwrap_jso(view), keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
+  void _initKeyboardEvent(String type, bool bubbles, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkKeyboardEvent.instance.initKeyboardEvent_Callback_10_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(view), keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23730,6 +25035,49 @@
 
 
 @DocsEditable()
+@DomName('KeyframeEffect')
+@Experimental() // untriaged
+class KeyframeEffect extends AnimationEffectReadOnly {
+  // To suppress missing implicit constructor warnings.
+  factory KeyframeEffect._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('KeyframeEffect.KeyframeEffect')
+  @DocsEditable()
+  factory KeyframeEffect(Element target, List<Map> keyframes, [timing]) {
+    if ((keyframes is List<Map>) && (target is Element || target == null) && timing == null) {
+      return wrap_jso(_blink.BlinkKeyframeEffect.instance.constructorCallback_2_(target, keyframes));
+    }
+    if ((timing is num) && (keyframes is List<Map>) && (target is Element || target == null)) {
+      return wrap_jso(_blink.BlinkKeyframeEffect.instance.constructorCallback_3_(target, keyframes, timing));
+    }
+    if ((timing is Map) && (keyframes is List<Map>) && (target is Element || target == null)) {
+      var timing_1 = convertDartToNative_Dictionary(timing);
+      return wrap_jso(_blink.BlinkKeyframeEffect.instance.constructorCallback_3_(target, keyframes, timing_1));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static KeyframeEffect internalCreateKeyframeEffect() {
+    return new KeyframeEffect._internalWrap();
+  }
+
+  external factory KeyframeEffect._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  KeyframeEffect.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('HTMLKeygenElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -23833,6 +25181,11 @@
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLKeygenElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLKeygenElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLKeygenElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLKeygenElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) => _blink.BlinkHTMLKeygenElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
@@ -24095,44 +25448,6 @@
     return 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('LocalCredential')
-@Experimental() // untriaged
-class LocalCredential extends Credential {
-  // To suppress missing implicit constructor warnings.
-  factory LocalCredential._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('LocalCredential.LocalCredential')
-  @DocsEditable()
-  factory LocalCredential(String id, String name, String avatarURL, String password) {
-    return wrap_jso(_blink.BlinkLocalCredential.instance.constructorCallback_4_(id, name, avatarURL, password));
-  }
-
-
-  @Deprecated("Internal Use Only")
-  static LocalCredential internalCreateLocalCredential() {
-    return new LocalCredential._internalWrap();
-  }
-
-  external factory LocalCredential._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  LocalCredential.internal_() : super.internal_();
-
-
-  @DomName('LocalCredential.password')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get password => _blink.BlinkLocalCredential.instance.password_Getter_(unwrap_jso(this));
-  
-}
 // 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.
@@ -24260,27 +25575,6 @@
 // WARNING: Do not edit - generated code.
 
 
-@DomName('MIDIErrorCallback')
-// http://webaudio.github.io/web-midi-api/#midierrorcallback
-@Experimental()
-typedef void MidiErrorCallback(DomError 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.
-
-
-@DomName('MIDISuccessCallback')
-@Experimental() // untriaged
-typedef void MidiSuccessCallback(MidiAccess access, bool sysex);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source 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 HtmlElement {
@@ -24489,9 +25783,39 @@
 // WARNING: Do not edit - generated code.
 
 
-@DomName('MediaDeviceInfoCallback')
+@DocsEditable()
+@DomName('MediaDevices')
 @Experimental() // untriaged
-typedef void MediaDeviceInfoCallback(List<MediaDeviceInfo> devices);
+class MediaDevices extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory MediaDevices._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static MediaDevices internalCreateMediaDevices() {
+    return new MediaDevices._internalWrap();
+  }
+
+  factory MediaDevices._internalWrap() {
+    return new MediaDevices.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  MediaDevices.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('MediaDevices.enumerateDevices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future enumerateDevices() => wrap_jso(_blink.BlinkMediaDevices.instance.enumerateDevices_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('MediaDevices.getUserMedia')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getUserMedia(Map options) => wrap_jso(_blink.BlinkMediaDevices.instance.getUserMedia_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(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.
@@ -24699,16 +26023,6 @@
   @DocsEditable()
   MediaError get error => wrap_jso(_blink.BlinkHTMLMediaElement.instance.error_Getter_(unwrap_jso(this)));
   
-  @DomName('HTMLMediaElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLMediaElement.instance.integrity_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLMediaElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLMediaElement.instance.integrity_Setter_(unwrap_jso(this), value);
-  
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
   bool get loop => _blink.BlinkHTMLMediaElement.instance.loop_Getter_(unwrap_jso(this));
@@ -24779,6 +26093,21 @@
   @DocsEditable()
   bool get seeking => _blink.BlinkHTMLMediaElement.instance.seeking_Getter_(unwrap_jso(this));
   
+  @DomName('HTMLMediaElement.session')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaSession get session => wrap_jso(_blink.BlinkHTMLMediaElement.instance.session_Getter_(unwrap_jso(this)));
+  
+  @DomName('HTMLMediaElement.session')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set session(MediaSession value) => _blink.BlinkHTMLMediaElement.instance.session_Setter_(unwrap_jso(this), unwrap_jso(value));
+  
+  @DomName('HTMLMediaElement.sinkId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get sinkId => _blink.BlinkHTMLMediaElement.instance.sinkId_Getter_(unwrap_jso(this));
+  
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
   String get src => _blink.BlinkHTMLMediaElement.instance.src_Getter_(unwrap_jso(this));
@@ -24833,10 +26162,16 @@
   }
 
   String canPlayType(String type, [String keySystem]) {
-    if (keySystem != null) {
+    if ((type is String) && keySystem == null) {
+      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(unwrap_jso(this), type);
+    }
+    if ((type is String || type == null) && keySystem == null) {
+      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(unwrap_jso(this), type);
+    }
+    if ((keySystem is String || keySystem == null) && (type is String || type == null)) {
       return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_2_(unwrap_jso(this), type, keySystem);
     }
-    return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(unwrap_jso(this), type);
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('HTMLMediaElement.load')
@@ -24856,12 +26191,17 @@
   @Experimental() // untriaged
   Future setMediaKeys(MediaKeys mediaKeys) => wrap_jso(_blink.BlinkHTMLMediaElement.instance.setMediaKeys_Callback_1_(unwrap_jso(this), unwrap_jso(mediaKeys)));
   
+  @DomName('HTMLMediaElement.setSinkId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future setSinkId(String sinkId) => wrap_jso(_blink.BlinkHTMLMediaElement.instance.setSinkId_Callback_1_(unwrap_jso(this), sinkId));
+  
   void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) {
     if (initData != null) {
-      _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_4_(unwrap_jso(this), keySystem, key, initData, sessionId);
+      _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_4_(unwrap_jso(this), keySystem, unwrap_jso(key), unwrap_jso(initData), sessionId);
       return;
     }
-    _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_2_(unwrap_jso(this), keySystem, key);
+    _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_2_(unwrap_jso(this), keySystem, unwrap_jso(key));
     return;
   }
 
@@ -24875,7 +26215,7 @@
   
   void generateKeyRequest(String keySystem, [Uint8List initData]) {
     if (initData != null) {
-      _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_2_(unwrap_jso(this), keySystem, initData);
+      _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_2_(unwrap_jso(this), keySystem, unwrap_jso(initData));
       return;
     }
     _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_1_(unwrap_jso(this), keySystem);
@@ -24919,6 +26259,53 @@
 
 
 @DocsEditable()
+@DomName('MediaEncryptedEvent')
+@Experimental() // untriaged
+class MediaEncryptedEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory MediaEncryptedEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaEncryptedEvent.MediaEncryptedEvent')
+  @DocsEditable()
+  factory MediaEncryptedEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMediaEncryptedEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMediaEncryptedEvent.instance.constructorCallback_1_(type));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static MediaEncryptedEvent internalCreateMediaEncryptedEvent() {
+    return new MediaEncryptedEvent._internalWrap();
+  }
+
+  external factory MediaEncryptedEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  MediaEncryptedEvent.internal_() : super.internal_();
+
+
+  @DomName('MediaEncryptedEvent.initData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ByteBuffer get initData => wrap_jso(_blink.BlinkMediaEncryptedEvent.instance.initData_Getter_(unwrap_jso(this)));
+  
+  @DomName('MediaEncryptedEvent.initDataType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get initDataType => _blink.BlinkMediaEncryptedEvent.instance.initDataType_Getter_(unwrap_jso(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')
 @Unstable()
 class MediaError extends DartHtmlDomObject {
@@ -24948,12 +26335,6 @@
   @DocsEditable()
   static const int MEDIA_ERR_DECODE = 3;
 
-  @DomName('MediaError.MEDIA_ERR_ENCRYPTED')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#error-codes
-  @Experimental()
-  static const int MEDIA_ERR_ENCRYPTED = 5;
-
   @DomName('MediaError.MEDIA_ERR_NETWORK')
   @DocsEditable()
   static const int MEDIA_ERR_NETWORK = 2;
@@ -25046,6 +26427,16 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MediaKeyEvent.MediaKeyEvent')
+  @DocsEditable()
+  factory MediaKeyEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMediaKeyEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMediaKeyEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static MediaKeyEvent internalCreateMediaKeyEvent() {
@@ -25068,7 +26459,7 @@
   
   @DomName('MediaKeyEvent.initData')
   @DocsEditable()
-  Uint8List get initData => _blink.BlinkMediaKeyEvent.instance.initData_Getter_(unwrap_jso(this));
+  Uint8List get initData => wrap_jso(_blink.BlinkMediaKeyEvent.instance.initData_Getter_(unwrap_jso(this)));
   
   @DomName('MediaKeyEvent.keySystem')
   @DocsEditable()
@@ -25076,7 +26467,7 @@
   
   @DomName('MediaKeyEvent.message')
   @DocsEditable()
-  Uint8List get message => _blink.BlinkMediaKeyEvent.instance.message_Getter_(unwrap_jso(this));
+  Uint8List get message => wrap_jso(_blink.BlinkMediaKeyEvent.instance.message_Getter_(unwrap_jso(this)));
   
   @DomName('MediaKeyEvent.sessionId')
   @DocsEditable()
@@ -25102,6 +26493,16 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyMessageEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MediaKeyMessageEvent.MediaKeyMessageEvent')
+  @DocsEditable()
+  factory MediaKeyMessageEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMediaKeyMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMediaKeyMessageEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static MediaKeyMessageEvent internalCreateMediaKeyMessageEvent() {
@@ -25114,50 +26515,14 @@
   MediaKeyMessageEvent.internal_() : super.internal_();
 
 
-  @DomName('MediaKeyMessageEvent.destinationURL')
-  @DocsEditable()
-  String get destinationUrl => _blink.BlinkMediaKeyMessageEvent.instance.destinationURL_Getter_(unwrap_jso(this));
-  
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
-  ByteBuffer get message => _blink.BlinkMediaKeyMessageEvent.instance.message_Getter_(unwrap_jso(this));
+  ByteBuffer get message => wrap_jso(_blink.BlinkMediaKeyMessageEvent.instance.message_Getter_(unwrap_jso(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('MediaKeyNeededEvent')
-// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeyneededevent
-@Experimental()
-class MediaKeyNeededEvent extends Event {
-  // To suppress missing implicit constructor warnings.
-  factory MediaKeyNeededEvent._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static MediaKeyNeededEvent internalCreateMediaKeyNeededEvent() {
-    return new MediaKeyNeededEvent._internalWrap();
-  }
-
-  external factory MediaKeyNeededEvent._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  MediaKeyNeededEvent.internal_() : super.internal_();
-
-
-  @DomName('MediaKeyNeededEvent.contentType')
+  @DomName('MediaKeyMessageEvent.messageType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get contentType => _blink.BlinkMediaKeyNeededEvent.instance.contentType_Getter_(unwrap_jso(this));
-  
-  @DomName('MediaKeyNeededEvent.initData')
-  @DocsEditable()
-  Uint8List get initData => _blink.BlinkMediaKeyNeededEvent.instance.initData_Getter_(unwrap_jso(this));
+  String get messageType => _blink.BlinkMediaKeyMessageEvent.instance.messageType_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25192,43 +26557,123 @@
   @Experimental() // untriaged
   Future get closed => wrap_jso(_blink.BlinkMediaKeySession.instance.closed_Getter_(unwrap_jso(this)));
   
-  @DomName('MediaKeySession.error')
+  @DomName('MediaKeySession.expiration')
   @DocsEditable()
-  MediaKeyError get error => wrap_jso(_blink.BlinkMediaKeySession.instance.error_Getter_(unwrap_jso(this)));
+  @Experimental() // untriaged
+  num get expiration => _blink.BlinkMediaKeySession.instance.expiration_Getter_(unwrap_jso(this));
   
-  @DomName('MediaKeySession.keySystem')
+  @DomName('MediaKeySession.keyStatuses')
   @DocsEditable()
-  String get keySystem => _blink.BlinkMediaKeySession.instance.keySystem_Getter_(unwrap_jso(this));
+  @Experimental() // untriaged
+  MediaKeyStatusMap get keyStatuses => wrap_jso(_blink.BlinkMediaKeySession.instance.keyStatuses_Getter_(unwrap_jso(this)));
   
   @DomName('MediaKeySession.sessionId')
   @DocsEditable()
   String get sessionId => _blink.BlinkMediaKeySession.instance.sessionId_Getter_(unwrap_jso(this));
   
-  Future generateRequest(String initDataType, initData) {
-    if ((initData is TypedData) && (initDataType is String)) {
-      return wrap_jso(_blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(unwrap_jso(this), initDataType, unwrap_jso(initData)));
-    }
-    if ((initData is ByteBuffer) && (initDataType is String)) {
-      return wrap_jso(_blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(unwrap_jso(this), initDataType, unwrap_jso(initData)));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  @DomName('MediaKeySession.release')
+  @DomName('MediaKeySession.close')
+  @DocsEditable()
+  Future close() => wrap_jso(_blink.BlinkMediaKeySession.instance.close_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('MediaKeySession.generateRequest')
   @DocsEditable()
   @Experimental() // untriaged
-  Future release() => wrap_jso(_blink.BlinkMediaKeySession.instance.release_Callback_0_(unwrap_jso(this)));
+  Future generateRequest(String initDataType, /*BufferSource*/ initData) => wrap_jso(_blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(unwrap_jso(this), initDataType, initData));
   
-  Future _update(response) {
-    if ((response is TypedData)) {
-      return wrap_jso(_blink.BlinkMediaKeySession.instance.update_Callback_1_(unwrap_jso(this), unwrap_jso(response)));
-    }
-    if ((response is ByteBuffer)) {
-      return wrap_jso(_blink.BlinkMediaKeySession.instance.update_Callback_1_(unwrap_jso(this), unwrap_jso(response)));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+  @DomName('MediaKeySession.load')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future load(String sessionId) => wrap_jso(_blink.BlinkMediaKeySession.instance.load_Callback_1_(unwrap_jso(this), sessionId));
+  
+  @DomName('MediaKeySession.remove')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future remove() => wrap_jso(_blink.BlinkMediaKeySession.instance.remove_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('MediaKeySession.update')
+  @DocsEditable()
+  Future _update(/*BufferSource*/ response) => wrap_jso(_blink.BlinkMediaKeySession.instance.update_Callback_1_(unwrap_jso(this), 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('MediaKeyStatusMap')
+@Experimental() // untriaged
+class MediaKeyStatusMap extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory MediaKeyStatusMap._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static MediaKeyStatusMap internalCreateMediaKeyStatusMap() {
+    return new MediaKeyStatusMap._internalWrap();
   }
 
+  factory MediaKeyStatusMap._internalWrap() {
+    return new MediaKeyStatusMap.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  MediaKeyStatusMap.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('MediaKeyStatusMap.size')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get size => _blink.BlinkMediaKeyStatusMap.instance.size_Getter_(unwrap_jso(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('MediaKeySystemAccess')
+@Experimental() // untriaged
+class MediaKeySystemAccess extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory MediaKeySystemAccess._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static MediaKeySystemAccess internalCreateMediaKeySystemAccess() {
+    return new MediaKeySystemAccess._internalWrap();
+  }
+
+  factory MediaKeySystemAccess._internalWrap() {
+    return new MediaKeySystemAccess.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  MediaKeySystemAccess.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('MediaKeySystemAccess.keySystem')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get keySystem => _blink.BlinkMediaKeySystemAccess.instance.keySystem_Getter_(unwrap_jso(this));
+  
+  @DomName('MediaKeySystemAccess.createMediaKeys')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future createMediaKeys() => wrap_jso(_blink.BlinkMediaKeySystemAccess.instance.createMediaKeys_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('MediaKeySystemAccess.getConfiguration')
+  @DocsEditable()
+  @Experimental() // untriaged
+   getConfiguration() => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkMediaKeySystemAccess.instance.getConfiguration_Callback_0_(unwrap_jso(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
@@ -25260,15 +26705,6 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('MediaKeys.keySystem')
-  @DocsEditable()
-  String get keySystem => _blink.BlinkMediaKeys.instance.keySystem_Getter_(unwrap_jso(this));
-  
-  @DomName('MediaKeys.create')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static Future create(String keySystem) => wrap_jso(_blink.BlinkMediaKeys.instance.create_Callback_1_(keySystem));
-  
   MediaKeySession _createSession([String sessionType]) {
     if (sessionType != null) {
       return wrap_jso(_blink.BlinkMediaKeys.instance.createSession_Callback_1_(unwrap_jso(this), sessionType));
@@ -25276,10 +26712,10 @@
     return wrap_jso(_blink.BlinkMediaKeys.instance.createSession_Callback_0_(unwrap_jso(this)));
   }
 
-  @DomName('MediaKeys.isTypeSupported')
+  @DomName('MediaKeys.setServerCertificate')
   @DocsEditable()
   @Experimental() // untriaged
-  static bool isTypeSupported(String keySystem, String contentType) => _blink.BlinkMediaKeys.instance.isTypeSupported_Callback_2_(keySystem, contentType);
+  Future setServerCertificate(/*BufferSource*/ serverCertificate) => wrap_jso(_blink.BlinkMediaKeys.instance.setServerCertificate_Callback_1_(unwrap_jso(this), serverCertificate));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25325,11 +26761,11 @@
   
   @DomName('MediaList.appendMedium')
   @DocsEditable()
-  void appendMedium(String newMedium) => _blink.BlinkMediaList.instance.appendMedium_Callback_1_(unwrap_jso(this), newMedium);
+  void appendMedium(String medium) => _blink.BlinkMediaList.instance.appendMedium_Callback_1_(unwrap_jso(this), medium);
   
   @DomName('MediaList.deleteMedium')
   @DocsEditable()
-  void deleteMedium(String oldMedium) => _blink.BlinkMediaList.instance.deleteMedium_Callback_1_(unwrap_jso(this), oldMedium);
+  void deleteMedium(String medium) => _blink.BlinkMediaList.instance.deleteMedium_Callback_1_(unwrap_jso(this), medium);
   
   @DomName('MediaList.item')
   @DocsEditable()
@@ -25403,6 +26839,16 @@
   // To suppress missing implicit constructor warnings.
   factory MediaQueryListEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MediaQueryListEvent.MediaQueryListEvent')
+  @DocsEditable()
+  factory MediaQueryListEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMediaQueryListEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMediaQueryListEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static MediaQueryListEvent internalCreateMediaQueryListEvent() {
@@ -25434,6 +26880,52 @@
 
 
 @DocsEditable()
+@DomName('MediaSession')
+@Experimental() // untriaged
+class MediaSession extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory MediaSession._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaSession.MediaSession')
+  @DocsEditable()
+  factory MediaSession() {
+    return wrap_jso(_blink.BlinkMediaSession.instance.constructorCallback_0_());
+  }
+
+  @Deprecated("Internal Use Only")
+  static MediaSession internalCreateMediaSession() {
+    return new MediaSession._internalWrap();
+  }
+
+  factory MediaSession._internalWrap() {
+    return new MediaSession.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  MediaSession.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('MediaSession.activate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void activate() => _blink.BlinkMediaSession.instance.activate_Callback_0_(unwrap_jso(this));
+  
+  @DomName('MediaSession.deactivate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deactivate() => _blink.BlinkMediaSession.instance.deactivate_Callback_0_(unwrap_jso(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('MediaSource')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '11')
@@ -25576,6 +27068,11 @@
   MediaStream.internal_() : super.internal_();
 
 
+  @DomName('MediaStream.active')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get active => _blink.BlinkMediaStream.instance.active_Getter_(unwrap_jso(this));
+  
   @DomName('MediaStream.ended')
   @DocsEditable()
   bool get ended => _blink.BlinkMediaStream.instance.ended_Getter_(unwrap_jso(this));
@@ -25664,6 +27161,16 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MediaStreamEvent.MediaStreamEvent')
+  @DocsEditable()
+  factory MediaStreamEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMediaStreamEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMediaStreamEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static MediaStreamEvent internalCreateMediaStreamEvent() {
@@ -26025,6 +27532,16 @@
   @Experimental() // untriaged
   set disabled(bool value) => _blink.BlinkHTMLMenuItemElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
+  @DomName('HTMLMenuItemElement.icon')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get icon => _blink.BlinkHTMLMenuItemElement.instance.icon_Getter_(unwrap_jso(this));
+  
+  @DomName('HTMLMenuItemElement.icon')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set icon(String value) => _blink.BlinkHTMLMenuItemElement.instance.icon_Setter_(unwrap_jso(this), value);
+  
   @DomName('HTMLMenuItemElement.label')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26035,6 +27552,16 @@
   @Experimental() // untriaged
   set label(String value) => _blink.BlinkHTMLMenuItemElement.instance.label_Setter_(unwrap_jso(this), value);
   
+  @DomName('HTMLMenuItemElement.radiogroup')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get radiogroup => _blink.BlinkHTMLMenuItemElement.instance.radiogroup_Getter_(unwrap_jso(this));
+  
+  @DomName('HTMLMenuItemElement.radiogroup')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set radiogroup(String value) => _blink.BlinkHTMLMenuItemElement.instance.radiogroup_Setter_(unwrap_jso(this), value);
+  
   @DomName('HTMLMenuItemElement.type')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26105,8 +27632,26 @@
         lastEventId, source, messagePorts);
     return event;
   }
-  // To suppress missing implicit constructor warnings.
-  factory MessageEvent._() { throw new UnsupportedError("Not supported"); }
+
+  // TODO(alanknight): This really should be generated by the
+  // _OutputConversion in the systemnative.py script, but that doesn't
+  // use those conversions right now, so do this as a one-off.
+  @DomName('MessageEvent.data')
+  @DocsEditable()
+  dynamic get data => convertNativeToDart_SerializedScriptValue(
+      _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+
+
+
+  @DomName('MessageEvent.MessageEvent')
+  @DocsEditable()
+  factory MessageEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMessageEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -26120,14 +27665,6 @@
   MessageEvent.internal_() : super.internal_();
 
 
-  @DomName('MessageEvent.data')
-  @DocsEditable()
-  // TODO(alanknight): This really should be generated by the
-  // _OutputConversion in the systemnative.py script, but that doesn't
-  // use those conversions right now, so do this as a one-off.
-  dynamic get data => convertNativeToDart_SerializedScriptValue(
-      _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
-
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
   @Unstable()
@@ -26143,7 +27680,7 @@
   
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
-  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) => _blink.BlinkMessageEvent.instance.initMessageEvent_Callback_8_(unwrap_jso(this), typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, unwrap_jso(sourceArg), unwrap_jso(messagePorts));
+  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> portsArg) => _blink.BlinkMessageEvent.instance.initMessageEvent_Callback_8_(unwrap_jso(this), typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, unwrap_jso(sourceArg), unwrap_jso(portsArg));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26186,10 +27723,15 @@
   @DocsEditable()
   void close() => _blink.BlinkMessagePort.instance.close_Callback_0_(unwrap_jso(this));
   
-  @DomName('MessagePort.postMessage')
-  @DocsEditable()
-  void postMessage(Object message, [List<MessagePort> transfer]) => _blink.BlinkMessagePort.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
-  
+  void postMessage(Object message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      _blink.BlinkMessagePort.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      return;
+    }
+    _blink.BlinkMessagePort.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    return;
+  }
+
   @DomName('MessagePort.start')
   @DocsEditable()
   void start() => _blink.BlinkMessagePort.instance.start_Callback_0_(unwrap_jso(this));
@@ -26421,26 +27963,6 @@
   // To suppress missing implicit constructor warnings.
   factory MidiAccess._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `connect` events to event
-   * handlers that are not necessarily instances of [MidiAccess].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('MIDIAccess.connectEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MidiConnectionEvent> connectEvent = const EventStreamProvider<MidiConnectionEvent>('connect');
-
-  /**
-   * Static factory designed to expose `disconnect` events to event
-   * handlers that are not necessarily instances of [MidiAccess].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('MIDIAccess.disconnectEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
-
 
   @Deprecated("Internal Use Only")
   static MidiAccess internalCreateMidiAccess() {
@@ -26466,16 +27988,6 @@
   @Experimental() // untriaged
   bool get sysexEnabled => _blink.BlinkMIDIAccess.instance.sysexEnabled_Getter_(unwrap_jso(this));
   
-  /// Stream of `connect` events handled by this [MidiAccess].
-  @DomName('MIDIAccess.onconnect')
-  @DocsEditable()
-  Stream<MidiConnectionEvent> get onConnect => connectEvent.forTarget(this);
-
-  /// Stream of `disconnect` events handled by this [MidiAccess].
-  @DomName('MIDIAccess.ondisconnect')
-  @DocsEditable()
-  Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.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
@@ -26492,6 +28004,16 @@
   // To suppress missing implicit constructor warnings.
   factory MidiConnectionEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MIDIConnectionEvent.MIDIConnectionEvent')
+  @DocsEditable()
+  factory MidiConnectionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMIDIConnectionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMIDIConnectionEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static MidiConnectionEvent internalCreateMidiConnectionEvent() {
@@ -26586,31 +28108,6 @@
   @Experimental() // untriaged
   int get size => _blink.BlinkMIDIInputMap.instance.size_Getter_(unwrap_jso(this));
   
-  @DomName('MIDIInputMap.entries')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator entries() => wrap_jso(_blink.BlinkMIDIInputMap.instance.entries_Callback_0_(unwrap_jso(this)));
-  
-  @DomName('MIDIInputMap.get')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object get(String id) => wrap_jso(_blink.BlinkMIDIInputMap.instance.get_Callback_1_(unwrap_jso(this), id));
-  
-  @DomName('MIDIInputMap.has')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool has(String key) => _blink.BlinkMIDIInputMap.instance.has_Callback_1_(unwrap_jso(this), key);
-  
-  @DomName('MIDIInputMap.keys')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator keys() => wrap_jso(_blink.BlinkMIDIInputMap.instance.keys_Callback_0_(unwrap_jso(this)));
-  
-  @DomName('MIDIInputMap.values')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator values() => wrap_jso(_blink.BlinkMIDIInputMap.instance.values_Callback_0_(unwrap_jso(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
@@ -26627,6 +28124,16 @@
   // To suppress missing implicit constructor warnings.
   factory MidiMessageEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('MIDIMessageEvent.MIDIMessageEvent')
+  @DocsEditable()
+  factory MidiMessageEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMIDIMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMIDIMessageEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static MidiMessageEvent internalCreateMidiMessageEvent() {
@@ -26641,7 +28148,7 @@
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
-  Uint8List get data => _blink.BlinkMIDIMessageEvent.instance.data_Getter_(unwrap_jso(this));
+  Uint8List get data => wrap_jso(_blink.BlinkMIDIMessageEvent.instance.data_Getter_(unwrap_jso(this)));
   
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
@@ -26677,10 +28184,10 @@
 
   void send(Uint8List data, [num timestamp]) {
     if (timestamp != null) {
-      _blink.BlinkMIDIOutput.instance.send_Callback_2_(unwrap_jso(this), data, timestamp);
+      _blink.BlinkMIDIOutput.instance.send_Callback_2_(unwrap_jso(this), unwrap_jso(data), timestamp);
       return;
     }
-    _blink.BlinkMIDIOutput.instance.send_Callback_1_(unwrap_jso(this), data);
+    _blink.BlinkMIDIOutput.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
     return;
   }
 
@@ -26719,31 +28226,6 @@
   @Experimental() // untriaged
   int get size => _blink.BlinkMIDIOutputMap.instance.size_Getter_(unwrap_jso(this));
   
-  @DomName('MIDIOutputMap.entries')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator entries() => wrap_jso(_blink.BlinkMIDIOutputMap.instance.entries_Callback_0_(unwrap_jso(this)));
-  
-  @DomName('MIDIOutputMap.get')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object get(String id) => wrap_jso(_blink.BlinkMIDIOutputMap.instance.get_Callback_1_(unwrap_jso(this), id));
-  
-  @DomName('MIDIOutputMap.has')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool has(String key) => _blink.BlinkMIDIOutputMap.instance.has_Callback_1_(unwrap_jso(this), key);
-  
-  @DomName('MIDIOutputMap.keys')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator keys() => wrap_jso(_blink.BlinkMIDIOutputMap.instance.keys_Callback_0_(unwrap_jso(this)));
-  
-  @DomName('MIDIOutputMap.values')
-  @DocsEditable()
-  @Experimental() // untriaged
-  DomIterator values() => wrap_jso(_blink.BlinkMIDIOutputMap.instance.values_Callback_0_(unwrap_jso(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
@@ -26760,16 +28242,6 @@
   // To suppress missing implicit constructor warnings.
   factory MidiPort._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `disconnect` events to event
-   * handlers that are not necessarily instances of [MidiPort].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('MIDIPort.disconnectEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
-
 
   @Deprecated("Internal Use Only")
   static MidiPort internalCreateMidiPort() {
@@ -26782,6 +28254,11 @@
   MidiPort.internal_() : super.internal_();
 
 
+  @DomName('MIDIPort.connection')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get connection => _blink.BlinkMIDIPort.instance.connection_Getter_(unwrap_jso(this));
+  
   @DomName('MIDIPort.id')
   @DocsEditable()
   String get id => _blink.BlinkMIDIPort.instance.id_Getter_(unwrap_jso(this));
@@ -26794,6 +28271,11 @@
   @DocsEditable()
   String get name => _blink.BlinkMIDIPort.instance.name_Getter_(unwrap_jso(this));
   
+  @DomName('MIDIPort.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get state => _blink.BlinkMIDIPort.instance.state_Getter_(unwrap_jso(this));
+  
   @DomName('MIDIPort.type')
   @DocsEditable()
   String get type => _blink.BlinkMIDIPort.instance.type_Getter_(unwrap_jso(this));
@@ -26802,11 +28284,16 @@
   @DocsEditable()
   String get version => _blink.BlinkMIDIPort.instance.version_Getter_(unwrap_jso(this));
   
-  /// Stream of `disconnect` events handled by this [MidiPort].
-  @DomName('MIDIPort.ondisconnect')
+  @DomName('MIDIPort.close')
   @DocsEditable()
-  Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
-
+  @Experimental() // untriaged
+  Future close() => wrap_jso(_blink.BlinkMIDIPort.instance.close_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('MIDIPort.open')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future open() => wrap_jso(_blink.BlinkMIDIPort.instance.open_Callback_0_(unwrap_jso(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
@@ -26933,18 +28420,20 @@
   MimeType elementAt(int index) => this[index];
   // -- end List<MimeType> mixins.
 
-  @DomName('MimeTypeArray.__getter__')
-  @DocsEditable()
-  MimeType __getter__(String name) => wrap_jso(_blink.BlinkMimeTypeArray.instance.$__getter___Callback_1_(unwrap_jso(this), name));
-  
   @DomName('MimeTypeArray.item')
   @DocsEditable()
   MimeType item(int index) => wrap_jso(_blink.BlinkMimeTypeArray.instance.item_Callback_1_(unwrap_jso(this), index));
   
-  @DomName('MimeTypeArray.namedItem')
-  @DocsEditable()
-  MimeType namedItem(String name) => wrap_jso(_blink.BlinkMimeTypeArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
-  
+  MimeType namedItem(String name) {
+    if ((name is String || name == null)) {
+      return wrap_jso(_blink.BlinkMimeTypeArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    if ((name is String || name == null)) {
+      return wrap_jso(_blink.BlinkMimeTypeArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27019,8 +28508,16 @@
         button, relatedTarget);
     return event;
   }
-  // To suppress missing implicit constructor warnings.
-  factory MouseEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MouseEvent.MouseEvent')
+  @DocsEditable()
+  factory MouseEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkMouseEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkMouseEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -27042,6 +28539,11 @@
   @DocsEditable()
   int get button => _blink.BlinkMouseEvent.instance.button_Getter_(unwrap_jso(this));
   
+  @DomName('MouseEvent.buttons')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get buttons => _blink.BlinkMouseEvent.instance.buttons_Getter_(unwrap_jso(this));
+  
   @DomName('MouseEvent.clientX')
   @DocsEditable()
   int get _clientX => _blink.BlinkMouseEvent.instance.clientX_Getter_(unwrap_jso(this));
@@ -27071,6 +28573,16 @@
   @deprecated
   Node get fromElement => wrap_jso(_blink.BlinkMouseEvent.instance.fromElement_Getter_(unwrap_jso(this)));
   
+  @DomName('MouseEvent.layerX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get _layerX => _blink.BlinkMouseEvent.instance.layerX_Getter_(unwrap_jso(this));
+  
+  @DomName('MouseEvent.layerY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get _layerY => _blink.BlinkMouseEvent.instance.layerY_Getter_(unwrap_jso(this));
+  
   @DomName('MouseEvent.metaKey')
   @DocsEditable()
   bool get metaKey => _blink.BlinkMouseEvent.instance.metaKey_Getter_(unwrap_jso(this));
@@ -27095,6 +28607,16 @@
   @Unstable()
   int get _offsetY => _blink.BlinkMouseEvent.instance.offsetY_Getter_(unwrap_jso(this));
   
+  @DomName('MouseEvent.pageX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get _pageX => _blink.BlinkMouseEvent.instance.pageX_Getter_(unwrap_jso(this));
+  
+  @DomName('MouseEvent.pageY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get _pageY => _blink.BlinkMouseEvent.instance.pageY_Getter_(unwrap_jso(this));
+  
   @DomName('MouseEvent.region')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27142,9 +28664,14 @@
   @Experimental()
   int get _webkitMovementY => _blink.BlinkMouseEvent.instance.webkitMovementY_Getter_(unwrap_jso(this));
   
+  @DomName('MouseEvent.which')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get _which => _blink.BlinkMouseEvent.instance.which_Getter_(unwrap_jso(this));
+  
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.BlinkMouseEvent.instance.initMouseEvent_Callback_15_(unwrap_jso(this), type, canBubble, cancelable, unwrap_jso(view), detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, unwrap_jso(relatedTarget));
+  void _initMouseEvent(String type, bool bubbles, 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) => _blink.BlinkMouseEvent.instance.initMouseEvent_Callback_15_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(view), detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, unwrap_jso(relatedTarget));
   
 
   @deprecated
@@ -27187,6 +28714,14 @@
   @DomName('MouseEvent.screenX')
   @DomName('MouseEvent.screenY')
   Point get screen => new Point(_screenX, _screenY);
+
+  @DomName('MouseEvent.layerX')
+  @DomName('MouseEvent.layerY')
+  Point get layer => new Point(_layerX, _layerY);
+
+  @DomName('MouseEvent.pageX')
+  @DomName('MouseEvent.pageY')
+  Point get page => new Point(_pageX, _pageY);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27383,7 +28918,7 @@
 
 
 @DomName('Navigator')
-class Navigator extends DartHtmlDomObject implements NavigatorCpu, NavigatorLanguage, NavigatorOnLine, NavigatorID {
+class Navigator extends DartHtmlDomObject implements NavigatorStorageUtils, NavigatorCpu, NavigatorLanguage, NavigatorOnLine, NavigatorID {
 
 
   /**
@@ -27459,16 +28994,16 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
+  @DomName('Navigator.bluetooth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Bluetooth get bluetooth => wrap_jso(_blink.BlinkNavigator.instance.bluetooth_Getter_(unwrap_jso(this)));
+  
   @DomName('Navigator.connection')
   @DocsEditable()
   @Experimental() // untriaged
   NetworkInformation get connection => wrap_jso(_blink.BlinkNavigator.instance.connection_Getter_(unwrap_jso(this)));
   
-  @DomName('Navigator.cookieEnabled')
-  @DocsEditable()
-  @Unstable()
-  bool get cookieEnabled => _blink.BlinkNavigator.instance.cookieEnabled_Getter_(unwrap_jso(this));
-  
   @DomName('Navigator.credentials')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27480,11 +29015,6 @@
   @Experimental() // experimental
   String get doNotTrack => _blink.BlinkNavigator.instance.doNotTrack_Getter_(unwrap_jso(this));
   
-  @DomName('Navigator.geofencing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Geofencing get geofencing => wrap_jso(_blink.BlinkNavigator.instance.geofencing_Getter_(unwrap_jso(this)));
-  
   @DomName('Navigator.geolocation')
   @DocsEditable()
   @Unstable()
@@ -27495,11 +29025,21 @@
   @Experimental() // untriaged
   int get maxTouchPoints => _blink.BlinkNavigator.instance.maxTouchPoints_Getter_(unwrap_jso(this));
   
+  @DomName('Navigator.mediaDevices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaDevices get mediaDevices => wrap_jso(_blink.BlinkNavigator.instance.mediaDevices_Getter_(unwrap_jso(this)));
+  
   @DomName('Navigator.mimeTypes')
   @DocsEditable()
   @Experimental() // nonstandard
   MimeTypeArray get mimeTypes => wrap_jso(_blink.BlinkNavigator.instance.mimeTypes_Getter_(unwrap_jso(this)));
   
+  @DomName('Navigator.permissions')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Permissions get permissions => wrap_jso(_blink.BlinkNavigator.instance.permissions_Getter_(unwrap_jso(this)));
+  
   @DomName('Navigator.presentation')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27510,16 +29050,16 @@
   @Unstable()
   String get productSub => _blink.BlinkNavigator.instance.productSub_Getter_(unwrap_jso(this));
   
-  @DomName('Navigator.push')
-  @DocsEditable()
-  @Experimental() // untriaged
-  PushManager get push => wrap_jso(_blink.BlinkNavigator.instance.push_Getter_(unwrap_jso(this)));
-  
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
   ServiceWorkerContainer get serviceWorker => wrap_jso(_blink.BlinkNavigator.instance.serviceWorker_Getter_(unwrap_jso(this)));
   
+  @DomName('Navigator.services')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ServicePortCollection get services => wrap_jso(_blink.BlinkNavigator.instance.services_Getter_(unwrap_jso(this)));
+  
   @DomName('Navigator.storageQuota')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27561,33 +29101,33 @@
   @Experimental() // untriaged
   List<Gamepad> getGamepads() => wrap_jso(_blink.BlinkNavigator.instance.getGamepads_Callback_0_(unwrap_jso(this)));
   
-  @DomName('Navigator.getStorageUpdates')
+  @DomName('Navigator.getVRDevices')
   @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
-  @Experimental()
-  void getStorageUpdates() => _blink.BlinkNavigator.instance.getStorageUpdates_Callback_0_(unwrap_jso(this));
+  @Experimental() // untriaged
+  Future getVRDevices() => wrap_jso(_blink.BlinkNavigator.instance.getVRDevices_Callback_0_(unwrap_jso(this)));
   
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
   void registerProtocolHandler(String scheme, String url, String title) => _blink.BlinkNavigator.instance.registerProtocolHandler_Callback_3_(unwrap_jso(this), scheme, url, title);
   
-  bool sendBeacon(String url, data) {
-    if ((data is String || data == null) && (url is String || url == null)) {
-      return _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(unwrap_jso(this), url, unwrap_jso(data));
+  Future requestMidiAccess([Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkNavigator.instance.requestMIDIAccess_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
     }
-    if ((data is TypedData || data == null) && (url is String || url == null)) {
-      return _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(unwrap_jso(this), url, unwrap_jso(data));
-    }
-    if ((data is FormData || data == null) && (url is String || url == null)) {
-      return _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(unwrap_jso(this), url, unwrap_jso(data));
-    }
-    if ((data is Blob || data == null) && (url is String || url == null)) {
-      return _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(unwrap_jso(this), url, unwrap_jso(data));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return wrap_jso(_blink.BlinkNavigator.instance.requestMIDIAccess_Callback_0_(unwrap_jso(this)));
   }
 
+  @DomName('Navigator.requestMediaKeySystemAccess')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestMediaKeySystemAccess(String keySystem, List<Map> supportedConfigurations) => wrap_jso(_blink.BlinkNavigator.instance.requestMediaKeySystemAccess_Callback_2_(unwrap_jso(this), keySystem, supportedConfigurations));
+  
+  @DomName('Navigator.sendBeacon')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool sendBeacon(String url, Object data) => _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(unwrap_jso(this), url, data);
+  
   @DomName('Navigator.webkitGetUserMedia')
   @DocsEditable()
   // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia
@@ -27644,6 +29184,17 @@
   @Unstable()
   bool get onLine => _blink.BlinkNavigator.instance.onLine_Getter_(unwrap_jso(this));
   
+  @DomName('Navigator.cookieEnabled')
+  @DocsEditable()
+  @Unstable()
+  bool get cookieEnabled => _blink.BlinkNavigator.instance.cookieEnabled_Getter_(unwrap_jso(this));
+  
+  @DomName('Navigator.getStorageUpdates')
+  @DocsEditable()
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
+  @Experimental()
+  void getStorageUpdates() => _blink.BlinkNavigator.instance.getStorageUpdates_Callback_0_(unwrap_jso(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
@@ -27768,6 +29319,46 @@
 
 
 @DocsEditable()
+@DomName('NavigatorStorageUtils')
+@Experimental() // untriaged
+class NavigatorStorageUtils extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory NavigatorStorageUtils._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static NavigatorStorageUtils internalCreateNavigatorStorageUtils() {
+    return new NavigatorStorageUtils._internalWrap();
+  }
+
+  factory NavigatorStorageUtils._internalWrap() {
+    return new NavigatorStorageUtils.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  NavigatorStorageUtils.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('NavigatorStorageUtils.cookieEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get cookieEnabled => _blink.BlinkNavigatorStorageUtils.instance.cookieEnabled_Getter_(unwrap_jso(this));
+  
+  @DomName('NavigatorStorageUtils.getStorageUpdates')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getStorageUpdates() => _blink.BlinkNavigatorStorageUtils.instance.getStorageUpdates_Callback_0_(unwrap_jso(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('NavigatorUserMediaError')
 // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaError
 @Experimental()
@@ -28392,7 +29983,7 @@
    */
   @DomName('Node.appendChild')
   @DocsEditable()
-  Node append(Node newChild) => wrap_jso(_blink.BlinkNode.instance.appendChild_Callback_1_(unwrap_jso(this), unwrap_jso(newChild)));
+  Node append(Node node) => wrap_jso(_blink.BlinkNode.instance.appendChild_Callback_1_(unwrap_jso(this), unwrap_jso(node)));
   
   /**
    * Returns a copy of this node.
@@ -28443,15 +30034,15 @@
    */
   @DomName('Node.insertBefore')
   @DocsEditable()
-  Node insertBefore(Node newChild, Node refChild) => wrap_jso(_blink.BlinkNode.instance.insertBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newChild), unwrap_jso(refChild)));
+  Node insertBefore(Node node, Node child) => wrap_jso(_blink.BlinkNode.instance.insertBefore_Callback_2_(unwrap_jso(this), unwrap_jso(node), unwrap_jso(child)));
   
   @DomName('Node.removeChild')
   @DocsEditable()
-  Node _removeChild(Node oldChild) => wrap_jso(_blink.BlinkNode.instance.removeChild_Callback_1_(unwrap_jso(this), unwrap_jso(oldChild)));
+  Node _removeChild(Node child) => wrap_jso(_blink.BlinkNode.instance.removeChild_Callback_1_(unwrap_jso(this), unwrap_jso(child)));
   
   @DomName('Node.replaceChild')
   @DocsEditable()
-  Node _replaceChild(Node newChild, Node oldChild) => wrap_jso(_blink.BlinkNode.instance.replaceChild_Callback_2_(unwrap_jso(this), unwrap_jso(newChild), unwrap_jso(oldChild)));
+  Node _replaceChild(Node node, Node child) => wrap_jso(_blink.BlinkNode.instance.replaceChild_Callback_2_(unwrap_jso(this), unwrap_jso(node), unwrap_jso(child)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28501,31 +30092,31 @@
 
   @DomName('NodeFilter.SHOW_COMMENT')
   @DocsEditable()
-  static const int SHOW_COMMENT = 0x00000080;
+  static const int SHOW_COMMENT = 0x80;
 
   @DomName('NodeFilter.SHOW_DOCUMENT')
   @DocsEditable()
-  static const int SHOW_DOCUMENT = 0x00000100;
+  static const int SHOW_DOCUMENT = 0x100;
 
   @DomName('NodeFilter.SHOW_DOCUMENT_FRAGMENT')
   @DocsEditable()
-  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;
+  static const int SHOW_DOCUMENT_FRAGMENT = 0x400;
 
   @DomName('NodeFilter.SHOW_DOCUMENT_TYPE')
   @DocsEditable()
-  static const int SHOW_DOCUMENT_TYPE = 0x00000200;
+  static const int SHOW_DOCUMENT_TYPE = 0x200;
 
   @DomName('NodeFilter.SHOW_ELEMENT')
   @DocsEditable()
-  static const int SHOW_ELEMENT = 0x00000001;
+  static const int SHOW_ELEMENT = 0x1;
 
   @DomName('NodeFilter.SHOW_PROCESSING_INSTRUCTION')
   @DocsEditable()
-  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;
+  static const int SHOW_PROCESSING_INSTRUCTION = 0x40;
 
   @DomName('NodeFilter.SHOW_TEXT')
   @DocsEditable()
-  static const int SHOW_TEXT = 0x00000004;
+  static const int SHOW_TEXT = 0x4;
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -28669,6 +30260,81 @@
   Node _item(int index) => wrap_jso(_blink.BlinkNodeList.instance.item_Callback_1_(unwrap_jso(this), index));
   
 }
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('NonDocumentTypeChildNode')
+@Experimental() // untriaged
+class NonDocumentTypeChildNode extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory NonDocumentTypeChildNode._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static NonDocumentTypeChildNode internalCreateNonDocumentTypeChildNode() {
+    return new NonDocumentTypeChildNode._internalWrap();
+  }
+
+  factory NonDocumentTypeChildNode._internalWrap() {
+    return new NonDocumentTypeChildNode.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  NonDocumentTypeChildNode.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('NonDocumentTypeChildNode.nextElementSibling')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element get nextElementSibling => wrap_jso(_blink.BlinkNonDocumentTypeChildNode.instance.nextElementSibling_Getter_(unwrap_jso(this)));
+  
+  @DomName('NonDocumentTypeChildNode.previousElementSibling')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element get previousElementSibling => wrap_jso(_blink.BlinkNonDocumentTypeChildNode.instance.previousElementSibling_Getter_(unwrap_jso(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('NonElementParentNode')
+@Experimental() // untriaged
+class NonElementParentNode extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory NonElementParentNode._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static NonElementParentNode internalCreateNonElementParentNode() {
+    return new NonElementParentNode._internalWrap();
+  }
+
+  factory NonElementParentNode._internalWrap() {
+    return new NonElementParentNode.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  NonElementParentNode.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('NonElementParentNode.getElementById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element getElementById(String elementId) => wrap_jso(_blink.BlinkNonElementParentNode.instance.getElementById_Callback_1_(unwrap_jso(this), elementId));
+  
+}
 // 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.
@@ -28763,6 +30429,11 @@
   @Experimental() // untriaged
   String get body => _blink.BlinkNotification.instance.body_Getter_(unwrap_jso(this));
   
+  @DomName('Notification.data')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object get data => wrap_jso(_blink.BlinkNotification.instance.data_Getter_(unwrap_jso(this)));
+  
   @DomName('Notification.dir')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -28782,6 +30453,11 @@
   @DocsEditable()
   String get permission => _blink.BlinkNotification.instance.permission_Getter_();
   
+  @DomName('Notification.silent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get silent => _blink.BlinkNotification.instance.silent_Getter_(unwrap_jso(this));
+  
   @DomName('Notification.tag')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -28792,6 +30468,11 @@
   @Experimental() // untriaged
   String get title => _blink.BlinkNotification.instance.title_Getter_(unwrap_jso(this));
   
+  @DomName('Notification.vibrate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<int> get vibrate => _blink.BlinkNotification.instance.vibrate_Getter_(unwrap_jso(this));
+  
   @DomName('Notification.close')
   @DocsEditable()
   void close() => _blink.BlinkNotification.instance.close_Callback_0_(unwrap_jso(this));
@@ -28840,6 +30521,48 @@
 // WARNING: Do not edit - generated code.
 
 
+@DocsEditable()
+@DomName('NotificationEvent')
+@Experimental() // untriaged
+class NotificationEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory NotificationEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NotificationEvent.NotificationEvent')
+  @DocsEditable()
+  factory NotificationEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkNotificationEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkNotificationEvent.instance.constructorCallback_1_(type));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static NotificationEvent internalCreateNotificationEvent() {
+    return new NotificationEvent._internalWrap();
+  }
+
+  external factory NotificationEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  NotificationEvent.internal_() : super.internal_();
+
+
+  @DomName('NotificationEvent.notification')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Notification get notification => wrap_jso(_blink.BlinkNotificationEvent.instance.notification_Getter_(unwrap_jso(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.
+
+
 @DomName('NotificationPermissionCallback')
 // http://www.w3.org/TR/notifications/#notificationpermissioncallback
 @Experimental()
@@ -28966,16 +30689,6 @@
   @DocsEditable()
   set height(String value) => _blink.BlinkHTMLObjectElement.instance.height_Setter_(unwrap_jso(this), value);
   
-  @DomName('HTMLObjectElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLObjectElement.instance.integrity_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLObjectElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLObjectElement.instance.integrity_Setter_(unwrap_jso(this), value);
-  
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
   String get name => _blink.BlinkHTMLObjectElement.instance.name_Getter_(unwrap_jso(this));
@@ -29032,6 +30745,11 @@
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLObjectElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLObjectElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLObjectElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLObjectElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) => _blink.BlinkHTMLObjectElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
@@ -29103,7 +30821,13 @@
   @DomName('HTMLOptionElement.HTMLOptionElement')
   @DocsEditable()
   factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) {
-    return wrap_jso(_blink.BlinkHTMLOptionElement.instance.constructorCallback_4_(data, value, defaultSelected, selected));
+    if (selected != null) {
+      return wrap_jso(_blink.BlinkHTMLOptionElement.instance.constructorCallback_4_(data, value, defaultSelected, selected));
+    }
+    if (defaultSelected != null) {
+      return wrap_jso(_blink.BlinkHTMLOptionElement.instance.constructorCallback_3_(data, value, defaultSelected));
+    }
+    return wrap_jso(_blink.BlinkHTMLOptionElement.instance.constructorCallback_2_(data, value));
   }
 
 
@@ -29271,6 +30995,11 @@
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLOutputElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLOutputElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLOutputElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLOutputElement.setCustomValidity')
   @DocsEditable()
   void setCustomValidity(String error) => _blink.BlinkHTMLOutputElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
@@ -29284,57 +31013,6 @@
 
 
 @DocsEditable()
-@DomName('OverflowEvent')
-@Experimental() // nonstandard
-class OverflowEvent extends Event {
-  // To suppress missing implicit constructor warnings.
-  factory OverflowEvent._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static OverflowEvent internalCreateOverflowEvent() {
-    return new OverflowEvent._internalWrap();
-  }
-
-  external factory OverflowEvent._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  OverflowEvent.internal_() : super.internal_();
-
-
-  @DomName('OverflowEvent.BOTH')
-  @DocsEditable()
-  static const int BOTH = 2;
-
-  @DomName('OverflowEvent.HORIZONTAL')
-  @DocsEditable()
-  static const int HORIZONTAL = 0;
-
-  @DomName('OverflowEvent.VERTICAL')
-  @DocsEditable()
-  static const int VERTICAL = 1;
-
-  @DomName('OverflowEvent.horizontalOverflow')
-  @DocsEditable()
-  bool get horizontalOverflow => _blink.BlinkOverflowEvent.instance.horizontalOverflow_Getter_(unwrap_jso(this));
-  
-  @DomName('OverflowEvent.orient')
-  @DocsEditable()
-  int get orient => _blink.BlinkOverflowEvent.instance.orient_Getter_(unwrap_jso(this));
-  
-  @DomName('OverflowEvent.verticalOverflow')
-  @DocsEditable()
-  bool get verticalOverflow => _blink.BlinkOverflowEvent.instance.verticalOverflow_Getter_(unwrap_jso(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('PageTransitionEvent')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#pagetransitionevent
 @Experimental()
@@ -29342,6 +31020,16 @@
   // To suppress missing implicit constructor warnings.
   factory PageTransitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('PageTransitionEvent.PageTransitionEvent')
+  @DocsEditable()
+  factory PageTransitionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkPageTransitionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkPageTransitionEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static PageTransitionEvent internalCreatePageTransitionEvent() {
@@ -29501,6 +31189,55 @@
 
 
 @DocsEditable()
+@DomName('PasswordCredential')
+@Experimental() // untriaged
+class PasswordCredential extends Credential {
+  // To suppress missing implicit constructor warnings.
+  factory PasswordCredential._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PasswordCredential.PasswordCredential')
+  @DocsEditable()
+  factory PasswordCredential(String id, String password, [String name, String iconURL]) {
+    if (iconURL != null) {
+      return wrap_jso(_blink.BlinkPasswordCredential.instance.constructorCallback_4_(id, password, name, iconURL));
+    }
+    if (name != null) {
+      return wrap_jso(_blink.BlinkPasswordCredential.instance.constructorCallback_3_(id, password, name));
+    }
+    return wrap_jso(_blink.BlinkPasswordCredential.instance.constructorCallback_2_(id, password));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static PasswordCredential internalCreatePasswordCredential() {
+    return new PasswordCredential._internalWrap();
+  }
+
+  external factory PasswordCredential._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PasswordCredential.internal_() : super.internal_();
+
+
+  @DomName('PasswordCredential.formData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  FormData get formData => wrap_jso(_blink.BlinkPasswordCredential.instance.formData_Getter_(unwrap_jso(this)));
+  
+  @DomName('PasswordCredential.password')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get password => _blink.BlinkPasswordCredential.instance.password_Getter_(unwrap_jso(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('Path2D')
 @Experimental() // untriaged
 class Path2D extends DartHtmlDomObject implements _CanvasPathMethods {
@@ -29650,6 +31387,11 @@
   @DocsEditable()
   PerformanceTiming get timing => wrap_jso(_blink.BlinkPerformance.instance.timing_Getter_(unwrap_jso(this)));
   
+  @DomName('Performance.clearFrameTimings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearFrameTimings() => _blink.BlinkPerformance.instance.clearFrameTimings_Callback_0_(unwrap_jso(this));
+  
   @DomName('Performance.clearMarks')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
@@ -29696,6 +31438,11 @@
   @DocsEditable()
   num now() => _blink.BlinkPerformance.instance.now_Callback_0_(unwrap_jso(this));
   
+  @DomName('Performance.setFrameTimingBufferSize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setFrameTimingBufferSize(int maxSize) => _blink.BlinkPerformance.instance.setFrameTimingBufferSize_Callback_1_(unwrap_jso(this), maxSize);
+  
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -29728,6 +31475,38 @@
 
 
 @DocsEditable()
+@DomName('PerformanceCompositeTiming')
+@Experimental() // untriaged
+class PerformanceCompositeTiming extends PerformanceEntry {
+  // To suppress missing implicit constructor warnings.
+  factory PerformanceCompositeTiming._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static PerformanceCompositeTiming internalCreatePerformanceCompositeTiming() {
+    return new PerformanceCompositeTiming._internalWrap();
+  }
+
+  external factory PerformanceCompositeTiming._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PerformanceCompositeTiming.internal_() : super.internal_();
+
+
+  @DomName('PerformanceCompositeTiming.sourceFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get sourceFrame => _blink.BlinkPerformanceCompositeTiming.instance.sourceFrame_Getter_(unwrap_jso(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('PerformanceEntry')
 // http://www.w3.org/TR/performance-timeline/#sec-PerformanceEntry-interface
 @Experimental()
@@ -29885,6 +31664,38 @@
 
 
 @DocsEditable()
+@DomName('PerformanceRenderTiming')
+@Experimental() // untriaged
+class PerformanceRenderTiming extends PerformanceEntry {
+  // To suppress missing implicit constructor warnings.
+  factory PerformanceRenderTiming._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static PerformanceRenderTiming internalCreatePerformanceRenderTiming() {
+    return new PerformanceRenderTiming._internalWrap();
+  }
+
+  external factory PerformanceRenderTiming._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PerformanceRenderTiming.internal_() : super.internal_();
+
+
+  @DomName('PerformanceRenderTiming.sourceFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get sourceFrame => _blink.BlinkPerformanceRenderTiming.instance.sourceFrame_Getter_(unwrap_jso(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('PerformanceResourceTiming')
 // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming
 @Experimental()
@@ -29955,6 +31766,11 @@
   @DocsEditable()
   num get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.instance.secureConnectionStart_Getter_(unwrap_jso(this));
   
+  @DomName('PerformanceResourceTiming.workerStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get workerStart => _blink.BlinkPerformanceResourceTiming.instance.workerStart_Getter_(unwrap_jso(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
@@ -30078,6 +31894,239 @@
 
 
 @DocsEditable()
+@DomName('PeriodicSyncEvent')
+@Experimental() // untriaged
+class PeriodicSyncEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory PeriodicSyncEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PeriodicSyncEvent.PeriodicSyncEvent')
+  @DocsEditable()
+  factory PeriodicSyncEvent(String type, Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return wrap_jso(_blink.BlinkPeriodicSyncEvent.instance.constructorCallback_2_(type, init_1));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static PeriodicSyncEvent internalCreatePeriodicSyncEvent() {
+    return new PeriodicSyncEvent._internalWrap();
+  }
+
+  external factory PeriodicSyncEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PeriodicSyncEvent.internal_() : super.internal_();
+
+
+  @DomName('PeriodicSyncEvent.registration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PeriodicSyncRegistration get registration => wrap_jso(_blink.BlinkPeriodicSyncEvent.instance.registration_Getter_(unwrap_jso(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('PeriodicSyncManager')
+@Experimental() // untriaged
+class PeriodicSyncManager extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory PeriodicSyncManager._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static PeriodicSyncManager internalCreatePeriodicSyncManager() {
+    return new PeriodicSyncManager._internalWrap();
+  }
+
+  factory PeriodicSyncManager._internalWrap() {
+    return new PeriodicSyncManager.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  PeriodicSyncManager.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('PeriodicSyncManager.minPossiblePeriod')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get minPossiblePeriod => _blink.BlinkPeriodicSyncManager.instance.minPossiblePeriod_Getter_(unwrap_jso(this));
+  
+  @DomName('PeriodicSyncManager.getRegistration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistration(String tag) => wrap_jso(_blink.BlinkPeriodicSyncManager.instance.getRegistration_Callback_1_(unwrap_jso(this), tag));
+  
+  @DomName('PeriodicSyncManager.getRegistrations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistrations() => wrap_jso(_blink.BlinkPeriodicSyncManager.instance.getRegistrations_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('PeriodicSyncManager.permissionState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future permissionState() => wrap_jso(_blink.BlinkPeriodicSyncManager.instance.permissionState_Callback_0_(unwrap_jso(this)));
+  
+  Future register([Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkPeriodicSyncManager.instance.register_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+    }
+    return wrap_jso(_blink.BlinkPeriodicSyncManager.instance.register_Callback_0_(unwrap_jso(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('PeriodicSyncRegistration')
+@Experimental() // untriaged
+class PeriodicSyncRegistration extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory PeriodicSyncRegistration._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static PeriodicSyncRegistration internalCreatePeriodicSyncRegistration() {
+    return new PeriodicSyncRegistration._internalWrap();
+  }
+
+  factory PeriodicSyncRegistration._internalWrap() {
+    return new PeriodicSyncRegistration.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  PeriodicSyncRegistration.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('PeriodicSyncRegistration.minPeriod')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get minPeriod => _blink.BlinkPeriodicSyncRegistration.instance.minPeriod_Getter_(unwrap_jso(this));
+  
+  @DomName('PeriodicSyncRegistration.networkState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get networkState => _blink.BlinkPeriodicSyncRegistration.instance.networkState_Getter_(unwrap_jso(this));
+  
+  @DomName('PeriodicSyncRegistration.powerState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get powerState => _blink.BlinkPeriodicSyncRegistration.instance.powerState_Getter_(unwrap_jso(this));
+  
+  @DomName('PeriodicSyncRegistration.tag')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get tag => _blink.BlinkPeriodicSyncRegistration.instance.tag_Getter_(unwrap_jso(this));
+  
+  @DomName('PeriodicSyncRegistration.unregister')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future unregister() => wrap_jso(_blink.BlinkPeriodicSyncRegistration.instance.unregister_Callback_0_(unwrap_jso(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('PermissionStatus')
+@Experimental() // untriaged
+class PermissionStatus extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory PermissionStatus._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PermissionStatus.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+
+
+  @Deprecated("Internal Use Only")
+  static PermissionStatus internalCreatePermissionStatus() {
+    return new PermissionStatus._internalWrap();
+  }
+
+  external factory PermissionStatus._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PermissionStatus.internal_() : super.internal_();
+
+
+  @DomName('PermissionStatus.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get state => _blink.BlinkPermissionStatus.instance.state_Getter_(unwrap_jso(this));
+  
+  @DomName('PermissionStatus.status')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get status => _blink.BlinkPermissionStatus.instance.status_Getter_(unwrap_jso(this));
+  
+  @DomName('PermissionStatus.onchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onChange => changeEvent.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('Permissions')
+@Experimental() // untriaged
+class Permissions extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory Permissions._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static Permissions internalCreatePermissions() {
+    return new Permissions._internalWrap();
+  }
+
+  factory Permissions._internalWrap() {
+    return new Permissions.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  Permissions.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('Permissions.query')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future query(Object permission) => wrap_jso(_blink.BlinkPermissions.instance.query_Callback_1_(unwrap_jso(this), 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('HTMLPictureElement')
 @Experimental() // untriaged
 class PictureElement extends HtmlElement {
@@ -30148,18 +32197,20 @@
   @DocsEditable()
   String get name => _blink.BlinkPlugin.instance.name_Getter_(unwrap_jso(this));
   
-  @DomName('Plugin.__getter__')
-  @DocsEditable()
-  MimeType __getter__(String name) => wrap_jso(_blink.BlinkPlugin.instance.$__getter___Callback_1_(unwrap_jso(this), name));
-  
   @DomName('Plugin.item')
   @DocsEditable()
   MimeType item(int index) => wrap_jso(_blink.BlinkPlugin.instance.item_Callback_1_(unwrap_jso(this), index));
   
-  @DomName('Plugin.namedItem')
-  @DocsEditable()
-  MimeType namedItem(String name) => wrap_jso(_blink.BlinkPlugin.instance.namedItem_Callback_1_(unwrap_jso(this), name));
-  
+  MimeType namedItem(String name) {
+    if ((name is String || name == null)) {
+      return wrap_jso(_blink.BlinkPlugin.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    if ((name is String || name == null)) {
+      return wrap_jso(_blink.BlinkPlugin.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -30240,18 +32291,20 @@
   Plugin elementAt(int index) => this[index];
   // -- end List<Plugin> mixins.
 
-  @DomName('PluginArray.__getter__')
-  @DocsEditable()
-  Plugin __getter__(String name) => wrap_jso(_blink.BlinkPluginArray.instance.$__getter___Callback_1_(unwrap_jso(this), name));
-  
   @DomName('PluginArray.item')
   @DocsEditable()
   Plugin item(int index) => wrap_jso(_blink.BlinkPluginArray.instance.item_Callback_1_(unwrap_jso(this), index));
   
-  @DomName('PluginArray.namedItem')
-  @DocsEditable()
-  Plugin namedItem(String name) => wrap_jso(_blink.BlinkPluginArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
-  
+  Plugin namedItem(String name) {
+    if ((name is String || name == null)) {
+      return wrap_jso(_blink.BlinkPluginArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    if ((name is String || name == null)) {
+      return wrap_jso(_blink.BlinkPluginArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('PluginArray.refresh')
   @DocsEditable()
   void refresh(bool reload) => _blink.BlinkPluginArray.instance.refresh_Callback_1_(unwrap_jso(this), reload);
@@ -30289,6 +32342,16 @@
    */
   PluginPlaceholderElement.created() : super.created();
 
+  @DomName('PluginPlaceholderElement.closeable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get closeable => _blink.BlinkPluginPlaceholderElement.instance.closeable_Getter_(unwrap_jso(this));
+  
+  @DomName('PluginPlaceholderElement.closeable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set closeable(bool value) => _blink.BlinkPluginPlaceholderElement.instance.closeable_Setter_(unwrap_jso(this), value);
+  
   @DomName('PluginPlaceholderElement.message')
   @DocsEditable()
   @Experimental() // untriaged
@@ -30313,6 +32376,83 @@
 
 
 @DocsEditable()
+@DomName('PointerEvent')
+@Experimental() // untriaged
+class PointerEvent extends MouseEvent {
+  // To suppress missing implicit constructor warnings.
+  factory PointerEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PointerEvent.PointerEvent')
+  @DocsEditable()
+  factory PointerEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkPointerEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkPointerEvent.instance.constructorCallback_1_(type));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static PointerEvent internalCreatePointerEvent() {
+    return new PointerEvent._internalWrap();
+  }
+
+  external factory PointerEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PointerEvent.internal_() : super.internal_();
+
+
+  @DomName('PointerEvent.height')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get height => _blink.BlinkPointerEvent.instance.height_Getter_(unwrap_jso(this));
+  
+  @DomName('PointerEvent.isPrimary')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get isPrimary => _blink.BlinkPointerEvent.instance.isPrimary_Getter_(unwrap_jso(this));
+  
+  @DomName('PointerEvent.pointerId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get pointerId => _blink.BlinkPointerEvent.instance.pointerId_Getter_(unwrap_jso(this));
+  
+  @DomName('PointerEvent.pointerType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get pointerType => _blink.BlinkPointerEvent.instance.pointerType_Getter_(unwrap_jso(this));
+  
+  @DomName('PointerEvent.pressure')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get pressure => _blink.BlinkPointerEvent.instance.pressure_Getter_(unwrap_jso(this));
+  
+  @DomName('PointerEvent.tiltX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get tiltX => _blink.BlinkPointerEvent.instance.tiltX_Getter_(unwrap_jso(this));
+  
+  @DomName('PointerEvent.tiltY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get tiltY => _blink.BlinkPointerEvent.instance.tiltY_Getter_(unwrap_jso(this));
+  
+  @DomName('PointerEvent.width')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get width => _blink.BlinkPointerEvent.instance.width_Getter_(unwrap_jso(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('PopStateEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -30322,6 +32462,16 @@
   // To suppress missing implicit constructor warnings.
   factory PopStateEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('PopStateEvent.PopStateEvent')
+  @DocsEditable()
+  factory PopStateEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkPopStateEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkPopStateEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static PopStateEvent internalCreatePopStateEvent() {
@@ -30417,6 +32567,48 @@
 
 
 @DocsEditable()
+@DomName('PositionSensorVRDevice')
+@Experimental() // untriaged
+class PositionSensorVRDevice extends VRDevice {
+  // To suppress missing implicit constructor warnings.
+  factory PositionSensorVRDevice._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static PositionSensorVRDevice internalCreatePositionSensorVRDevice() {
+    return new PositionSensorVRDevice._internalWrap();
+  }
+
+  external factory PositionSensorVRDevice._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PositionSensorVRDevice.internal_() : super.internal_();
+
+
+  @DomName('PositionSensorVRDevice.getImmediateState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VRPositionState getImmediateState() => wrap_jso(_blink.BlinkPositionSensorVRDevice.instance.getImmediateState_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('PositionSensorVRDevice.getState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VRPositionState getState() => wrap_jso(_blink.BlinkPositionSensorVRDevice.instance.getState_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('PositionSensorVRDevice.resetSensor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void resetSensor() => _blink.BlinkPositionSensorVRDevice.instance.resetSensor_Callback_0_(unwrap_jso(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('HTMLPreElement')
 class PreElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -30471,6 +32663,150 @@
   Presentation.internal_() : super.internal_();
 
 
+  @DomName('Presentation.session')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PresentationSession get session => wrap_jso(_blink.BlinkPresentation.instance.session_Getter_(unwrap_jso(this)));
+  
+  @DomName('Presentation.getAvailability')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getAvailability(String url) => wrap_jso(_blink.BlinkPresentation.instance.getAvailability_Callback_1_(unwrap_jso(this), url));
+  
+  @DomName('Presentation.joinSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future joinSession(String url, String presentationId) => wrap_jso(_blink.BlinkPresentation.instance.joinSession_Callback_2_(unwrap_jso(this), url, presentationId));
+  
+  @DomName('Presentation.startSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future startSession(String url) => wrap_jso(_blink.BlinkPresentation.instance.startSession_Callback_1_(unwrap_jso(this), url));
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('PresentationAvailability')
+@Experimental() // untriaged
+class PresentationAvailability extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory PresentationAvailability._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PresentationAvailability.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+
+
+  @Deprecated("Internal Use Only")
+  static PresentationAvailability internalCreatePresentationAvailability() {
+    return new PresentationAvailability._internalWrap();
+  }
+
+  external factory PresentationAvailability._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PresentationAvailability.internal_() : super.internal_();
+
+
+  @DomName('PresentationAvailability.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get value => _blink.BlinkPresentationAvailability.instance.value_Getter_(unwrap_jso(this));
+  
+  @DomName('PresentationAvailability.onchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onChange => changeEvent.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('PresentationSession')
+@Experimental() // untriaged
+class PresentationSession extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory PresentationSession._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PresentationSession.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+
+  @Deprecated("Internal Use Only")
+  static PresentationSession internalCreatePresentationSession() {
+    return new PresentationSession._internalWrap();
+  }
+
+  external factory PresentationSession._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PresentationSession.internal_() : super.internal_();
+
+
+  @DomName('PresentationSession.binaryType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get binaryType => _blink.BlinkPresentationSession.instance.binaryType_Getter_(unwrap_jso(this));
+  
+  @DomName('PresentationSession.binaryType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set binaryType(String value) => _blink.BlinkPresentationSession.instance.binaryType_Setter_(unwrap_jso(this), value);
+  
+  @DomName('PresentationSession.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get id => _blink.BlinkPresentationSession.instance.id_Getter_(unwrap_jso(this));
+  
+  @DomName('PresentationSession.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get state => _blink.BlinkPresentationSession.instance.state_Getter_(unwrap_jso(this));
+  
+  @DomName('PresentationSession.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() => _blink.BlinkPresentationSession.instance.close_Callback_0_(unwrap_jso(this));
+  
+  void send(data_OR_message) {
+    if ((data_OR_message is String || data_OR_message == null)) {
+      _blink.BlinkPresentationSession.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_message));
+      return;
+    }
+    if ((data_OR_message is Blob || data_OR_message == null)) {
+      _blink.BlinkPresentationSession.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_message));
+      return;
+    }
+    if ((data_OR_message is TypedData || data_OR_message == null)) {
+      _blink.BlinkPresentationSession.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_message));
+      return;
+    }
+    if ((data_OR_message is ByteBuffer || data_OR_message == null)) {
+      _blink.BlinkPresentationSession.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_message));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('PresentationSession.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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
@@ -30589,6 +32925,16 @@
   // To suppress missing implicit constructor warnings.
   factory ProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ProgressEvent.ProgressEvent')
+  @DocsEditable()
+  factory ProgressEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkProgressEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkProgressEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static ProgressEvent internalCreateProgressEvent() {
@@ -30622,12 +32968,69 @@
 
 
 @DocsEditable()
+@DomName('PromiseRejectionEvent')
+@Experimental() // untriaged
+class PromiseRejectionEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory PromiseRejectionEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PromiseRejectionEvent.PromiseRejectionEvent')
+  @DocsEditable()
+  factory PromiseRejectionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkPromiseRejectionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkPromiseRejectionEvent.instance.constructorCallback_1_(type));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static PromiseRejectionEvent internalCreatePromiseRejectionEvent() {
+    return new PromiseRejectionEvent._internalWrap();
+  }
+
+  external factory PromiseRejectionEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  PromiseRejectionEvent.internal_() : super.internal_();
+
+
+  @DomName('PromiseRejectionEvent.promise')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future get promise => wrap_jso(_blink.BlinkPromiseRejectionEvent.instance.promise_Getter_(unwrap_jso(this)));
+  
+  @DomName('PromiseRejectionEvent.reason')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object get reason => wrap_jso(_blink.BlinkPromiseRejectionEvent.instance.reason_Getter_(unwrap_jso(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('PushEvent')
 @Experimental() // untriaged
-class PushEvent extends Event {
+class PushEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
   factory PushEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('PushEvent.PushEvent')
+  @DocsEditable()
+  factory PushEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkPushEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkPushEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static PushEvent internalCreatePushEvent() {
@@ -30643,7 +33046,7 @@
   @DomName('PushEvent.data')
   @DocsEditable()
   @Experimental() // untriaged
-  String get data => _blink.BlinkPushEvent.instance.data_Getter_(unwrap_jso(this));
+  PushMessageData get data => wrap_jso(_blink.BlinkPushEvent.instance.data_Getter_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30675,10 +33078,80 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('PushManager.register')
+  @DomName('PushManager.getSubscription')
   @DocsEditable()
   @Experimental() // untriaged
-  Future register(String senderId) => wrap_jso(_blink.BlinkPushManager.instance.register_Callback_1_(unwrap_jso(this), senderId));
+  Future getSubscription() => wrap_jso(_blink.BlinkPushManager.instance.getSubscription_Callback_0_(unwrap_jso(this)));
+  
+  Future permissionState([Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkPushManager.instance.permissionState_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+    }
+    return wrap_jso(_blink.BlinkPushManager.instance.permissionState_Callback_0_(unwrap_jso(this)));
+  }
+
+  Future subscribe([Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkPushManager.instance.subscribe_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+    }
+    return wrap_jso(_blink.BlinkPushManager.instance.subscribe_Callback_0_(unwrap_jso(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('PushMessageData')
+@Experimental() // untriaged
+class PushMessageData extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory PushMessageData._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PushMessageData.PushMessageData')
+  @DocsEditable()
+  factory PushMessageData(String message) {
+    return wrap_jso(_blink.BlinkPushMessageData.instance.constructorCallback_1_(message));
+  }
+
+  @Deprecated("Internal Use Only")
+  static PushMessageData internalCreatePushMessageData() {
+    return new PushMessageData._internalWrap();
+  }
+
+  factory PushMessageData._internalWrap() {
+    return new PushMessageData.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  PushMessageData.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('PushMessageData.arrayBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ByteBuffer arrayBuffer() => wrap_jso(_blink.BlinkPushMessageData.instance.arrayBuffer_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('PushMessageData.blob')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Blob blob() => wrap_jso(_blink.BlinkPushMessageData.instance.blob_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('PushMessageData.json')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object json() => wrap_jso(_blink.BlinkPushMessageData.instance.json_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('PushMessageData.text')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String text() => _blink.BlinkPushMessageData.instance.text_Callback_0_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30689,36 +33162,36 @@
 
 
 @DocsEditable()
-@DomName('PushRegistration')
+@DomName('PushSubscription')
 @Experimental() // untriaged
-class PushRegistration extends DartHtmlDomObject {
+class PushSubscription extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
-  factory PushRegistration._() { throw new UnsupportedError("Not supported"); }
+  factory PushSubscription._() { throw new UnsupportedError("Not supported"); }
 
   @Deprecated("Internal Use Only")
-  static PushRegistration internalCreatePushRegistration() {
-    return new PushRegistration._internalWrap();
+  static PushSubscription internalCreatePushSubscription() {
+    return new PushSubscription._internalWrap();
   }
 
-  factory PushRegistration._internalWrap() {
-    return new PushRegistration.internal_();
+  factory PushSubscription._internalWrap() {
+    return new PushSubscription.internal_();
   }
 
   @Deprecated("Internal Use Only")
-  PushRegistration.internal_() { }
+  PushSubscription.internal_() { }
 
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('PushRegistration.pushEndpoint')
+  @DomName('PushSubscription.endpoint')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pushEndpoint => _blink.BlinkPushRegistration.instance.pushEndpoint_Getter_(unwrap_jso(this));
+  String get endpoint => _blink.BlinkPushSubscription.instance.endpoint_Getter_(unwrap_jso(this));
   
-  @DomName('PushRegistration.pushRegistrationId')
+  @DomName('PushSubscription.unsubscribe')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pushRegistrationId => _blink.BlinkPushRegistration.instance.pushRegistrationId_Getter_(unwrap_jso(this));
+  Future unsubscribe() => wrap_jso(_blink.BlinkPushSubscription.instance.unsubscribe_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30838,26 +33311,6 @@
   @DocsEditable()
   static const int END_TO_START = 3;
 
-  @DomName('Range.NODE_AFTER')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  static const int NODE_AFTER = 1;
-
-  @DomName('Range.NODE_BEFORE')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  static const int NODE_BEFORE = 0;
-
-  @DomName('Range.NODE_BEFORE_AND_AFTER')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  static const int NODE_BEFORE_AND_AFTER = 2;
-
-  @DomName('Range.NODE_INSIDE')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  static const int NODE_INSIDE = 3;
-
   @DomName('Range.START_TO_END')
   @DocsEditable()
   static const int START_TO_END = 1;
@@ -30914,11 +33367,11 @@
   
   @DomName('Range.comparePoint')
   @DocsEditable()
-  int comparePoint(Node refNode, int offset) => _blink.BlinkRange.instance.comparePoint_Callback_2_(unwrap_jso(this), unwrap_jso(refNode), offset);
+  int comparePoint(Node node, int offset) => _blink.BlinkRange.instance.comparePoint_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
   
   @DomName('Range.createContextualFragment')
   @DocsEditable()
-  DocumentFragment createContextualFragment(String html) => wrap_jso(_blink.BlinkRange.instance.createContextualFragment_Callback_1_(unwrap_jso(this), html));
+  DocumentFragment createContextualFragment(String fragment) => wrap_jso(_blink.BlinkRange.instance.createContextualFragment_Callback_1_(unwrap_jso(this), fragment));
   
   @DomName('Range.deleteContents')
   @DocsEditable()
@@ -30947,43 +33400,43 @@
   
   @DomName('Range.insertNode')
   @DocsEditable()
-  void insertNode(Node newNode) => _blink.BlinkRange.instance.insertNode_Callback_1_(unwrap_jso(this), unwrap_jso(newNode));
+  void insertNode(Node node) => _blink.BlinkRange.instance.insertNode_Callback_1_(unwrap_jso(this), unwrap_jso(node));
   
   @DomName('Range.isPointInRange')
   @DocsEditable()
-  bool isPointInRange(Node refNode, int offset) => _blink.BlinkRange.instance.isPointInRange_Callback_2_(unwrap_jso(this), unwrap_jso(refNode), offset);
+  bool isPointInRange(Node node, int offset) => _blink.BlinkRange.instance.isPointInRange_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
   
   @DomName('Range.selectNode')
   @DocsEditable()
-  void selectNode(Node refNode) => _blink.BlinkRange.instance.selectNode_Callback_1_(unwrap_jso(this), unwrap_jso(refNode));
+  void selectNode(Node node) => _blink.BlinkRange.instance.selectNode_Callback_1_(unwrap_jso(this), unwrap_jso(node));
   
   @DomName('Range.selectNodeContents')
   @DocsEditable()
-  void selectNodeContents(Node refNode) => _blink.BlinkRange.instance.selectNodeContents_Callback_1_(unwrap_jso(this), unwrap_jso(refNode));
+  void selectNodeContents(Node node) => _blink.BlinkRange.instance.selectNodeContents_Callback_1_(unwrap_jso(this), unwrap_jso(node));
   
   @DomName('Range.setEnd')
   @DocsEditable()
-  void setEnd(Node refNode, int offset) => _blink.BlinkRange.instance.setEnd_Callback_2_(unwrap_jso(this), unwrap_jso(refNode), offset);
+  void setEnd(Node node, int offset) => _blink.BlinkRange.instance.setEnd_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
   
   @DomName('Range.setEndAfter')
   @DocsEditable()
-  void setEndAfter(Node refNode) => _blink.BlinkRange.instance.setEndAfter_Callback_1_(unwrap_jso(this), unwrap_jso(refNode));
+  void setEndAfter(Node node) => _blink.BlinkRange.instance.setEndAfter_Callback_1_(unwrap_jso(this), unwrap_jso(node));
   
   @DomName('Range.setEndBefore')
   @DocsEditable()
-  void setEndBefore(Node refNode) => _blink.BlinkRange.instance.setEndBefore_Callback_1_(unwrap_jso(this), unwrap_jso(refNode));
+  void setEndBefore(Node node) => _blink.BlinkRange.instance.setEndBefore_Callback_1_(unwrap_jso(this), unwrap_jso(node));
   
   @DomName('Range.setStart')
   @DocsEditable()
-  void setStart(Node refNode, int offset) => _blink.BlinkRange.instance.setStart_Callback_2_(unwrap_jso(this), unwrap_jso(refNode), offset);
+  void setStart(Node node, int offset) => _blink.BlinkRange.instance.setStart_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
   
   @DomName('Range.setStartAfter')
   @DocsEditable()
-  void setStartAfter(Node refNode) => _blink.BlinkRange.instance.setStartAfter_Callback_1_(unwrap_jso(this), unwrap_jso(refNode));
+  void setStartAfter(Node node) => _blink.BlinkRange.instance.setStartAfter_Callback_1_(unwrap_jso(this), unwrap_jso(node));
   
   @DomName('Range.setStartBefore')
   @DocsEditable()
-  void setStartBefore(Node refNode) => _blink.BlinkRange.instance.setStartBefore_Callback_1_(unwrap_jso(this), unwrap_jso(refNode));
+  void setStartBefore(Node node) => _blink.BlinkRange.instance.setStartBefore_Callback_1_(unwrap_jso(this), unwrap_jso(node));
   
   @DomName('Range.surroundContents')
   @DocsEditable()
@@ -31007,6 +33460,100 @@
 
 
 @DocsEditable()
+@DomName('ReadableByteStream')
+@Experimental() // untriaged
+class ReadableByteStream extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory ReadableByteStream._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static ReadableByteStream internalCreateReadableByteStream() {
+    return new ReadableByteStream._internalWrap();
+  }
+
+  factory ReadableByteStream._internalWrap() {
+    return new ReadableByteStream.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  ReadableByteStream.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  Future cancel([Object reason]) {
+    if (reason != null) {
+      return wrap_jso(_blink.BlinkReadableByteStream.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+    }
+    return wrap_jso(_blink.BlinkReadableByteStream.instance.cancel_Callback_0_(unwrap_jso(this)));
+  }
+
+  @DomName('ReadableByteStream.getReader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ReadableByteStreamReader getReader() => wrap_jso(_blink.BlinkReadableByteStream.instance.getReader_Callback_0_(unwrap_jso(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('ReadableByteStreamReader')
+@Experimental() // untriaged
+class ReadableByteStreamReader extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory ReadableByteStreamReader._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static ReadableByteStreamReader internalCreateReadableByteStreamReader() {
+    return new ReadableByteStreamReader._internalWrap();
+  }
+
+  factory ReadableByteStreamReader._internalWrap() {
+    return new ReadableByteStreamReader.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  ReadableByteStreamReader.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('ReadableByteStreamReader.closed')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future get closed => wrap_jso(_blink.BlinkReadableByteStreamReader.instance.closed_Getter_(unwrap_jso(this)));
+  
+  Future cancel([Object reason]) {
+    if (reason != null) {
+      return wrap_jso(_blink.BlinkReadableByteStreamReader.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+    }
+    return wrap_jso(_blink.BlinkReadableByteStreamReader.instance.cancel_Callback_0_(unwrap_jso(this)));
+  }
+
+  @DomName('ReadableByteStreamReader.read')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future read() => wrap_jso(_blink.BlinkReadableByteStreamReader.instance.read_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('ReadableByteStreamReader.releaseLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void releaseLock() => _blink.BlinkReadableByteStreamReader.instance.releaseLock_Callback_0_(unwrap_jso(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('ReadableStream')
 @Experimental() // untriaged
 class ReadableStream extends DartHtmlDomObject {
@@ -31028,30 +33575,69 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('ReadableStream.closed')
+  Future cancel([Object reason]) {
+    if (reason != null) {
+      return wrap_jso(_blink.BlinkReadableStream.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+    }
+    return wrap_jso(_blink.BlinkReadableStream.instance.cancel_Callback_0_(unwrap_jso(this)));
+  }
+
+  @DomName('ReadableStream.getReader')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get closed => wrap_jso(_blink.BlinkReadableStream.instance.closed_Getter_(unwrap_jso(this)));
+  ReadableStreamReader getReader() => wrap_jso(_blink.BlinkReadableStream.instance.getReader_Callback_0_(unwrap_jso(this)));
   
-  @DomName('ReadableStream.state')
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('ReadableStreamReader')
+@Experimental() // untriaged
+class ReadableStreamReader extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory ReadableStreamReader._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static ReadableStreamReader internalCreateReadableStreamReader() {
+    return new ReadableStreamReader._internalWrap();
+  }
+
+  factory ReadableStreamReader._internalWrap() {
+    return new ReadableStreamReader.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  ReadableStreamReader.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('ReadableStreamReader.closed')
   @DocsEditable()
   @Experimental() // untriaged
-  String get state => _blink.BlinkReadableStream.instance.state_Getter_(unwrap_jso(this));
+  Future get closed => wrap_jso(_blink.BlinkReadableStreamReader.instance.closed_Getter_(unwrap_jso(this)));
   
-  @DomName('ReadableStream.cancel')
+  Future cancel([Object reason]) {
+    if (reason != null) {
+      return wrap_jso(_blink.BlinkReadableStreamReader.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+    }
+    return wrap_jso(_blink.BlinkReadableStreamReader.instance.cancel_Callback_0_(unwrap_jso(this)));
+  }
+
+  @DomName('ReadableStreamReader.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel(Object reason) => wrap_jso(_blink.BlinkReadableStream.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+  Future read() => wrap_jso(_blink.BlinkReadableStreamReader.instance.read_Callback_0_(unwrap_jso(this)));
   
-  @DomName('ReadableStream.read')
+  @DomName('ReadableStreamReader.releaseLock')
   @DocsEditable()
   @Experimental() // untriaged
-  Object read() => wrap_jso(_blink.BlinkReadableStream.instance.read_Callback_0_(unwrap_jso(this)));
-  
-  @DomName('ReadableStream.wait')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future wait() => wrap_jso(_blink.BlinkReadableStream.instance.wait_Callback_0_(unwrap_jso(this)));
+  void releaseLock() => _blink.BlinkReadableStreamReader.instance.releaseLock_Callback_0_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31068,6 +33654,16 @@
   // To suppress missing implicit constructor warnings.
   factory RelatedEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('RelatedEvent.RelatedEvent')
+  @DocsEditable()
+  factory RelatedEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkRelatedEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkRelatedEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static RelatedEvent internalCreateRelatedEvent() {
@@ -31278,7 +33874,7 @@
   
   @DomName('RTCDataChannel.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), data);
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
   
   @DomName('RTCDataChannel.sendString')
   @DocsEditable()
@@ -31432,6 +34028,13 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDtmfToneChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('RTCDTMFToneChangeEvent.RTCDTMFToneChangeEvent')
+  @DocsEditable()
+  factory RtcDtmfToneChangeEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return wrap_jso(_blink.BlinkRTCDTMFToneChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+  }
+
 
   @Deprecated("Internal Use Only")
   static RtcDtmfToneChangeEvent internalCreateRtcDtmfToneChangeEvent() {
@@ -31467,9 +34070,9 @@
 
   @DomName('RTCIceCandidate.RTCIceCandidate')
   @DocsEditable()
-  factory RtcIceCandidate(Map dictionary) {
-    var dictionary_1 = convertDartToNative_Dictionary(dictionary);
-    return wrap_jso(_blink.BlinkRTCIceCandidate.instance.constructorCallback_1_(dictionary_1));
+  factory RtcIceCandidate(Map candidateInitDict) {
+    var candidateInitDict_1 = convertDartToNative_Dictionary(candidateInitDict);
+    return wrap_jso(_blink.BlinkRTCIceCandidate.instance.constructorCallback_1_(candidateInitDict_1));
   }
 
   @Deprecated("Internal Use Only")
@@ -31930,14 +34533,6 @@
   @DocsEditable()
   String get id => _blink.BlinkRTCStatsReport.instance.id_Getter_(unwrap_jso(this));
   
-  @DomName('RTCStatsReport.local')
-  @DocsEditable()
-  RtcStatsReport get local => wrap_jso(_blink.BlinkRTCStatsReport.instance.local_Getter_(unwrap_jso(this)));
-  
-  @DomName('RTCStatsReport.remote')
-  @DocsEditable()
-  RtcStatsReport get remote => wrap_jso(_blink.BlinkRTCStatsReport.instance.remote_Getter_(unwrap_jso(this)));
-  
   @DomName('RTCStatsReport.timestamp')
   @DocsEditable()
   DateTime get timestamp => _blink.BlinkRTCStatsReport.instance.timestamp_Getter_(unwrap_jso(this));
@@ -31985,14 +34580,16 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('RTCStatsResponse.__getter__')
-  @DocsEditable()
-  RtcStatsReport __getter__(String name) => wrap_jso(_blink.BlinkRTCStatsResponse.instance.$__getter___Callback_1_(unwrap_jso(this), name));
-  
-  @DomName('RTCStatsResponse.namedItem')
-  @DocsEditable()
-  RtcStatsReport namedItem(String name) => wrap_jso(_blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(unwrap_jso(this), name));
-  
+  RtcStatsReport namedItem(String name) {
+    if ((name is String || name == null)) {
+      return wrap_jso(_blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    if ((name is String || name == null)) {
+      return wrap_jso(_blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
   List<RtcStatsReport> result() => wrap_jso(_blink.BlinkRTCStatsResponse.instance.result_Callback_0_(unwrap_jso(this)));
@@ -32245,6 +34842,121 @@
 
 
 @DocsEditable()
+@DomName('ScrollState')
+@Experimental() // untriaged
+class ScrollState extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory ScrollState._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ScrollState.ScrollState')
+  @DocsEditable()
+  factory ScrollState([num deltaX, num deltaY, num deltaGranularity, num velocityX, num velocityY, bool inInertialPhase, bool isBeginning, bool isEnding]) {
+    if (isEnding != null) {
+      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_8_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding));
+    }
+    if (isBeginning != null) {
+      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_7_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning));
+    }
+    if (inInertialPhase != null) {
+      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_6_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase));
+    }
+    if (velocityY != null) {
+      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_5_(deltaX, deltaY, deltaGranularity, velocityX, velocityY));
+    }
+    if (velocityX != null) {
+      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_4_(deltaX, deltaY, deltaGranularity, velocityX));
+    }
+    if (deltaGranularity != null) {
+      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_3_(deltaX, deltaY, deltaGranularity));
+    }
+    if (deltaY != null) {
+      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_2_(deltaX, deltaY));
+    }
+    if (deltaX != null) {
+      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_1_(deltaX));
+    }
+    return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_0_());
+  }
+
+  @Deprecated("Internal Use Only")
+  static ScrollState internalCreateScrollState() {
+    return new ScrollState._internalWrap();
+  }
+
+  factory ScrollState._internalWrap() {
+    return new ScrollState.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  ScrollState.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('ScrollState.deltaGranularity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get deltaGranularity => _blink.BlinkScrollState.instance.deltaGranularity_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.deltaX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get deltaX => _blink.BlinkScrollState.instance.deltaX_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.deltaY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get deltaY => _blink.BlinkScrollState.instance.deltaY_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.fromUserInput')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get fromUserInput => _blink.BlinkScrollState.instance.fromUserInput_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.inInertialPhase')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get inInertialPhase => _blink.BlinkScrollState.instance.inInertialPhase_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.isBeginning')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get isBeginning => _blink.BlinkScrollState.instance.isBeginning_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.isEnding')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get isEnding => _blink.BlinkScrollState.instance.isEnding_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.shouldPropagate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get shouldPropagate => _blink.BlinkScrollState.instance.shouldPropagate_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.velocityX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get velocityX => _blink.BlinkScrollState.instance.velocityX_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.velocityY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get velocityY => _blink.BlinkScrollState.instance.velocityY_Getter_(unwrap_jso(this));
+  
+  @DomName('ScrollState.consumeDelta')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void consumeDelta(num x, num y) => _blink.BlinkScrollState.instance.consumeDelta_Callback_2_(unwrap_jso(this), x, y);
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('SecurityPolicyViolationEvent')
 // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicyviolationevent-events
 @Experimental()
@@ -32252,6 +34964,16 @@
   // To suppress missing implicit constructor warnings.
   factory SecurityPolicyViolationEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SecurityPolicyViolationEvent.SecurityPolicyViolationEvent')
+  @DocsEditable()
+  factory SecurityPolicyViolationEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkSecurityPolicyViolationEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkSecurityPolicyViolationEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static SecurityPolicyViolationEvent internalCreateSecurityPolicyViolationEvent() {
@@ -32437,12 +35159,12 @@
   
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable()
-  void __setter__(int index, OptionElement value) => _blink.BlinkHTMLSelectElement.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(value));
+  void __setter__(int index, OptionElement option) => _blink.BlinkHTMLSelectElement.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(option));
   
   @DomName('HTMLSelectElement.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(HtmlElement element, int before) => _blink.BlinkHTMLSelectElement.instance.add_Callback_2_(unwrap_jso(this), unwrap_jso(element), before);
+  void add(Object element, Object before) => _blink.BlinkHTMLSelectElement.instance.add_Callback_2_(unwrap_jso(this), element, before);
   
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
@@ -32454,7 +35176,12 @@
   
   @DomName('HTMLSelectElement.namedItem')
   @DocsEditable()
-  Element namedItem(String name) => wrap_jso(_blink.BlinkHTMLSelectElement.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+  OptionElement namedItem(String name) => wrap_jso(_blink.BlinkHTMLSelectElement.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+  
+  @DomName('HTMLSelectElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLSelectElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
   
   @DomName('HTMLSelectElement.setCustomValidity')
   @DocsEditable()
@@ -32580,7 +35307,7 @@
   @DomName('Selection.containsNode')
   @DocsEditable()
   @Experimental() // non-standard
-  bool containsNode(Node node, bool allowPartial) => _blink.BlinkSelection.instance.containsNode_Callback_2_(unwrap_jso(this), unwrap_jso(node), allowPartial);
+  bool containsNode(Node node, bool allowPartialContainment) => _blink.BlinkSelection.instance.containsNode_Callback_2_(unwrap_jso(this), unwrap_jso(node), allowPartialContainment);
   
   @DomName('Selection.deleteFromDocument')
   @DocsEditable()
@@ -32640,37 +35367,56 @@
 
 
 @DocsEditable()
-@DomName('ServiceWorkerClient')
+@DomName('ServicePort')
 @Experimental() // untriaged
-class ServiceWorkerClient extends DartHtmlDomObject {
+class ServicePort extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
-  factory ServiceWorkerClient._() { throw new UnsupportedError("Not supported"); }
+  factory ServicePort._() { throw new UnsupportedError("Not supported"); }
 
   @Deprecated("Internal Use Only")
-  static ServiceWorkerClient internalCreateServiceWorkerClient() {
-    return new ServiceWorkerClient._internalWrap();
+  static ServicePort internalCreateServicePort() {
+    return new ServicePort._internalWrap();
   }
 
-  factory ServiceWorkerClient._internalWrap() {
-    return new ServiceWorkerClient.internal_();
+  factory ServicePort._internalWrap() {
+    return new ServicePort.internal_();
   }
 
   @Deprecated("Internal Use Only")
-  ServiceWorkerClient.internal_() { }
+  ServicePort.internal_() { }
 
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('ServiceWorkerClient.id')
+  @DomName('ServicePort.data')
   @DocsEditable()
   @Experimental() // untriaged
-  int get id => _blink.BlinkServiceWorkerClient.instance.id_Getter_(unwrap_jso(this));
+  Object get data => wrap_jso(_blink.BlinkServicePort.instance.data_Getter_(unwrap_jso(this)));
   
-  @DomName('ServiceWorkerClient.postMessage')
+  @DomName('ServicePort.name')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) => _blink.BlinkServiceWorkerClient.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+  String get name => _blink.BlinkServicePort.instance.name_Getter_(unwrap_jso(this));
   
+  @DomName('ServicePort.targetURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get targetUrl => _blink.BlinkServicePort.instance.targetURL_Getter_(unwrap_jso(this));
+  
+  @DomName('ServicePort.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() => _blink.BlinkServicePort.instance.close_Callback_0_(unwrap_jso(this));
+  
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      _blink.BlinkServicePort.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      return;
+    }
+    _blink.BlinkServicePort.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    return;
+  }
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -32680,34 +35426,105 @@
 
 
 @DocsEditable()
-@DomName('ServiceWorkerClients')
+@DomName('ServicePortCollection')
 @Experimental() // untriaged
-class ServiceWorkerClients extends DartHtmlDomObject {
+class ServicePortCollection extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory ServiceWorkerClients._() { throw new UnsupportedError("Not supported"); }
+  factory ServicePortCollection._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ServicePortCollection.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
 
   @Deprecated("Internal Use Only")
-  static ServiceWorkerClients internalCreateServiceWorkerClients() {
-    return new ServiceWorkerClients._internalWrap();
+  static ServicePortCollection internalCreateServicePortCollection() {
+    return new ServicePortCollection._internalWrap();
   }
 
-  factory ServiceWorkerClients._internalWrap() {
-    return new ServiceWorkerClients.internal_();
-  }
+  external factory ServicePortCollection._internalWrap();
 
   @Deprecated("Internal Use Only")
-  ServiceWorkerClients.internal_() { }
+  ServicePortCollection.internal_() : super.internal_();
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
 
-  Future getAll([Map options]) {
+  Future connect(String url, [Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkServiceWorkerClients.instance.getAll_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return wrap_jso(_blink.BlinkServicePortCollection.instance.connect_Callback_2_(unwrap_jso(this), url, convertDartToNative_Dictionary(options)));
     }
-    return wrap_jso(_blink.BlinkServiceWorkerClients.instance.getAll_Callback_0_(unwrap_jso(this)));
+    return wrap_jso(_blink.BlinkServicePortCollection.instance.connect_Callback_1_(unwrap_jso(this), url));
   }
 
+  @DomName('ServicePortCollection.match')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future match(Map options) => wrap_jso(_blink.BlinkServicePortCollection.instance.match_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+  
+  Future matchAll([Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkServicePortCollection.instance.matchAll_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+    }
+    return wrap_jso(_blink.BlinkServicePortCollection.instance.matchAll_Callback_0_(unwrap_jso(this)));
+  }
+
+  @DomName('ServicePortCollection.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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('ServicePortConnectEvent')
+@Experimental() // untriaged
+class ServicePortConnectEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory ServicePortConnectEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ServicePortConnectEvent.ServicePortConnectEvent')
+  @DocsEditable()
+  factory ServicePortConnectEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkServicePortConnectEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkServicePortConnectEvent.instance.constructorCallback_1_(type));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static ServicePortConnectEvent internalCreateServicePortConnectEvent() {
+    return new ServicePortConnectEvent._internalWrap();
+  }
+
+  external factory ServicePortConnectEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  ServicePortConnectEvent.internal_() : super.internal_();
+
+
+  @DomName('ServicePortConnectEvent.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get origin => _blink.BlinkServicePortConnectEvent.instance.origin_Getter_(unwrap_jso(this));
+  
+  @DomName('ServicePortConnectEvent.targetURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get targetUrl => _blink.BlinkServicePortConnectEvent.instance.targetURL_Getter_(unwrap_jso(this));
+  
+  @DomName('ServicePortConnectEvent.respondWith')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future respondWith(Future response) => wrap_jso(_blink.BlinkServicePortConnectEvent.instance.respondWith_Callback_1_(unwrap_jso(this), 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
@@ -32719,24 +35536,26 @@
 @DocsEditable()
 @DomName('ServiceWorkerContainer')
 @Experimental() // untriaged
-class ServiceWorkerContainer extends DartHtmlDomObject {
+class ServiceWorkerContainer extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerContainer._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ServiceWorkerContainer.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+
   @Deprecated("Internal Use Only")
   static ServiceWorkerContainer internalCreateServiceWorkerContainer() {
     return new ServiceWorkerContainer._internalWrap();
   }
 
-  factory ServiceWorkerContainer._internalWrap() {
-    return new ServiceWorkerContainer.internal_();
-  }
+  external factory ServiceWorkerContainer._internalWrap();
 
   @Deprecated("Internal Use Only")
-  ServiceWorkerContainer.internal_() { }
+  ServiceWorkerContainer.internal_() : super.internal_();
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
 
   @DomName('ServiceWorkerContainer.controller')
   @DocsEditable()
@@ -32755,6 +35574,11 @@
     return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_0_(unwrap_jso(this)));
   }
 
+  @DomName('ServiceWorkerContainer.getRegistrations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistrations() => wrap_jso(_blink.BlinkServiceWorkerContainer.instance.getRegistrations_Callback_0_(unwrap_jso(this)));
+  
   Future register(String url, [Map options]) {
     if (options != null) {
       return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.register_Callback_2_(unwrap_jso(this), url, convertDartToNative_Dictionary(options)));
@@ -32762,6 +35586,11 @@
     return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.register_Callback_1_(unwrap_jso(this), url));
   }
 
+  @DomName('ServiceWorkerContainer.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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
@@ -32794,48 +35623,111 @@
   ServiceWorkerGlobalScope.internal_() : super.internal_();
 
 
-  @DomName('ServiceWorkerGlobalScope.caches')
-  @DocsEditable()
-  @Experimental() // untriaged
-  CacheStorage get caches => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.caches_Getter_(unwrap_jso(this)));
-  
   @DomName('ServiceWorkerGlobalScope.clients')
   @DocsEditable()
   @Experimental() // untriaged
-  ServiceWorkerClients get clients => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.clients_Getter_(unwrap_jso(this)));
+  Clients get clients => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.clients_Getter_(unwrap_jso(this)));
   
-  @DomName('ServiceWorkerGlobalScope.scope')
+  @DomName('ServiceWorkerGlobalScope.ports')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scope => _blink.BlinkServiceWorkerGlobalScope.instance.scope_Getter_(unwrap_jso(this));
+  StashedPortCollection get ports => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.ports_Getter_(unwrap_jso(this)));
+  
+  @DomName('ServiceWorkerGlobalScope.registration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ServiceWorkerRegistration get registration => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.registration_Getter_(unwrap_jso(this)));
   
   @DomName('ServiceWorkerGlobalScope.close')
   @DocsEditable()
   @Experimental() // untriaged
   void close() => _blink.BlinkServiceWorkerGlobalScope.instance.close_Callback_0_(unwrap_jso(this));
   
-  Future _fetch(request, [Map requestInitDict]) {
-    if ((request is String || request == null) && requestInitDict == null) {
-      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), unwrap_jso(request)));
+  Future _fetch(/*RequestInfo*/ input, [Map init]) {
+    if (init != null) {
+      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), input, convertDartToNative_Dictionary(init)));
     }
-    if ((requestInitDict is Map || requestInitDict == null) && (request is String || request == null)) {
-      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), unwrap_jso(request), convertDartToNative_Dictionary(requestInitDict)));
-    }
-    if ((request is _Request || request == null) && requestInitDict == null) {
-      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), unwrap_jso(request)));
-    }
-    if ((requestInitDict is Map || requestInitDict == null) && (request is _Request || request == null)) {
-      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), unwrap_jso(request), convertDartToNative_Dictionary(requestInitDict)));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), input));
   }
 
+  @DomName('ServiceWorkerGlobalScope.skipWaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future skipWaiting() => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.skipWaiting_Callback_0_(unwrap_jso(this)));
+  
   @DomName('ServiceWorkerGlobalScope.onmessage')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
 }
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+// TODO(alanknight): Provide a nicer constructor that uses named parameters
+// rather than an initialization map.
+@DomName('ServiceWorkerMessageEvent')
+@Experimental() // untriaged
+class ServiceWorkerMessageEvent extends Event {
+
+  // TODO(alanknight): This really should be generated by the
+  // _OutputConversion in the systemnative.py script, but that doesn't
+  // use those conversions right now, so do this as a one-off.
+  @DomName('ServiceWorkerMessageEvent.data')
+  @DocsEditable()
+  dynamic get data => convertNativeToDart_SerializedScriptValue(
+      _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+
+  // To suppress missing implicit constructor warnings.
+  factory ServiceWorkerMessageEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ServiceWorkerMessageEvent.ServiceWorkerMessageEvent')
+  @DocsEditable()
+  factory ServiceWorkerMessageEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkServiceWorkerMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkServiceWorkerMessageEvent.instance.constructorCallback_1_(type));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static ServiceWorkerMessageEvent internalCreateServiceWorkerMessageEvent() {
+    return new ServiceWorkerMessageEvent._internalWrap();
+  }
+
+  external factory ServiceWorkerMessageEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  ServiceWorkerMessageEvent.internal_() : super.internal_();
+
+
+  @DomName('ServiceWorkerMessageEvent.lastEventId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get lastEventId => _blink.BlinkServiceWorkerMessageEvent.instance.lastEventId_Getter_(unwrap_jso(this));
+  
+  @DomName('ServiceWorkerMessageEvent.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get origin => _blink.BlinkServiceWorkerMessageEvent.instance.origin_Getter_(unwrap_jso(this));
+  
+  @DomName('ServiceWorkerMessageEvent.ports')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<MessagePort> get ports => wrap_jso(_blink.BlinkServiceWorkerMessageEvent.instance.ports_Getter_(unwrap_jso(this)));
+  
+  @DomName('ServiceWorkerMessageEvent.source')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object get source => wrap_jso(_blink.BlinkServiceWorkerMessageEvent.instance.source_Getter_(unwrap_jso(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.
@@ -32867,26 +35759,65 @@
   @Experimental() // untriaged
   _ServiceWorker get active => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.active_Getter_(unwrap_jso(this)));
   
+  @DomName('ServiceWorkerRegistration.geofencing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Geofencing get geofencing => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.geofencing_Getter_(unwrap_jso(this)));
+  
   @DomName('ServiceWorkerRegistration.installing')
   @DocsEditable()
   @Experimental() // untriaged
   _ServiceWorker get installing => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.installing_Getter_(unwrap_jso(this)));
   
+  @DomName('ServiceWorkerRegistration.periodicSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PeriodicSyncManager get periodicSync => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.periodicSync_Getter_(unwrap_jso(this)));
+  
+  @DomName('ServiceWorkerRegistration.pushManager')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PushManager get pushManager => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.pushManager_Getter_(unwrap_jso(this)));
+  
   @DomName('ServiceWorkerRegistration.scope')
   @DocsEditable()
   @Experimental() // untriaged
   String get scope => _blink.BlinkServiceWorkerRegistration.instance.scope_Getter_(unwrap_jso(this));
   
+  @DomName('ServiceWorkerRegistration.sync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  SyncManager get sync => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.sync_Getter_(unwrap_jso(this)));
+  
   @DomName('ServiceWorkerRegistration.waiting')
   @DocsEditable()
   @Experimental() // untriaged
   _ServiceWorker get waiting => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.waiting_Getter_(unwrap_jso(this)));
   
+  Future getNotifications([Map filter]) {
+    if (filter != null) {
+      return wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.getNotifications_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(filter)));
+    }
+    return wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.getNotifications_Callback_0_(unwrap_jso(this)));
+  }
+
+  Future showNotification(String title, [Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.showNotification_Callback_2_(unwrap_jso(this), title, convertDartToNative_Dictionary(options)));
+    }
+    return wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.showNotification_Callback_1_(unwrap_jso(this), title));
+  }
+
   @DomName('ServiceWorkerRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
   Future unregister() => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.unregister_Callback_0_(unwrap_jso(this)));
   
+  @DomName('ServiceWorkerRegistration.update')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void update() => _blink.BlinkServiceWorkerRegistration.instance.update_Callback_0_(unwrap_jso(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
@@ -32966,6 +35897,11 @@
   @DocsEditable()
   Element get activeElement => wrap_jso(_blink.BlinkShadowRoot.instance.activeElement_Getter_(unwrap_jso(this)));
   
+  @DomName('ShadowRoot.delegatesFocus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get delegatesFocus => _blink.BlinkShadowRoot.instance.delegatesFocus_Getter_(unwrap_jso(this));
+  
   @DomName('ShadowRoot.host')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32997,17 +35933,10 @@
   @DocsEditable()
   Element elementFromPoint(int x, int y) => wrap_jso(_blink.BlinkShadowRoot.instance.elementFromPoint_Callback_2_(unwrap_jso(this), x, y));
   
-  @DomName('ShadowRoot.getElementById')
+  @DomName('ShadowRoot.elementsFromPoint')
   @DocsEditable()
-  Element getElementById(String elementId) => wrap_jso(_blink.BlinkShadowRoot.instance.getElementById_Callback_1_(unwrap_jso(this), elementId));
-  
-  @DomName('ShadowRoot.getElementsByClassName')
-  @DocsEditable()
-  List<Node> getElementsByClassName(String className) => wrap_jso(_blink.BlinkShadowRoot.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), className));
-  
-  @DomName('ShadowRoot.getElementsByTagName')
-  @DocsEditable()
-  List<Node> getElementsByTagName(String tagName) => wrap_jso(_blink.BlinkShadowRoot.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), tagName));
+  @Experimental() // untriaged
+  List<Element> elementsFromPoint(int x, int y) => wrap_jso(_blink.BlinkShadowRoot.instance.elementsFromPoint_Callback_2_(unwrap_jso(this), x, y));
   
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
@@ -33058,6 +35987,41 @@
 
 
 @DocsEditable()
+@DomName('SharedArrayBuffer')
+@Experimental() // untriaged
+class SharedArrayBuffer extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory SharedArrayBuffer._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static SharedArrayBuffer internalCreateSharedArrayBuffer() {
+    return new SharedArrayBuffer._internalWrap();
+  }
+
+  factory SharedArrayBuffer._internalWrap() {
+    return new SharedArrayBuffer.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  SharedArrayBuffer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('SharedArrayBuffer.byteLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get byteLength => _blink.BlinkSharedArrayBuffer.instance.byteLength_Getter_(unwrap_jso(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('SharedWorker')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface
 @Experimental()
@@ -33221,6 +36185,16 @@
   @DocsEditable()
   set timestampOffset(num value) => _blink.BlinkSourceBuffer.instance.timestampOffset_Setter_(unwrap_jso(this), value);
   
+  @DomName('SourceBuffer.trackDefaults')
+  @DocsEditable()
+  @Experimental() // untriaged
+  TrackDefaultList get trackDefaults => wrap_jso(_blink.BlinkSourceBuffer.instance.trackDefaults_Getter_(unwrap_jso(this)));
+  
+  @DomName('SourceBuffer.trackDefaults')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set trackDefaults(TrackDefaultList value) => _blink.BlinkSourceBuffer.instance.trackDefaults_Setter_(unwrap_jso(this), unwrap_jso(value));
+  
   @DomName('SourceBuffer.updating')
   @DocsEditable()
   @Experimental() // untriaged
@@ -33233,7 +36207,7 @@
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendBuffer(ByteBuffer data) => _blink.BlinkSourceBuffer.instance.appendBuffer_Callback_1_(unwrap_jso(this), data);
+  void appendBuffer(ByteBuffer data) => _blink.BlinkSourceBuffer.instance.appendBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(data));
   
   void appendStream(FileStream stream, [int maxSize]) {
     if (maxSize != null) {
@@ -33372,16 +36346,6 @@
    */
   SourceElement.created() : super.created();
 
-  @DomName('HTMLSourceElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLSourceElement.instance.integrity_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLSourceElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLSourceElement.instance.integrity_Setter_(unwrap_jso(this), value);
-  
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
   String get media => _blink.BlinkHTMLSourceElement.instance.media_Getter_(unwrap_jso(this));
@@ -33822,6 +36786,16 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
+  @DomName('SpeechRecognition.audioTrack')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStreamTrack get audioTrack => wrap_jso(_blink.BlinkSpeechRecognition.instance.audioTrack_Getter_(unwrap_jso(this)));
+  
+  @DomName('SpeechRecognition.audioTrack')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set audioTrack(MediaStreamTrack value) => _blink.BlinkSpeechRecognition.instance.audioTrack_Setter_(unwrap_jso(this), unwrap_jso(value));
+  
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
   bool get continuous => _blink.BlinkSpeechRecognition.instance.continuous_Getter_(unwrap_jso(this));
@@ -33862,6 +36836,16 @@
   @DocsEditable()
   set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Setter_(unwrap_jso(this), value);
   
+  @DomName('SpeechRecognition.serviceURI')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get serviceUri => _blink.BlinkSpeechRecognition.instance.serviceURI_Getter_(unwrap_jso(this));
+  
+  @DomName('SpeechRecognition.serviceURI')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set serviceUri(String value) => _blink.BlinkSpeechRecognition.instance.serviceURI_Setter_(unwrap_jso(this), value);
+  
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
   void abort() => _blink.BlinkSpeechRecognition.instance.abort_Callback_0_(unwrap_jso(this));
@@ -33986,6 +36970,16 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionError._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SpeechRecognitionError.SpeechRecognitionError')
+  @DocsEditable()
+  factory SpeechRecognitionError(String type, [Map initDict]) {
+    if (initDict != null) {
+      var initDict_1 = convertDartToNative_Dictionary(initDict);
+      return wrap_jso(_blink.BlinkSpeechRecognitionError.instance.constructorCallback_2_(type, initDict_1));
+    }
+    return wrap_jso(_blink.BlinkSpeechRecognitionError.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static SpeechRecognitionError internalCreateSpeechRecognitionError() {
@@ -34023,6 +37017,16 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SpeechRecognitionEvent.SpeechRecognitionEvent')
+  @DocsEditable()
+  factory SpeechRecognitionEvent(String type, [Map initDict]) {
+    if (initDict != null) {
+      var initDict_1 = convertDartToNative_Dictionary(initDict);
+      return wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.constructorCallback_2_(type, initDict_1));
+    }
+    return wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static SpeechRecognitionEvent internalCreateSpeechRecognitionEvent() {
@@ -34195,6 +37199,11 @@
   @DocsEditable()
   String get name => _blink.BlinkSpeechSynthesisEvent.instance.name_Getter_(unwrap_jso(this));
   
+  @DomName('SpeechSynthesisEvent.utterance')
+  @DocsEditable()
+  @Experimental() // untriaged
+  SpeechSynthesisUtterance get utterance => wrap_jso(_blink.BlinkSpeechSynthesisEvent.instance.utterance_Getter_(unwrap_jso(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
@@ -34438,6 +37447,80 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('StashedMessagePort')
+@Experimental() // untriaged
+class StashedMessagePort extends MessagePort {
+  // To suppress missing implicit constructor warnings.
+  factory StashedMessagePort._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static StashedMessagePort internalCreateStashedMessagePort() {
+    return new StashedMessagePort._internalWrap();
+  }
+
+  external factory StashedMessagePort._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  StashedMessagePort.internal_() : super.internal_();
+
+
+  @DomName('StashedMessagePort.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get name => _blink.BlinkStashedMessagePort.instance.name_Getter_(unwrap_jso(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('StashedPortCollection')
+@Experimental() // untriaged
+class StashedPortCollection extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory StashedPortCollection._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('StashedPortCollection.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+
+  @Deprecated("Internal Use Only")
+  static StashedPortCollection internalCreateStashedPortCollection() {
+    return new StashedPortCollection._internalWrap();
+  }
+
+  external factory StashedPortCollection._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  StashedPortCollection.internal_() : super.internal_();
+
+
+  @DomName('StashedPortCollection.add')
+  @DocsEditable()
+  @Experimental() // untriaged
+  StashedMessagePort add(String name, MessagePort port) => wrap_jso(_blink.BlinkStashedPortCollection.instance.add_Callback_2_(unwrap_jso(this), name, unwrap_jso(port)));
+  
+  @DomName('StashedPortCollection.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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.
+
 
 /**
  * The type used by the
@@ -34626,8 +37709,16 @@
         newValue, url, storageArea);
     return e;
   }
-  // To suppress missing implicit constructor warnings.
-  factory StorageEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('StorageEvent.StorageEvent')
+  @DocsEditable()
+  factory StorageEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkStorageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkStorageEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -34958,6 +38049,137 @@
 
 
 @DocsEditable()
+@DomName('SyncEvent')
+@Experimental() // untriaged
+class SyncEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory SyncEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('SyncEvent.SyncEvent')
+  @DocsEditable()
+  factory SyncEvent(String type, Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return wrap_jso(_blink.BlinkSyncEvent.instance.constructorCallback_2_(type, init_1));
+  }
+
+
+  @Deprecated("Internal Use Only")
+  static SyncEvent internalCreateSyncEvent() {
+    return new SyncEvent._internalWrap();
+  }
+
+  external factory SyncEvent._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  SyncEvent.internal_() : super.internal_();
+
+
+  @DomName('SyncEvent.registration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  SyncRegistration get registration => wrap_jso(_blink.BlinkSyncEvent.instance.registration_Getter_(unwrap_jso(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('SyncManager')
+@Experimental() // untriaged
+class SyncManager extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory SyncManager._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static SyncManager internalCreateSyncManager() {
+    return new SyncManager._internalWrap();
+  }
+
+  factory SyncManager._internalWrap() {
+    return new SyncManager.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  SyncManager.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('SyncManager.getRegistration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistration(String tag) => wrap_jso(_blink.BlinkSyncManager.instance.getRegistration_Callback_1_(unwrap_jso(this), tag));
+  
+  @DomName('SyncManager.getRegistrations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getRegistrations() => wrap_jso(_blink.BlinkSyncManager.instance.getRegistrations_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('SyncManager.permissionState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future permissionState() => wrap_jso(_blink.BlinkSyncManager.instance.permissionState_Callback_0_(unwrap_jso(this)));
+  
+  Future register([Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkSyncManager.instance.register_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+    }
+    return wrap_jso(_blink.BlinkSyncManager.instance.register_Callback_0_(unwrap_jso(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('SyncRegistration')
+@Experimental() // untriaged
+class SyncRegistration extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory SyncRegistration._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static SyncRegistration internalCreateSyncRegistration() {
+    return new SyncRegistration._internalWrap();
+  }
+
+  factory SyncRegistration._internalWrap() {
+    return new SyncRegistration.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  SyncRegistration.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('SyncRegistration.tag')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get tag => _blink.BlinkSyncRegistration.instance.tag_Getter_(unwrap_jso(this));
+  
+  @DomName('SyncRegistration.unregister')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future unregister() => wrap_jso(_blink.BlinkSyncRegistration.instance.unregister_Callback_0_(unwrap_jso(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('HTMLTableCaptionElement')
 class TableCaptionElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -35478,6 +38700,16 @@
    */
   TextAreaElement.created() : super.created();
 
+  @DomName('HTMLTextAreaElement.autocapitalize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get autocapitalize => _blink.BlinkHTMLTextAreaElement.instance.autocapitalize_Getter_(unwrap_jso(this));
+  
+  @DomName('HTMLTextAreaElement.autocapitalize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set autocapitalize(String value) => _blink.BlinkHTMLTextAreaElement.instance.autocapitalize_Setter_(unwrap_jso(this), value);
+  
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
   bool get autofocus => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Getter_(unwrap_jso(this));
@@ -35549,6 +38781,16 @@
   @DocsEditable()
   set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Setter_(unwrap_jso(this), value);
   
+  @DomName('HTMLTextAreaElement.minLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get minLength => _blink.BlinkHTMLTextAreaElement.instance.minLength_Getter_(unwrap_jso(this));
+  
+  @DomName('HTMLTextAreaElement.minLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set minLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.minLength_Setter_(unwrap_jso(this), value);
+  
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
   String get name => _blink.BlinkHTMLTextAreaElement.instance.name_Getter_(unwrap_jso(this));
@@ -35653,6 +38895,11 @@
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLTextAreaElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
   
+  @DomName('HTMLTextAreaElement.reportValidity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool reportValidity() => _blink.BlinkHTMLTextAreaElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  
   @DomName('HTMLTextAreaElement.select')
   @DocsEditable()
   void select() => _blink.BlinkHTMLTextAreaElement.instance.select_Callback_0_(unwrap_jso(this));
@@ -36267,126 +39514,6 @@
 
 
 @DocsEditable()
-@DomName('Timing')
-@Experimental() // untriaged
-class Timing extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory Timing._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static Timing internalCreateTiming() {
-    return new Timing._internalWrap();
-  }
-
-  factory Timing._internalWrap() {
-    return new Timing.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  Timing.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
-  @DomName('Timing.delay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get delay => _blink.BlinkTiming.instance.delay_Getter_(unwrap_jso(this));
-  
-  @DomName('Timing.delay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set delay(num value) => _blink.BlinkTiming.instance.delay_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Timing.direction')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get direction => _blink.BlinkTiming.instance.direction_Getter_(unwrap_jso(this));
-  
-  @DomName('Timing.direction')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set direction(String value) => _blink.BlinkTiming.instance.direction_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Timing.easing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get easing => _blink.BlinkTiming.instance.easing_Getter_(unwrap_jso(this));
-  
-  @DomName('Timing.easing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set easing(String value) => _blink.BlinkTiming.instance.easing_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Timing.endDelay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get endDelay => _blink.BlinkTiming.instance.endDelay_Getter_(unwrap_jso(this));
-  
-  @DomName('Timing.endDelay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set endDelay(num value) => _blink.BlinkTiming.instance.endDelay_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Timing.fill')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get fill => _blink.BlinkTiming.instance.fill_Getter_(unwrap_jso(this));
-  
-  @DomName('Timing.fill')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set fill(String value) => _blink.BlinkTiming.instance.fill_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Timing.iterationStart')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get iterationStart => _blink.BlinkTiming.instance.iterationStart_Getter_(unwrap_jso(this));
-  
-  @DomName('Timing.iterationStart')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set iterationStart(num value) => _blink.BlinkTiming.instance.iterationStart_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Timing.iterations')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get iterations => _blink.BlinkTiming.instance.iterations_Getter_(unwrap_jso(this));
-  
-  @DomName('Timing.iterations')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set iterations(num value) => _blink.BlinkTiming.instance.iterations_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Timing.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get playbackRate => _blink.BlinkTiming.instance.playbackRate_Getter_(unwrap_jso(this));
-  
-  @DomName('Timing.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set playbackRate(num value) => _blink.BlinkTiming.instance.playbackRate_Setter_(unwrap_jso(this), value);
-  
-  @DomName('Timing.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object __getter__(String name) => wrap_jso(_blink.BlinkTiming.instance.$__getter___Callback_1_(unwrap_jso(this), name));
-  
-  @DomName('Timing.__setter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void __setter__(String name, num duration) => _blink.BlinkTiming.instance.$__setter___Callback_2_(unwrap_jso(this), name, duration);
-  
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source 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 HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -36478,6 +39605,11 @@
   @Experimental() // untriaged
   num get _radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(unwrap_jso(this));
   
+  @DomName('Touch.rotationAngle')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get rotationAngle => _blink.BlinkTouch.instance.rotationAngle_Getter_(unwrap_jso(this));
+  
   @DomName('Touch.screenX')
   @DocsEditable()
   num get _screenX => _blink.BlinkTouch.instance.screenX_Getter_(unwrap_jso(this));
@@ -36490,13 +39622,6 @@
   @DocsEditable()
   EventTarget get target => wrap_jso(_blink.BlinkTouch.instance.target_Getter_(unwrap_jso(this)));
   
-  @DomName('Touch.webkitRotationAngle')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  num get rotationAngle => _blink.BlinkTouch.instance.webkitRotationAngle_Getter_(unwrap_jso(this));
-  
 
 // As of Chrome 37, these all changed from long to double.  This code
 // preserves backwards compatability for the time being.
@@ -36716,6 +39841,121 @@
 
 
 @DocsEditable()
+@DomName('TrackDefault')
+@Experimental() // untriaged
+class TrackDefault extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory TrackDefault._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('TrackDefault.TrackDefault')
+  @DocsEditable()
+  factory TrackDefault(String type, String language, String label, List<String> kinds, [String byteStreamTrackID]) {
+    if (byteStreamTrackID != null) {
+      List kinds_1 = convertDartToNative_StringArray(kinds);
+      return wrap_jso(_blink.BlinkTrackDefault.instance.constructorCallback_5_(type, language, label, kinds_1, byteStreamTrackID));
+    }
+    List kinds_1 = convertDartToNative_StringArray(kinds);
+    return wrap_jso(_blink.BlinkTrackDefault.instance.constructorCallback_4_(type, language, label, kinds_1));
+  }
+
+  @Deprecated("Internal Use Only")
+  static TrackDefault internalCreateTrackDefault() {
+    return new TrackDefault._internalWrap();
+  }
+
+  factory TrackDefault._internalWrap() {
+    return new TrackDefault.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  TrackDefault.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('TrackDefault.byteStreamTrackID')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get byteStreamTrackID => _blink.BlinkTrackDefault.instance.byteStreamTrackID_Getter_(unwrap_jso(this));
+  
+  @DomName('TrackDefault.kinds')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> get kinds => _blink.BlinkTrackDefault.instance.kinds_Getter_(unwrap_jso(this));
+  
+  @DomName('TrackDefault.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get label => _blink.BlinkTrackDefault.instance.label_Getter_(unwrap_jso(this));
+  
+  @DomName('TrackDefault.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get language => _blink.BlinkTrackDefault.instance.language_Getter_(unwrap_jso(this));
+  
+  @DomName('TrackDefault.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get type => _blink.BlinkTrackDefault.instance.type_Getter_(unwrap_jso(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('TrackDefaultList')
+@Experimental() // untriaged
+class TrackDefaultList extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory TrackDefaultList._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('TrackDefaultList.TrackDefaultList')
+  @DocsEditable()
+  factory TrackDefaultList([List<TrackDefault> trackDefaults]) {
+    if (trackDefaults != null) {
+      return wrap_jso(_blink.BlinkTrackDefaultList.instance.constructorCallback_1_(trackDefaults));
+    }
+    return wrap_jso(_blink.BlinkTrackDefaultList.instance.constructorCallback_0_());
+  }
+
+  @Deprecated("Internal Use Only")
+  static TrackDefaultList internalCreateTrackDefaultList() {
+    return new TrackDefaultList._internalWrap();
+  }
+
+  factory TrackDefaultList._internalWrap() {
+    return new TrackDefaultList.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  TrackDefaultList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('TrackDefaultList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkTrackDefaultList.instance.length_Getter_(unwrap_jso(this));
+  
+  @DomName('TrackDefaultList.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  TrackDefault item(int index) => wrap_jso(_blink.BlinkTrackDefaultList.instance.item_Callback_1_(unwrap_jso(this), index));
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('HTMLTrackElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -36775,16 +40015,6 @@
   @DocsEditable()
   set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.instance.default_Setter_(unwrap_jso(this), value);
   
-  @DomName('HTMLTrackElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLTrackElement.instance.integrity_Getter_(unwrap_jso(this));
-  
-  @DomName('HTMLTrackElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLTrackElement.instance.integrity_Setter_(unwrap_jso(this), value);
-  
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
   String get kind => _blink.BlinkHTMLTrackElement.instance.kind_Getter_(unwrap_jso(this));
@@ -36840,6 +40070,16 @@
   // To suppress missing implicit constructor warnings.
   factory TrackEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('TrackEvent.TrackEvent')
+  @DocsEditable()
+  factory TrackEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkTrackEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkTrackEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static TrackEvent internalCreateTrackEvent() {
@@ -36870,6 +40110,16 @@
   // To suppress missing implicit constructor warnings.
   factory TransitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('TransitionEvent.TransitionEvent')
+  @DocsEditable()
+  factory TransitionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkTransitionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkTransitionEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static TransitionEvent internalCreateTransitionEvent() {
@@ -36998,8 +40248,16 @@
     e._initUIEvent(type, canBubble, cancelable, view, detail);
     return e;
   }
-  // To suppress missing implicit constructor warnings.
-  factory UIEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('UIEvent.UIEvent')
+  @DocsEditable()
+  factory UIEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkUIEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkUIEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -37027,29 +40285,10 @@
   @Unstable()
   int get _keyCode => _blink.BlinkUIEvent.instance.keyCode_Getter_(unwrap_jso(this));
   
-  @DomName('UIEvent.layerX')
+  @DomName('UIEvent.sourceDevice')
   @DocsEditable()
-  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
-  @Experimental() // nonstandard
-  int get _layerX => _blink.BlinkUIEvent.instance.layerX_Getter_(unwrap_jso(this));
-  
-  @DomName('UIEvent.layerY')
-  @DocsEditable()
-  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
-  @Experimental() // nonstandard
-  int get _layerY => _blink.BlinkUIEvent.instance.layerY_Getter_(unwrap_jso(this));
-  
-  @DomName('UIEvent.pageX')
-  @DocsEditable()
-  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
-  @Experimental() // nonstandard
-  int get _pageX => _blink.BlinkUIEvent.instance.pageX_Getter_(unwrap_jso(this));
-  
-  @DomName('UIEvent.pageY')
-  @DocsEditable()
-  // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
-  @Experimental() // nonstandard
-  int get _pageY => _blink.BlinkUIEvent.instance.pageY_Getter_(unwrap_jso(this));
+  @Experimental() // untriaged
+  InputDevice get sourceDevice => wrap_jso(_blink.BlinkUIEvent.instance.sourceDevice_Getter_(unwrap_jso(this)));
   
   @DomName('UIEvent.view')
   @DocsEditable()
@@ -37058,20 +40297,12 @@
   @DomName('UIEvent.which')
   @DocsEditable()
   @Unstable()
-  int get which => _blink.BlinkUIEvent.instance.which_Getter_(unwrap_jso(this));
+  int get _which => _blink.BlinkUIEvent.instance.which_Getter_(unwrap_jso(this));
   
   @DomName('UIEvent.initUIEvent')
   @DocsEditable()
-  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) => _blink.BlinkUIEvent.instance.initUIEvent_Callback_5_(unwrap_jso(this), type, canBubble, cancelable, unwrap_jso(view), detail);
+  void _initUIEvent(String type, bool bubbles, bool cancelable, Window view, int detail) => _blink.BlinkUIEvent.instance.initUIEvent_Callback_5_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(view), detail);
   
-
-  @DomName('UIEvent.layerX')
-  @DomName('UIEvent.layerY')
-  Point get layer => new Point(_layerX, _layerY);
-
-  @DomName('UIEvent.pageX')
-  @DomName('UIEvent.pageY')
-  Point get page => new Point(_pageX, _pageY);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -37507,6 +40738,256 @@
 
 
 @DocsEditable()
+@DomName('VRDevice')
+@Experimental() // untriaged
+class VRDevice extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory VRDevice._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static VRDevice internalCreateVRDevice() {
+    return new VRDevice._internalWrap();
+  }
+
+  factory VRDevice._internalWrap() {
+    return new VRDevice.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  VRDevice.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('VRDevice.deviceId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get deviceId => _blink.BlinkVRDevice.instance.deviceId_Getter_(unwrap_jso(this));
+  
+  @DomName('VRDevice.deviceName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get deviceName => _blink.BlinkVRDevice.instance.deviceName_Getter_(unwrap_jso(this));
+  
+  @DomName('VRDevice.hardwareUnitId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get hardwareUnitId => _blink.BlinkVRDevice.instance.hardwareUnitId_Getter_(unwrap_jso(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('VREyeParameters')
+@Experimental() // untriaged
+class VREyeParameters extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory VREyeParameters._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static VREyeParameters internalCreateVREyeParameters() {
+    return new VREyeParameters._internalWrap();
+  }
+
+  factory VREyeParameters._internalWrap() {
+    return new VREyeParameters.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  VREyeParameters.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('VREyeParameters.currentFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VRFieldOfView get currentFieldOfView => wrap_jso(_blink.BlinkVREyeParameters.instance.currentFieldOfView_Getter_(unwrap_jso(this)));
+  
+  @DomName('VREyeParameters.eyeTranslation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint get eyeTranslation => wrap_jso(_blink.BlinkVREyeParameters.instance.eyeTranslation_Getter_(unwrap_jso(this)));
+  
+  @DomName('VREyeParameters.maximumFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VRFieldOfView get maximumFieldOfView => wrap_jso(_blink.BlinkVREyeParameters.instance.maximumFieldOfView_Getter_(unwrap_jso(this)));
+  
+  @DomName('VREyeParameters.minimumFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VRFieldOfView get minimumFieldOfView => wrap_jso(_blink.BlinkVREyeParameters.instance.minimumFieldOfView_Getter_(unwrap_jso(this)));
+  
+  @DomName('VREyeParameters.recommendedFieldOfView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VRFieldOfView get recommendedFieldOfView => wrap_jso(_blink.BlinkVREyeParameters.instance.recommendedFieldOfView_Getter_(unwrap_jso(this)));
+  
+  @DomName('VREyeParameters.renderRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _DomRect get renderRect => wrap_jso(_blink.BlinkVREyeParameters.instance.renderRect_Getter_(unwrap_jso(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('VRFieldOfView')
+@Experimental() // untriaged
+class VRFieldOfView extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory VRFieldOfView._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VRFieldOfView.VRFieldOfView')
+  @DocsEditable()
+  factory VRFieldOfView([Map fov]) {
+    if (fov != null) {
+      var fov_1 = convertDartToNative_Dictionary(fov);
+      return wrap_jso(_blink.BlinkVRFieldOfView.instance.constructorCallback_1_(fov_1));
+    }
+    return wrap_jso(_blink.BlinkVRFieldOfView.instance.constructorCallback_0_());
+  }
+
+  @Deprecated("Internal Use Only")
+  static VRFieldOfView internalCreateVRFieldOfView() {
+    return new VRFieldOfView._internalWrap();
+  }
+
+  factory VRFieldOfView._internalWrap() {
+    return new VRFieldOfView.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  VRFieldOfView.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('VRFieldOfView.downDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get downDegrees => _blink.BlinkVRFieldOfView.instance.downDegrees_Getter_(unwrap_jso(this));
+  
+  @DomName('VRFieldOfView.downDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set downDegrees(num value) => _blink.BlinkVRFieldOfView.instance.downDegrees_Setter_(unwrap_jso(this), value);
+  
+  @DomName('VRFieldOfView.leftDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get leftDegrees => _blink.BlinkVRFieldOfView.instance.leftDegrees_Getter_(unwrap_jso(this));
+  
+  @DomName('VRFieldOfView.leftDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set leftDegrees(num value) => _blink.BlinkVRFieldOfView.instance.leftDegrees_Setter_(unwrap_jso(this), value);
+  
+  @DomName('VRFieldOfView.rightDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get rightDegrees => _blink.BlinkVRFieldOfView.instance.rightDegrees_Getter_(unwrap_jso(this));
+  
+  @DomName('VRFieldOfView.rightDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set rightDegrees(num value) => _blink.BlinkVRFieldOfView.instance.rightDegrees_Setter_(unwrap_jso(this), value);
+  
+  @DomName('VRFieldOfView.upDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get upDegrees => _blink.BlinkVRFieldOfView.instance.upDegrees_Getter_(unwrap_jso(this));
+  
+  @DomName('VRFieldOfView.upDegrees')
+  @DocsEditable()
+  @Experimental() // untriaged
+  set upDegrees(num value) => _blink.BlinkVRFieldOfView.instance.upDegrees_Setter_(unwrap_jso(this), 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('VRPositionState')
+@Experimental() // untriaged
+class VRPositionState extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory VRPositionState._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static VRPositionState internalCreateVRPositionState() {
+    return new VRPositionState._internalWrap();
+  }
+
+  factory VRPositionState._internalWrap() {
+    return new VRPositionState.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  VRPositionState.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('VRPositionState.angularAcceleration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint get angularAcceleration => wrap_jso(_blink.BlinkVRPositionState.instance.angularAcceleration_Getter_(unwrap_jso(this)));
+  
+  @DomName('VRPositionState.angularVelocity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint get angularVelocity => wrap_jso(_blink.BlinkVRPositionState.instance.angularVelocity_Getter_(unwrap_jso(this)));
+  
+  @DomName('VRPositionState.linearAcceleration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint get linearAcceleration => wrap_jso(_blink.BlinkVRPositionState.instance.linearAcceleration_Getter_(unwrap_jso(this)));
+  
+  @DomName('VRPositionState.linearVelocity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint get linearVelocity => wrap_jso(_blink.BlinkVRPositionState.instance.linearVelocity_Getter_(unwrap_jso(this)));
+  
+  @DomName('VRPositionState.orientation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint get orientation => wrap_jso(_blink.BlinkVRPositionState.instance.orientation_Getter_(unwrap_jso(this)));
+  
+  @DomName('VRPositionState.position')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint get position => wrap_jso(_blink.BlinkVRPositionState.instance.position_Getter_(unwrap_jso(this)));
+  
+  @DomName('VRPositionState.timeStamp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get timeStamp => _blink.BlinkVRPositionState.instance.timeStamp_Getter_(unwrap_jso(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('ValidityState')
 class ValidityState extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
@@ -37555,6 +41036,11 @@
   @DocsEditable()
   bool get tooLong => _blink.BlinkValidityState.instance.tooLong_Getter_(unwrap_jso(this));
   
+  @DomName('ValidityState.tooShort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get tooShort => _blink.BlinkValidityState.instance.tooShort_Getter_(unwrap_jso(this));
+  
   @DomName('ValidityState.typeMismatch')
   @DocsEditable()
   bool get typeMismatch => _blink.BlinkValidityState.instance.typeMismatch_Getter_(unwrap_jso(this));
@@ -37891,22 +41377,22 @@
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  int get line => _blink.BlinkVTTCue.instance.line_Getter_(unwrap_jso(this));
+  Object get line => wrap_jso(_blink.BlinkVTTCue.instance.line_Getter_(unwrap_jso(this)));
   
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  set line(int value) => _blink.BlinkVTTCue.instance.line_Setter_(unwrap_jso(this), value);
+  set line(Object value) => _blink.BlinkVTTCue.instance.line_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  int get position => _blink.BlinkVTTCue.instance.position_Getter_(unwrap_jso(this));
+  Object get position => wrap_jso(_blink.BlinkVTTCue.instance.position_Getter_(unwrap_jso(this)));
   
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  set position(int value) => _blink.BlinkVTTCue.instance.position_Setter_(unwrap_jso(this), value);
+  set position(Object value) => _blink.BlinkVTTCue.instance.position_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('VTTCue.regionId')
   @DocsEditable()
@@ -37921,12 +41407,12 @@
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.BlinkVTTCue.instance.size_Getter_(unwrap_jso(this));
+  num get size => _blink.BlinkVTTCue.instance.size_Getter_(unwrap_jso(this));
   
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  set size(int value) => _blink.BlinkVTTCue.instance.size_Setter_(unwrap_jso(this), value);
+  set size(num value) => _blink.BlinkVTTCue.instance.size_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
@@ -38224,18 +41710,11 @@
 
   @DomName('WebSocket.WebSocket')
   @DocsEditable()
-  factory WebSocket(String url, [protocol_OR_protocols]) {
-    if ((url is String || url == null) && protocol_OR_protocols == null) {
-      return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_1_(url));
+  factory WebSocket(String url, [Object protocols]) {
+    if (protocols != null) {
+      return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocols));
     }
-    if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocol_OR_protocols));
-    }
-    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
-      List protocols_1 = convertDartToNative_StringArray(protocol_OR_protocols);
-      return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocols_1));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_1_(url));
   }
 
 
@@ -38311,19 +41790,19 @@
   }
 
   void send(data) {
-    if ((data is String || data == null)) {
+    if ((data is String)) {
       _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
       return;
     }
-    if ((data is Blob || data == null)) {
+    if ((data is Blob)) {
       _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
       return;
     }
-    if ((data is TypedData || data == null)) {
+    if ((data is TypedData)) {
       _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
       return;
     }
-    if ((data is ByteBuffer || data == null)) {
+    if ((data is ByteBuffer)) {
       _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
       return;
     }
@@ -38336,7 +41815,7 @@
   
   @DomName('WebSocket.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), data);
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
   
   @DomName('WebSocket.sendString')
   @DocsEditable()
@@ -38407,8 +41886,16 @@
     return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_2_(type, convertDartToNative_Dictionary(options)));
   }
 
-  // To suppress missing implicit constructor warnings.
-  factory WheelEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WheelEvent.WheelEvent')
+  @DocsEditable()
+  factory WheelEvent._(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_1_(type));
+  }
 
 
   @Deprecated("Internal Use Only")
@@ -38555,7 +42042,7 @@
    * for the animation to continue.
    */
   @DomName('Window.requestAnimationFrame')
-  int requestAnimationFrame(RequestAnimationFrameCallback callback) {
+  int requestAnimationFrame(FrameRequestCallback callback) {
     return _requestAnimationFrame(_wrapZone(callback));
   }
 
@@ -38797,17 +42284,6 @@
   static const int TEMPORARY = 0;
 
   /**
-   * Entrypoint for CSS-related functions.
-   *
-   * ## Other resources
-   *
-   * * [The CSS interface](http://dev.w3.org/csswg/css-conditional/#the-css-interface) from W3C.
-   */
-  @DomName('Window.CSS')
-  @DocsEditable()
-  Css get css => wrap_jso(_blink.BlinkWindow.instance.CSS_Getter_(unwrap_jso(this)));
-  
-  /**
    * The application cache for this window.
    *
    * ## Other resources
@@ -38823,6 +42299,11 @@
   @DocsEditable()
   ApplicationCache get applicationCache => wrap_jso(_blink.BlinkWindow.instance.applicationCache_Getter_(unwrap_jso(this)));
   
+  @DomName('Window.caches')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CacheStorage get caches => wrap_jso(_blink.BlinkWindow.instance.caches_Getter_(unwrap_jso(this)));
+  
   @DomName('Window.closed')
   @DocsEditable()
   bool get closed => _blink.BlinkWindow.instance.closed_Getter_(unwrap_jso(this));
@@ -39335,7 +42816,7 @@
 
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
-  void cancelAnimationFrame(int id) => _blink.BlinkWindow.instance.cancelAnimationFrame_Callback_1_(unwrap_jso(this), id);
+  void cancelAnimationFrame(int handle) => _blink.BlinkWindow.instance.cancelAnimationFrame_Callback_1_(unwrap_jso(this), handle);
   
   @DomName('Window.close')
   @DocsEditable()
@@ -39348,6 +42829,13 @@
     return _blink.BlinkWindow.instance.confirm_Callback_0_(unwrap_jso(this));
   }
 
+  Future fetch(/*RequestInfo*/ input, [Map init]) {
+    if (init != null) {
+      return wrap_jso(_blink.BlinkWindow.instance.fetch_Callback_2_(unwrap_jso(this), input, convertDartToNative_Dictionary(init)));
+    }
+    return wrap_jso(_blink.BlinkWindow.instance.fetch_Callback_1_(unwrap_jso(this), input));
+  }
+
   /**
    * Finds text in this window.
    *
@@ -39363,7 +42851,7 @@
   
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => wrap_jso(_blink.BlinkWindow.instance.getComputedStyle_Callback_2_(unwrap_jso(this), unwrap_jso(element), pseudoElement));
+  CssStyleDeclaration _getComputedStyle(Element elt, String pseudoElt) => wrap_jso(_blink.BlinkWindow.instance.getComputedStyle_Callback_2_(unwrap_jso(this), unwrap_jso(elt), pseudoElt));
   
   /**
    * Returns all CSS rules that apply to the element's pseudo-element.
@@ -39413,15 +42901,15 @@
    */
   @DomName('Window.moveBy')
   @DocsEditable()
-  void moveBy(num x, num y) => _blink.BlinkWindow.instance.moveBy_Callback_2_(unwrap_jso(this), x, y);
+  void moveBy(int x, int y) => _blink.BlinkWindow.instance.moveBy_Callback_2_(unwrap_jso(this), x, y);
   
   @DomName('Window.moveTo')
   @DocsEditable()
-  void _moveTo(num x, num y) => _blink.BlinkWindow.instance.moveTo_Callback_2_(unwrap_jso(this), x, y);
+  void _moveTo(int x, int y) => _blink.BlinkWindow.instance.moveTo_Callback_2_(unwrap_jso(this), x, y);
   
   @DomName('Window.open')
   @DocsEditable()
-  WindowBase open(String url, String name, [String options]) => wrap_jso(_blink.BlinkWindow.instance.open_Callback_3_(unwrap_jso(this), url, name, options));
+  WindowBase open(String url, String target, [String features]) => wrap_jso(_blink.BlinkWindow.instance.open_Callback_3_(unwrap_jso(this), url, target, features));
   
   SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) {
     if (creationCallback != null) {
@@ -39432,7 +42920,7 @@
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), targetOrigin, transfer);
+  void postMessage(Object message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), targetOrigin, transfer);
   
   /**
    * Opens the print dialog for this window.
@@ -39448,7 +42936,7 @@
   
   @DomName('Window.requestAnimationFrame')
   @DocsEditable()
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.BlinkWindow.instance.requestAnimationFrame_Callback_1_(unwrap_jso(this), unwrap_jso((highResTime) => callback(highResTime)));
+  int _requestAnimationFrame(FrameRequestCallback callback) => _blink.BlinkWindow.instance.requestAnimationFrame_Callback_1_(unwrap_jso(this), unwrap_jso((highResTime) => callback(highResTime)));
   
   /**
    * Resizes this window by an offset.
@@ -39460,7 +42948,7 @@
    */
   @DomName('Window.resizeBy')
   @DocsEditable()
-  void resizeBy(num x, num y) => _blink.BlinkWindow.instance.resizeBy_Callback_2_(unwrap_jso(this), x, y);
+  void resizeBy(int x, int y) => _blink.BlinkWindow.instance.resizeBy_Callback_2_(unwrap_jso(this), x, y);
   
   /**
    * Resizes this window to a specific width and height.
@@ -39472,82 +42960,81 @@
    */
   @DomName('Window.resizeTo')
   @DocsEditable()
-  void resizeTo(num width, num height) => _blink.BlinkWindow.instance.resizeTo_Callback_2_(unwrap_jso(this), width, height);
+  void resizeTo(int x, int y) => _blink.BlinkWindow.instance.resizeTo_Callback_2_(unwrap_jso(this), x, y);
   
-  void scroll(x, y, [Map scrollOptions]) {
-    if ((y is num) && (x is num) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scroll_Callback_2_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y));
+  void scroll([options_OR_x, y, Map scrollOptions]) {
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scroll_Callback_0_(unwrap_jso(this));
       return;
     }
-    if ((scrollOptions is Map) && (y is num) && (x is num)) {
-      _blink.BlinkWindow.instance.scroll_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+    if ((options_OR_x is Map) && y == null && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scroll_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
       return;
     }
-    if ((y is int) && (x is int) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scroll_Callback_2_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y));
+    if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scroll_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
       return;
     }
-    if ((scrollOptions is Map) && (y is int) && (x is int)) {
-      _blink.BlinkWindow.instance.scroll_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+    if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scroll_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      return;
+    }
+    if ((scrollOptions is Map) && (y is int) && (options_OR_x is int)) {
+      _blink.BlinkWindow.instance.scroll_Callback_3_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void scrollBy(x, y, [Map scrollOptions]) {
-    if ((y is num) && (x is num) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_2_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y));
+  void scrollBy([options_OR_x, y, Map scrollOptions]) {
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scrollBy_Callback_0_(unwrap_jso(this));
       return;
     }
-    if ((scrollOptions is Map) && (y is num) && (x is num)) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+    if ((options_OR_x is Map) && y == null && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scrollBy_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
       return;
     }
-    if ((y is int) && (x is int) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_2_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y));
+    if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scrollBy_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
       return;
     }
-    if ((scrollOptions is Map) && (y is int) && (x is int)) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+    if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scrollBy_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      return;
+    }
+    if ((scrollOptions is Map) && (y is int) && (options_OR_x is int)) {
+      _blink.BlinkWindow.instance.scrollBy_Callback_3_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void scrollTo(x, y, [Map scrollOptions]) {
-    if ((y is num) && (x is num) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_2_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y));
+  void scrollTo([options_OR_x, y, Map scrollOptions]) {
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scrollTo_Callback_0_(unwrap_jso(this));
       return;
     }
-    if ((scrollOptions is Map) && (y is num) && (x is num)) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+    if ((options_OR_x is Map) && y == null && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scrollTo_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
       return;
     }
-    if ((y is int) && (x is int) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_2_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y));
+    if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scrollTo_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
       return;
     }
-    if ((scrollOptions is Map) && (y is int) && (x is int)) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+    if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
+      _blink.BlinkWindow.instance.scrollTo_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      return;
+    }
+    if ((scrollOptions is Map) && (y is int) && (options_OR_x is int)) {
+      _blink.BlinkWindow.instance.scrollTo_Callback_3_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   /**
-   * Opens a new page as a modal dialog.
-   *
-   * ## Other resources
-   *
-   * * [Dialogs implemented using separate
-   *   documents](http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)
-   *   from W3C.
-   */
-  @DomName('Window.showModalDialog')
-  @DocsEditable()
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) => wrap_jso(_blink.BlinkWindow.instance.showModalDialog_Callback_3_(unwrap_jso(this), url, dialogArgs, featureArgs));
-  
-  /**
    * Stops the window from loading.
    *
    * ## Other resources
@@ -39596,28 +43083,58 @@
 
   @DomName('Window.atob')
   @DocsEditable()
-  String atob(String string) => _blink.BlinkWindow.instance.atob_Callback_1_(unwrap_jso(this), string);
+  String atob(String atob) => _blink.BlinkWindow.instance.atob_Callback_1_(unwrap_jso(this), atob);
   
   @DomName('Window.btoa')
   @DocsEditable()
-  String btoa(String string) => _blink.BlinkWindow.instance.btoa_Callback_1_(unwrap_jso(this), string);
+  String btoa(String btoa) => _blink.BlinkWindow.instance.btoa_Callback_1_(unwrap_jso(this), btoa);
   
-  @DomName('Window.clearInterval')
-  @DocsEditable()
-  void _clearInterval(int handle) => _blink.BlinkWindow.instance.clearInterval_Callback_1_(unwrap_jso(this), handle);
-  
-  @DomName('Window.clearTimeout')
-  @DocsEditable()
-  void _clearTimeout(int handle) => _blink.BlinkWindow.instance.clearTimeout_Callback_1_(unwrap_jso(this), handle);
-  
-  @DomName('Window.setInterval')
-  @DocsEditable()
-  int _setInterval(Object handler, int timeout) => _blink.BlinkWindow.instance.setInterval_Callback_2_(unwrap_jso(this), handler, timeout);
-  
-  @DomName('Window.setTimeout')
-  @DocsEditable()
-  int _setTimeout(Object handler, int timeout) => _blink.BlinkWindow.instance.setTimeout_Callback_2_(unwrap_jso(this), handler, timeout);
-  
+  int _setInterval_String(String handler, [int timeout, Object arguments]) {
+    if (timeout != null) {
+      return _blink.BlinkWindow.instance.setInterval_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+    }
+    return _blink.BlinkWindow.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+  }
+
+  int _setTimeout_String(String handler, [int timeout, Object arguments]) {
+    if (timeout != null) {
+      return _blink.BlinkWindow.instance.setTimeout_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+    }
+    return _blink.BlinkWindow.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+  }
+
+  void _clearInterval([int handle]) {
+    if (handle != null) {
+      _blink.BlinkWindow.instance.clearInterval_Callback_1_(unwrap_jso(this), handle);
+      return;
+    }
+    _blink.BlinkWindow.instance.clearInterval_Callback_0_(unwrap_jso(this));
+    return;
+  }
+
+  void _clearTimeout([int handle]) {
+    if (handle != null) {
+      _blink.BlinkWindow.instance.clearTimeout_Callback_1_(unwrap_jso(this), handle);
+      return;
+    }
+    _blink.BlinkWindow.instance.clearTimeout_Callback_0_(unwrap_jso(this));
+    return;
+  }
+
+  int _setInterval(Object handler, [int timeout]) {
+    if (timeout != null) {
+      return _blink.BlinkWindow.instance.setInterval_Callback_2_(unwrap_jso(this), handler, timeout);
+    }
+    return _blink.BlinkWindow.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+  }
+
+  int _setTimeout(Object handler, [int timeout]) {
+    if (timeout != null) {
+      return _blink.BlinkWindow.instance.setTimeout_Callback_2_(unwrap_jso(this), handler, timeout);
+    }
+    return _blink.BlinkWindow.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+  }
+
   /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable()
@@ -40082,18 +43599,60 @@
   @DomName('WindowBase64.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string);
+  String atob(String atob);
 
   @DomName('WindowBase64.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string);
+  String btoa(String btoa);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('WindowClient')
+@Experimental() // untriaged
+class WindowClient extends Client {
+  // To suppress missing implicit constructor warnings.
+  factory WindowClient._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static WindowClient internalCreateWindowClient() {
+    return new WindowClient._internalWrap();
+  }
+
+  external factory WindowClient._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  WindowClient.internal_() : super.internal_();
+
+
+  @DomName('WindowClient.focused')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get focused => _blink.BlinkWindowClient.instance.focused_Getter_(unwrap_jso(this));
+  
+  @DomName('WindowClient.visibilityState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get visibilityState => _blink.BlinkWindowClient.instance.visibilityState_Getter_(unwrap_jso(this));
+  
+  @DomName('WindowClient.focus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future focus() => wrap_jso(_blink.BlinkWindowClient.instance.focus_Callback_0_(unwrap_jso(this)));
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 
 @DocsEditable()
 @DomName('WindowEventHandlers')
@@ -40233,10 +43792,15 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-  @DomName('Worker.postMessage')
-  @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) => _blink.BlinkWorker.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
-  
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+    if (transfer != null) {
+      _blink.BlinkWorker.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      return;
+    }
+    _blink.BlinkWorker.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    return;
+  }
+
   @DomName('Worker.terminate')
   @DocsEditable()
   void terminate() => _blink.BlinkWorker.instance.terminate_Callback_0_(unwrap_jso(this));
@@ -40327,6 +43891,11 @@
   @Experimental() // untriaged
   static const int TEMPORARY = 0;
 
+  @DomName('WorkerGlobalScope.caches')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CacheStorage get caches => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.caches_Getter_(unwrap_jso(this)));
+  
   @DomName('WorkerGlobalScope.console')
   @DocsEditable()
   @Experimental() // untriaged
@@ -40367,6 +43936,13 @@
   @Experimental() // untriaged
   void close() => _blink.BlinkWorkerGlobalScope.instance.close_Callback_0_(unwrap_jso(this));
   
+  Future fetch(/*RequestInfo*/ input, [Map init]) {
+    if (init != null) {
+      return wrap_jso(_blink.BlinkWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), input, convertDartToNative_Dictionary(init)));
+    }
+    return wrap_jso(_blink.BlinkWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), input));
+  }
+
   @DomName('WorkerGlobalScope.importScripts')
   @DocsEditable()
   @Experimental() // untriaged
@@ -40429,33 +44005,59 @@
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) => _blink.BlinkWorkerGlobalScope.instance.atob_Callback_1_(unwrap_jso(this), string);
+  String atob(String atob) => _blink.BlinkWorkerGlobalScope.instance.atob_Callback_1_(unwrap_jso(this), atob);
   
   @DomName('WorkerGlobalScope.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) => _blink.BlinkWorkerGlobalScope.instance.btoa_Callback_1_(unwrap_jso(this), string);
+  String btoa(String btoa) => _blink.BlinkWorkerGlobalScope.instance.btoa_Callback_1_(unwrap_jso(this), btoa);
   
-  @DomName('WorkerGlobalScope.clearInterval')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void _clearInterval(int handle) => _blink.BlinkWorkerGlobalScope.instance.clearInterval_Callback_1_(unwrap_jso(this), handle);
-  
-  @DomName('WorkerGlobalScope.clearTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void _clearTimeout(int handle) => _blink.BlinkWorkerGlobalScope.instance.clearTimeout_Callback_1_(unwrap_jso(this), handle);
-  
-  @DomName('WorkerGlobalScope.setInterval')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_2_(unwrap_jso(this), handler, timeout);
-  
-  @DomName('WorkerGlobalScope.setTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_2_(unwrap_jso(this), handler, timeout);
-  
+  int _setInterval_String(String handler, [int timeout, Object arguments]) {
+    if (timeout != null) {
+      return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+    }
+    return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+  }
+
+  int _setTimeout_String(String handler, [int timeout, Object arguments]) {
+    if (timeout != null) {
+      return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+    }
+    return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+  }
+
+  void _clearInterval([int handle]) {
+    if (handle != null) {
+      _blink.BlinkWorkerGlobalScope.instance.clearInterval_Callback_1_(unwrap_jso(this), handle);
+      return;
+    }
+    _blink.BlinkWorkerGlobalScope.instance.clearInterval_Callback_0_(unwrap_jso(this));
+    return;
+  }
+
+  void _clearTimeout([int handle]) {
+    if (handle != null) {
+      _blink.BlinkWorkerGlobalScope.instance.clearTimeout_Callback_1_(unwrap_jso(this), handle);
+      return;
+    }
+    _blink.BlinkWorkerGlobalScope.instance.clearTimeout_Callback_0_(unwrap_jso(this));
+    return;
+  }
+
+  int _setInterval(Object handler, [int timeout]) {
+    if (timeout != null) {
+      return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_2_(unwrap_jso(this), handler, timeout);
+    }
+    return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+  }
+
+  int _setTimeout(Object handler, [int timeout]) {
+    if (timeout != null) {
+      return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_2_(unwrap_jso(this), handler, timeout);
+    }
+    return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+  }
+
   /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
   @DocsEditable()
@@ -40473,35 +44075,83 @@
 @DocsEditable()
 @DomName('WorkerPerformance')
 @Experimental() // untriaged
-class WorkerPerformance extends DartHtmlDomObject {
+class WorkerPerformance extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory WorkerPerformance._() { throw new UnsupportedError("Not supported"); }
 
+
   @Deprecated("Internal Use Only")
   static WorkerPerformance internalCreateWorkerPerformance() {
     return new WorkerPerformance._internalWrap();
   }
 
-  factory WorkerPerformance._internalWrap() {
-    return new WorkerPerformance.internal_();
-  }
+  external factory WorkerPerformance._internalWrap();
 
   @Deprecated("Internal Use Only")
-  WorkerPerformance.internal_() { }
+  WorkerPerformance.internal_() : super.internal_();
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
 
   @DomName('WorkerPerformance.memory')
   @DocsEditable()
   @Experimental() // untriaged
   MemoryInfo get memory => wrap_jso(_blink.BlinkWorkerPerformance.instance.memory_Getter_(unwrap_jso(this)));
   
+  @DomName('WorkerPerformance.clearMarks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearMarks(String markName) => _blink.BlinkWorkerPerformance.instance.clearMarks_Callback_1_(unwrap_jso(this), markName);
+  
+  @DomName('WorkerPerformance.clearMeasures')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearMeasures(String measureName) => _blink.BlinkWorkerPerformance.instance.clearMeasures_Callback_1_(unwrap_jso(this), measureName);
+  
+  @DomName('WorkerPerformance.getEntries')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<PerformanceEntry> getEntries() => wrap_jso(_blink.BlinkWorkerPerformance.instance.getEntries_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WorkerPerformance.getEntriesByName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) => wrap_jso(_blink.BlinkWorkerPerformance.instance.getEntriesByName_Callback_2_(unwrap_jso(this), name, entryType));
+  
+  @DomName('WorkerPerformance.getEntriesByType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<PerformanceEntry> getEntriesByType(String entryType) => wrap_jso(_blink.BlinkWorkerPerformance.instance.getEntriesByType_Callback_1_(unwrap_jso(this), entryType));
+  
+  @DomName('WorkerPerformance.mark')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void mark(String markName) => _blink.BlinkWorkerPerformance.instance.mark_Callback_1_(unwrap_jso(this), markName);
+  
+  @DomName('WorkerPerformance.measure')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void measure(String measureName, String startMark, String endMark) => _blink.BlinkWorkerPerformance.instance.measure_Callback_3_(unwrap_jso(this), measureName, startMark, endMark);
+  
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
   num now() => _blink.BlinkWorkerPerformance.instance.now_Callback_0_(unwrap_jso(this));
   
+  @DomName('WorkerPerformance.webkitClearResourceTimings')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  void clearResourceTimings() => _blink.BlinkWorkerPerformance.instance.webkitClearResourceTimings_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WorkerPerformance.webkitSetResourceTimingBufferSize')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkWorkerPerformance.instance.webkitSetResourceTimingBufferSize_Callback_1_(unwrap_jso(this), maxSize);
+  
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -40547,10 +44197,13 @@
   @DocsEditable()
   XPathNSResolver createNSResolver(Node nodeResolver) => wrap_jso(_blink.BlinkXPathEvaluator.instance.createNSResolver_Callback_1_(unwrap_jso(this), unwrap_jso(nodeResolver)));
   
-  @DomName('XPathEvaluator.evaluate')
-  @DocsEditable()
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) => wrap_jso(_blink.BlinkXPathEvaluator.instance.evaluate_Callback_5_(unwrap_jso(this), expression, unwrap_jso(contextNode), unwrap_jso(resolver), type, unwrap_jso(inResult)));
-  
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, [int type, Object inResult]) {
+    if (type != null) {
+      return wrap_jso(_blink.BlinkXPathEvaluator.instance.evaluate_Callback_5_(unwrap_jso(this), expression, unwrap_jso(contextNode), unwrap_jso(resolver), type, inResult));
+    }
+    return wrap_jso(_blink.BlinkXPathEvaluator.instance.evaluate_Callback_3_(unwrap_jso(this), expression, unwrap_jso(contextNode), unwrap_jso(resolver)));
+  }
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -40582,10 +44235,13 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('XPathExpression.evaluate')
-  @DocsEditable()
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => wrap_jso(_blink.BlinkXPathExpression.instance.evaluate_Callback_3_(unwrap_jso(this), unwrap_jso(contextNode), type, unwrap_jso(inResult)));
-  
+  XPathResult evaluate(Node contextNode, [int type, Object inResult]) {
+    if (type != null) {
+      return wrap_jso(_blink.BlinkXPathExpression.instance.evaluate_Callback_3_(unwrap_jso(this), unwrap_jso(contextNode), type, inResult));
+    }
+    return wrap_jso(_blink.BlinkXPathExpression.instance.evaluate_Callback_1_(unwrap_jso(this), unwrap_jso(contextNode)));
+  }
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -40794,7 +44450,7 @@
 
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
-  String serializeToString(Node node) => _blink.BlinkXMLSerializer.instance.serializeToString_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  String serializeToString(Node root) => _blink.BlinkXMLSerializer.instance.serializeToString_Callback_1_(unwrap_jso(this), unwrap_jso(root));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40848,7 +44504,7 @@
   
   @DomName('XSLTProcessor.importStylesheet')
   @DocsEditable()
-  void importStylesheet(Node stylesheet) => _blink.BlinkXSLTProcessor.instance.importStylesheet_Callback_1_(unwrap_jso(this), unwrap_jso(stylesheet));
+  void importStylesheet(Node style) => _blink.BlinkXSLTProcessor.instance.importStylesheet_Callback_1_(unwrap_jso(this), unwrap_jso(style));
   
   @DomName('XSLTProcessor.removeParameter')
   @DocsEditable()
@@ -40868,7 +44524,7 @@
   
   @DomName('XSLTProcessor.transformToFragment')
   @DocsEditable()
-  DocumentFragment transformToFragment(Node source, Document docVal) => wrap_jso(_blink.BlinkXSLTProcessor.instance.transformToFragment_Callback_2_(unwrap_jso(this), unwrap_jso(source), unwrap_jso(docVal)));
+  DocumentFragment transformToFragment(Node source, Document output) => wrap_jso(_blink.BlinkXSLTProcessor.instance.transformToFragment_Callback_2_(unwrap_jso(this), unwrap_jso(source), unwrap_jso(output)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40942,93 +44598,6 @@
 
 
 @DocsEditable()
-@DomName('CSSPrimitiveValue')
-// http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
-@deprecated // deprecated
-class _CSSPrimitiveValue extends _CSSValue {
-  // To suppress missing implicit constructor warnings.
-  factory _CSSPrimitiveValue._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _CSSPrimitiveValue internalCreate_CSSPrimitiveValue() {
-    return new _CSSPrimitiveValue._internalWrap();
-  }
-
-  external factory _CSSPrimitiveValue._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _CSSPrimitiveValue.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('CSSUnknownRule')
-// http://dev.w3.org/csswg/cssom/#the-cssstylesheet-interface
-@deprecated // deprecated
-class _CSSUnknownRule extends CssRule {
-  // To suppress missing implicit constructor warnings.
-  factory _CSSUnknownRule._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _CSSUnknownRule internalCreate_CSSUnknownRule() {
-    return new _CSSUnknownRule._internalWrap();
-  }
-
-  external factory _CSSUnknownRule._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _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')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-class _CSSValue extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory _CSSValue._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static _CSSValue internalCreate_CSSValue() {
-    return new _CSSValue._internalWrap();
-  }
-
-  factory _CSSValue._internalWrap() {
-    return new _CSSValue.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  _CSSValue.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('Cache')
 @Experimental() // untriaged
 class _Cache extends DartHtmlDomObject {
@@ -41319,6 +44888,11 @@
   Rectangle elementAt(int index) => this[index];
   // -- end List<Rectangle> mixins.
 
+  @DomName('ClientRectList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Rectangle __getter__(int index) => make_dart_rectangle(_blink.BlinkClientRectList.instance.$__getter___Callback_1_(unwrap_jso(this), index));
+  
   @DomName('ClientRectList.item')
   @DocsEditable()
   Rectangle item(int index) => make_dart_rectangle(_blink.BlinkClientRectList.instance.item_Callback_1_(unwrap_jso(this), index));
@@ -41332,37 +44906,6 @@
 
 
 @DocsEditable()
-@DomName('Counter')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-class _Counter extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory _Counter._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static _Counter internalCreate_Counter() {
-    return new _Counter._internalWrap();
-  }
-
-  factory _Counter._internalWrap() {
-    return new _Counter.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  _Counter.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source 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 DartHtmlDomObject with ListMixin<CssRule>, ImmutableListMixin<CssRule> implements List<CssRule> {
   // To suppress missing implicit constructor warnings.
@@ -41446,88 +44989,6 @@
 
 
 @DocsEditable()
-@DomName('CSSValueList')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-class _CssValueList extends _CSSValue with ListMixin<_CSSValue>, ImmutableListMixin<_CSSValue> implements List<_CSSValue> {
-  // To suppress missing implicit constructor warnings.
-  factory _CssValueList._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _CssValueList internalCreate_CssValueList() {
-    return new _CssValueList._internalWrap();
-  }
-
-  external factory _CssValueList._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _CssValueList.internal_() : super.internal_();
-
-
-  @DomName('CSSValueList.length')
-  @DocsEditable()
-  int get length => _blink.BlinkCSSValueList.instance.length_Getter_(unwrap_jso(this));
-  
-  _CSSValue operator[](int index) {
-    if (index < 0 || index >= length)
-      throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkCSSValueList.instance.item_Callback_1_(unwrap_jso(this), index));
-  }
-
-  _CSSValue _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkCSSValueList.instance.item_Callback_1_(unwrap_jso(this), index));
-
-  void operator[]=(int index, _CSSValue value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<_CSSValue> mixins.
-  // _CSSValue is the element type.
-
-
-  set length(int value) {
-    throw new UnsupportedError("Cannot resize immutable List.");
-  }
-
-  _CSSValue get first {
-    if (this.length > 0) {
-      return _nativeIndexedGetter(0);
-    }
-    throw new StateError("No elements");
-  }
-
-  _CSSValue get last {
-    int len = this.length;
-    if (len > 0) {
-      return _nativeIndexedGetter(len - 1);
-    }
-    throw new StateError("No elements");
-  }
-
-  _CSSValue get single {
-    int len = this.length;
-    if (len == 1) {
-      return _nativeIndexedGetter(0);
-    }
-    if (len == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  _CSSValue elementAt(int index) => this[index];
-  // -- end List<_CSSValue> mixins.
-
-  @DomName('CSSValueList.item')
-  @DocsEditable()
-  _CSSValue item(int index) => wrap_jso(_blink.BlinkCSSValueList.instance.item_Callback_1_(unwrap_jso(this), index));
-  
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('DOMFileSystemSync')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
@@ -41968,10 +45429,16 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('HTMLAllCollection.item')
-  @DocsEditable()
-  Element _item(int index) => wrap_jso(_blink.BlinkHTMLAllCollection.instance.item_Callback_1_(unwrap_jso(this), index));
-  
+  Element _item(int index) {
+    if ((index is int || index == null)) {
+      return wrap_jso(_blink.BlinkHTMLAllCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+    }
+    if ((index is int || index == null)) {
+      return wrap_jso(_blink.BlinkHTMLAllCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -42298,37 +45765,39 @@
   Node elementAt(int index) => this[index];
   // -- end List<Node> mixins.
 
-  @DomName('NamedNodeMap.__getter__')
-  @DocsEditable()
-  Node __getter__(String name) => wrap_jso(_blink.BlinkNamedNodeMap.instance.$__getter___Callback_1_(unwrap_jso(this), name));
-  
-  @DomName('NamedNodeMap.getNamedItem')
-  @DocsEditable()
-  Node getNamedItem(String name) => wrap_jso(_blink.BlinkNamedNodeMap.instance.getNamedItem_Callback_1_(unwrap_jso(this), name));
-  
+  _Attr getNamedItem(String name) {
+    if ((name is String)) {
+      return wrap_jso(_blink.BlinkNamedNodeMap.instance.getNamedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    if ((name is String)) {
+      return wrap_jso(_blink.BlinkNamedNodeMap.instance.getNamedItem_Callback_1_(unwrap_jso(this), name));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('NamedNodeMap.getNamedItemNS')
   @DocsEditable()
-  Node getNamedItemNS(String namespaceURI, String localName) => wrap_jso(_blink.BlinkNamedNodeMap.instance.getNamedItemNS_Callback_2_(unwrap_jso(this), namespaceURI, localName));
+  _Attr getNamedItemNS(String namespaceURI, String localName) => wrap_jso(_blink.BlinkNamedNodeMap.instance.getNamedItemNS_Callback_2_(unwrap_jso(this), namespaceURI, localName));
   
   @DomName('NamedNodeMap.item')
   @DocsEditable()
-  Node item(int index) => wrap_jso(_blink.BlinkNamedNodeMap.instance.item_Callback_1_(unwrap_jso(this), index));
+  _Attr item(int index) => wrap_jso(_blink.BlinkNamedNodeMap.instance.item_Callback_1_(unwrap_jso(this), index));
   
   @DomName('NamedNodeMap.removeNamedItem')
   @DocsEditable()
-  Node removeNamedItem(String name) => wrap_jso(_blink.BlinkNamedNodeMap.instance.removeNamedItem_Callback_1_(unwrap_jso(this), name));
+  _Attr removeNamedItem(String name) => wrap_jso(_blink.BlinkNamedNodeMap.instance.removeNamedItem_Callback_1_(unwrap_jso(this), name));
   
   @DomName('NamedNodeMap.removeNamedItemNS')
   @DocsEditable()
-  Node removeNamedItemNS(String namespaceURI, String localName) => wrap_jso(_blink.BlinkNamedNodeMap.instance.removeNamedItemNS_Callback_2_(unwrap_jso(this), namespaceURI, localName));
+  _Attr removeNamedItemNS(String namespaceURI, String localName) => wrap_jso(_blink.BlinkNamedNodeMap.instance.removeNamedItemNS_Callback_2_(unwrap_jso(this), namespaceURI, localName));
   
   @DomName('NamedNodeMap.setNamedItem')
   @DocsEditable()
-  Node setNamedItem(Node node) => wrap_jso(_blink.BlinkNamedNodeMap.instance.setNamedItem_Callback_1_(unwrap_jso(this), unwrap_jso(node)));
+  _Attr setNamedItem(_Attr attr) => wrap_jso(_blink.BlinkNamedNodeMap.instance.setNamedItem_Callback_1_(unwrap_jso(this), unwrap_jso(attr)));
   
   @DomName('NamedNodeMap.setNamedItemNS')
   @DocsEditable()
-  Node setNamedItemNS(Node node) => wrap_jso(_blink.BlinkNamedNodeMap.instance.setNamedItemNS_Callback_1_(unwrap_jso(this), unwrap_jso(node)));
+  _Attr setNamedItemNS(_Attr attr) => wrap_jso(_blink.BlinkNamedNodeMap.instance.setNamedItemNS_Callback_1_(unwrap_jso(this), unwrap_jso(attr)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -42361,37 +45830,6 @@
   int get hashCode => unwrap_jso(this).hashCode;
 
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source 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')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-class _RGBColor extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory _RGBColor._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static _RGBColor internalCreate_RGBColor() {
-    return new _RGBColor._internalWrap();
-  }
-
-  factory _RGBColor._internalWrap() {
-    return new _RGBColor.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  _RGBColor.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
-}
 // 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.
@@ -42414,37 +45852,11 @@
   _RadioNodeList.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('Rect')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-class _Rect extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory _Rect._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static _Rect internalCreate_Rect() {
-    return new _Rect._internalWrap();
-  }
-
-  factory _Rect._internalWrap() {
-    return new _Rect.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  _Rect.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
+  @DomName('RadioNodeList.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Node _item(int index) => wrap_jso(_blink.BlinkRadioNodeList.instance.item_Callback_1_(unwrap_jso(this), index));
+  
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -42462,22 +45874,12 @@
 
   @DomName('Request.Request')
   @DocsEditable()
-  factory _Request(input, [Map requestInitDict]) {
-    if ((input is String || input == null) && requestInitDict == null) {
-      return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_1_(input));
-    }
-    if ((requestInitDict is Map || requestInitDict == null) && (input is String || input == null)) {
+  factory _Request(Object input, [Map requestInitDict]) {
+    if (requestInitDict != null) {
       var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
       return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict_1));
     }
-    if ((input is _Request || input == null) && requestInitDict == null) {
-      return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_1_(input));
-    }
-    if ((requestInitDict is Map || requestInitDict == null) && (input is _Request || input == null)) {
-      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
-      return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict_1));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_1_(input));
   }
 
 
@@ -42492,6 +45894,11 @@
   _Request.internal_() : super.internal_();
 
 
+  @DomName('Request.context')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get context => _blink.BlinkRequest.instance.context_Getter_(unwrap_jso(this));
+  
   @DomName('Request.credentials')
   @DocsEditable()
   @Experimental() // untriaged
@@ -42539,36 +45946,15 @@
 
   @DomName('Response.Response')
   @DocsEditable()
-  factory _Response(body_OR_input, [Map requestInitDict_OR_responseInitDict]) {
-    if ((body_OR_input is String || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input));
+  factory _Response([Object body, Map responseInitDict]) {
+    if (responseInitDict != null) {
+      var responseInitDict_1 = convertDartToNative_Dictionary(responseInitDict);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body, responseInitDict_1));
     }
-    if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is String || body_OR_input == null)) {
-      var responseInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, responseInitDict_1));
+    if (body != null) {
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body));
     }
-    if ((body_OR_input is Blob || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input));
-    }
-    if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is Blob || body_OR_input == null)) {
-      var responseInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, responseInitDict_1));
-    }
-    if ((body_OR_input is TypedData || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input));
-    }
-    if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is TypedData || body_OR_input == null)) {
-      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, requestInitDict_1));
-    }
-    if ((body_OR_input is ByteBuffer || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input));
-    }
-    if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is ByteBuffer || body_OR_input == null)) {
-      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, requestInitDict_1));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_0_());
   }
 
 
@@ -42822,34 +46208,6 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSFilterValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-class _WebKitCSSFilterValue extends _CssValueList {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitCSSFilterValue._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _WebKitCSSFilterValue internalCreate_WebKitCSSFilterValue() {
-    return new _WebKitCSSFilterValue._internalWrap();
-  }
-
-  external factory _WebKitCSSFilterValue._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _WebKitCSSFilterValue.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('WebKitCSSMatrix')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -42890,59 +46248,57 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSTransformValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-class _WebKitCSSTransformValue extends _CssValueList {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitCSSTransformValue._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _WebKitCSSTransformValue internalCreate_WebKitCSSTransformValue() {
-    return new _WebKitCSSTransformValue._internalWrap();
-  }
-
-  external factory _WebKitCSSTransformValue._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _WebKitCSSTransformValue.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('WindowTimers')
 @Experimental() // untriaged
 abstract class _WindowTimers extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
   factory _WindowTimers._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('WindowTimers.clearInterval')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void _clearInterval(int handle);
+  int _setInterval_String(String handler, [int timeout, Object arguments]) {
+    if (timeout != null) {
+      return _blink.BlinkWindowTimers.instance.setInterval_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+    }
+    return _blink.BlinkWindowTimers.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+  }
 
-  @DomName('WindowTimers.clearTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void _clearTimeout(int handle);
+  int _setTimeout_String(String handler, [int timeout, Object arguments]) {
+    if (timeout != null) {
+      return _blink.BlinkWindowTimers.instance.setTimeout_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+    }
+    return _blink.BlinkWindowTimers.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+  }
 
-  @DomName('WindowTimers.setInterval')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout);
+  void _clearInterval([int handle]) {
+    if (handle != null) {
+      _blink.BlinkWindowTimers.instance.clearInterval_Callback_1_(unwrap_jso(this), handle);
+      return;
+    }
+    _blink.BlinkWindowTimers.instance.clearInterval_Callback_0_(unwrap_jso(this));
+    return;
+  }
 
-  @DomName('WindowTimers.setTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout);
+  void _clearTimeout([int handle]) {
+    if (handle != null) {
+      _blink.BlinkWindowTimers.instance.clearTimeout_Callback_1_(unwrap_jso(this), handle);
+      return;
+    }
+    _blink.BlinkWindowTimers.instance.clearTimeout_Callback_0_(unwrap_jso(this));
+    return;
+  }
+
+  int _setInterval(Object handler, [int timeout]) {
+    if (timeout != null) {
+      return _blink.BlinkWindowTimers.instance.setInterval_Callback_2_(unwrap_jso(this), handler, timeout);
+    }
+    return _blink.BlinkWindowTimers.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+  }
+
+  int _setTimeout(Object handler, [int timeout]) {
+    if (timeout != null) {
+      return _blink.BlinkWindowTimers.instance.setTimeout_Callback_2_(unwrap_jso(this), handler, timeout);
+    }
+    return _blink.BlinkWindowTimers.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+  }
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -47351,22 +50707,22 @@
   /** The "fixed" value of whether the alt key is being pressed. */
   bool _shadowAltKey;
 
-  /** Caculated value of what the estimated charCode is for this event. */
+  /** Calculated value of what the estimated charCode is for this event. */
   int _shadowCharCode;
 
-  /** Caculated value of what the estimated keyCode is for this event. */
+  /** Calculated value of what the estimated keyCode is for this event. */
   int _shadowKeyCode;
 
-  /** Caculated value of what the estimated keyCode is for this event. */
+  /** Calculated 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. */
+  /** Calculated 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. */
+  /** Calculated 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. */
+  /** Calculated value of what the estimated keyCode is for this event. */
   int get which => keyCode;
 
   /** Accessor to the underlying keyCode value is the parent event. */
@@ -47421,8 +50777,6 @@
   /** The currently registered target for this event. */
   EventTarget get currentTarget => _currentTarget;
 
-  /** Accessor to the clipboardData available for this event. */
-  DataTransfer get clipboardData => _parent.clipboardData;
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
   int get detail => _parent.detail;
@@ -47432,10 +50786,8 @@
    * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
    */
   int get keyLocation => _parent.keyLocation;
-  Point get layer => _parent.layer;
   /** True if the Meta (or Mac command) key is pressed during this event. */
   bool get metaKey => _parent.metaKey;
-  Point get page => _parent.page;
   /** True if the shift key was pressed during this event. */
   bool get shiftKey => _parent.shiftKey;
   Window get view => _parent.view;
@@ -47447,6 +50799,7 @@
 
   int get _charCode => charCode;
   int get _keyCode => keyCode;
+  int get _which => which;
   String get _keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
@@ -47456,10 +50809,6 @@
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
-  int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
   @Experimental() // untriaged
   bool getModifierState(String keyArgument) => throw new UnimplementedError();
   @Experimental() // untriaged
@@ -47515,8 +50864,6 @@
 
   bool get cancelable => wrapped.cancelable;
 
-  DataTransfer get clipboardData => wrapped.clipboardData;
-
   EventTarget get currentTarget => wrapped.currentTarget;
 
   bool get defaultPrevented => wrapped.defaultPrevented;
@@ -47856,7 +51203,7 @@
 
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
+  static spawnDomUri(String uri) => wrap_jso(_blink.Blink_Utils.spawnDomUri(uri));
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -48433,7 +51780,8 @@
     return [
         "inspect",
         (o) {
-          return host.callMethod("_inspect", [unwrap_jso(o)]);
+          host.callMethod("_inspect", [unwrap_jso(o)]);
+          return o;
         },
         "dir",
         window().console.dir,
@@ -48465,10 +51813,10 @@
     String extendsTagName) => _blink.Blink_Utils.register(unwrap_jso(document), tag, customType, extendsTagName);
 
   static Element createElement(Document document, String tagName) =>
-    wrap_jso(_blink.Blink_Utils.createElement(unwrap_jso(document), tagName));
+      wrap_jso(_blink.Blink_Utils.createElement(unwrap_jso(document), tagName));
 
   static Element changeElementWrapper(HtmlElement element, Type type) =>
-    _blink.Blink_Utils.changeElementWrapper(unwrap_jso(element), type);
+      wrap_jso(_blink.Blink_Utils.changeElementWrapper(unwrap_jso(element), type));
 }
 
 class _DOMWindowCrossFrame extends DartHtmlDomObject implements
@@ -48483,17 +51831,18 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
-  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
-  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
-  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
-  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
-  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
+  HistoryBase get history => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_history(unwrap_jso(this)));
+  LocationBase get location => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_location(unwrap_jso(this)));
+  bool get closed => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_closed(unwrap_jso(this)));
+  WindowBase get opener => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_opener(unwrap_jso(this)));
+  WindowBase get parent => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_parent(unwrap_jso(this)));
+  WindowBase get top => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_top(unwrap_jso(this)));
 
   // Methods.
-  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
+  void close() => _blink.Blink_DOMWindowCrossFrame.close(unwrap_jso(this));
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
-    _blink.Blink_DOMWindowCrossFrame.postMessage(this, message, targetOrigin, messagePorts);
+      _blink.Blink_DOMWindowCrossFrame.postMessage(unwrap_jso(this),
+         convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
 
   // Implementation support.
   String get typeName => "Window";
@@ -48526,9 +51875,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() => _blink.Blink_HistoryCrossFrame.back(this);
-  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
-  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
+  void back() => _blink.Blink_HistoryCrossFrame.back(unwrap_jso(this));
+  void forward() => _blink.Blink_HistoryCrossFrame.forward(unwrap_jso(this));
+  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(unwrap_jso(this), distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -48538,33 +51887,12 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
+  set href(String h) => _blink.Blink_LocationCrossFrame.set_href(unwrap_jso(this), h);
 
   // Implementation support.
   String get typeName => "Location";
 }
 
-class _DOMStringMap extends DartHtmlDomObject implements Map<String, String> {
-  _DOMStringMap.internal();
-
-  bool containsValue(String value) => Maps.containsValue(this, value);
-  bool containsKey(String key) => _blink.Blink_DOMStringMap.containsKey(this, key);
-  String operator [](String key) => _blink.Blink_DOMStringMap.item(this, key);
-  void operator []=(String key, String value) => _blink.Blink_DOMStringMap.setItem(this, key, value);
-  String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
-  String remove(String key) => _blink.Blink_DOMStringMap.remove(this, key);
-  void clear() => Maps.clear(this);
-  void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys => _blink.Blink_DOMStringMap.get_keys(this);
-  Iterable<String> get values => Maps.getValues(this);
-  int get length => Maps.length(this);
-  bool get isEmpty => Maps.isEmpty(this);
-  bool get isNotEmpty => Maps.isNotEmpty(this);
-  void addAll(Map<String, String> other) {
-    other.forEach((key, value) => this[key] = value);
-  }
-}
-
 // TODO(vsm): Remove DOM isolate code once we have Dartium isolates
 // as workers.  This is only used to support
 // printing and timers in background isolates. As workers they should
diff --git a/sdk/lib/html/html_common/conversions_dartium.dart b/sdk/lib/html/html_common/conversions_dartium.dart
index 90fe55d..ad71852 100644
--- a/sdk/lib/html/html_common/conversions_dartium.dart
+++ b/sdk/lib/html/html_common/conversions_dartium.dart
@@ -120,7 +120,8 @@
 
 // Helper function to wrapped a returned dictionary from blink to a Dart looking
 // class.
-convertNativeDictionaryToDartDictionary(Map values) => new _ReturnedDictionary(values);
+convertNativeDictionaryToDartDictionary(Map values) =>
+  values != null ? new _ReturnedDictionary(values) : null;
 
 // Conversion function place holder (currently not used in dart2js or dartium).
 List convertDartToNative_StringArray(List<String> input) => input;
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 1f80c9d..f969eb3 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -774,6 +774,16 @@
   @annotation_Creates_SerializedScriptValue
   Request _get(Object key) native;
 
+  @DomName('IDBIndex.getAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Request getAll(Object range, [int maxCount]) native;
+
+  @DomName('IDBIndex.getAllKeys')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Request getAllKeys(Object range, [int maxCount]) native;
+
   @JSName('getKey')
   @DomName('IDBIndex.getKey')
   @DocsEditable()
@@ -1072,41 +1082,21 @@
 
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex(String name, keyPath, [Map options]) {
-    if ((keyPath is String || keyPath == null) && options == null) {
-      return _createIndex_1(name, keyPath);
-    }
-    if (options != null && (keyPath is String || keyPath == null)) {
+  Index _createIndex(String name, Object keyPath, [Map options]) {
+    if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
-      return _createIndex_2(name, keyPath, options_1);
+      return _createIndex_1(name, keyPath, options_1);
     }
-    if ((keyPath is List<String> || keyPath == null) && options == null) {
-      List keyPath_1 = convertDartToNative_StringArray(keyPath);
-      return _createIndex_3(name, keyPath_1);
-    }
-    if (options != null && (keyPath is List<String> || keyPath == null)) {
-      List keyPath_1 = convertDartToNative_StringArray(keyPath);
-      var options_2 = convertDartToNative_Dictionary(options);
-      return _createIndex_4(name, keyPath_1, options_2);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return _createIndex_2(name, keyPath);
   }
   @JSName('createIndex')
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex_1(name, String keyPath) native;
+  Index _createIndex_1(name, keyPath, options) native;
   @JSName('createIndex')
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex_2(name, String keyPath, options) native;
-  @JSName('createIndex')
-  @DomName('IDBObjectStore.createIndex')
-  @DocsEditable()
-  Index _createIndex_3(name, List keyPath) native;
-  @JSName('createIndex')
-  @DomName('IDBObjectStore.createIndex')
-  @DocsEditable()
-  Index _createIndex_4(name, List keyPath, options) native;
+  Index _createIndex_2(name, keyPath) native;
 
   @JSName('delete')
   @DomName('IDBObjectStore.delete')
@@ -1125,6 +1115,16 @@
   @annotation_Creates_SerializedScriptValue
   Request _get(Object key) native;
 
+  @DomName('IDBObjectStore.getAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Request getAll(Object range, [int maxCount]) native;
+
+  @DomName('IDBObjectStore.getAllKeys')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Request getAllKeys(Object range, [int maxCount]) native;
+
   @DomName('IDBObjectStore.index')
   @DocsEditable()
   Index index(String name) native;
@@ -1394,6 +1394,13 @@
   @DocsEditable()
   final String mode;
 
+  @DomName('IDBTransaction.objectStoreNames')
+  @DocsEditable()
+  @Experimental() // untriaged
+  @Returns('DomStringList')
+  @Creates('DomStringList')
+  final List<String> objectStoreNames;
+
   @DomName('IDBTransaction.abort')
   @DocsEditable()
   void abort() native;
@@ -1431,6 +1438,18 @@
   // To suppress missing implicit constructor warnings.
   factory VersionChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('IDBVersionChangeEvent.IDBVersionChangeEvent')
+  @DocsEditable()
+  factory VersionChangeEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return VersionChangeEvent._create_1(type, eventInitDict_1);
+    }
+    return VersionChangeEvent._create_2(type);
+  }
+  static VersionChangeEvent _create_1(type, eventInitDict) => JS('VersionChangeEvent', 'new IDBVersionChangeEvent(#,#)', type, eventInitDict);
+  static VersionChangeEvent _create_2(type) => JS('VersionChangeEvent', 'new IDBVersionChangeEvent(#)', type);
+
   @DomName('IDBVersionChangeEvent.dataLoss')
   @DocsEditable()
   @Experimental() // untriaged
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 36b35e3..02a914f 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -704,6 +704,20 @@
   @DocsEditable()
   Request _get(Object key) => wrap_jso(_blink.BlinkIDBIndex.instance.get_Callback_1_(unwrap_jso(this), key));
   
+  Request getAll(Object range, [int maxCount]) {
+    if (maxCount != null) {
+      return wrap_jso(_blink.BlinkIDBIndex.instance.getAll_Callback_2_(unwrap_jso(this), range, maxCount));
+    }
+    return wrap_jso(_blink.BlinkIDBIndex.instance.getAll_Callback_1_(unwrap_jso(this), range));
+  }
+
+  Request getAllKeys(Object range, [int maxCount]) {
+    if (maxCount != null) {
+      return wrap_jso(_blink.BlinkIDBIndex.instance.getAllKeys_Callback_2_(unwrap_jso(this), range, maxCount));
+    }
+    return wrap_jso(_blink.BlinkIDBIndex.instance.getAllKeys_Callback_1_(unwrap_jso(this), range));
+  }
+
   @DomName('IDBIndex.getKey')
   @DocsEditable()
   Request _getKey(Object key) => wrap_jso(_blink.BlinkIDBIndex.instance.getKey_Callback_1_(unwrap_jso(this), key));
@@ -1001,20 +1015,11 @@
   @DocsEditable()
   Request _count(Object key) => wrap_jso(_blink.BlinkIDBObjectStore.instance.count_Callback_1_(unwrap_jso(this), key));
   
-  Index _createIndex(String name, keyPath, [Map options]) {
-    if ((keyPath is String || keyPath == null) && (name is String || name == null) && options == null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(unwrap_jso(this), name, unwrap_jso(keyPath)));
+  Index _createIndex(String name, Object keyPath, [Map options]) {
+    if (options != null) {
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(unwrap_jso(this), name, keyPath, convertDartToNative_Dictionary(options)));
     }
-    if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(unwrap_jso(this), name, unwrap_jso(keyPath), convertDartToNative_Dictionary(options)));
-    }
-    if ((keyPath is List<String> || keyPath == null) && (name is String || name == null) && options == null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(unwrap_jso(this), name, unwrap_jso(keyPath)));
-    }
-    if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(unwrap_jso(this), name, unwrap_jso(keyPath), convertDartToNative_Dictionary(options)));
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(unwrap_jso(this), name, keyPath));
   }
 
   @DomName('IDBObjectStore.delete')
@@ -1029,6 +1034,20 @@
   @DocsEditable()
   Request _get(Object key) => wrap_jso(_blink.BlinkIDBObjectStore.instance.get_Callback_1_(unwrap_jso(this), key));
   
+  Request getAll(Object range, [int maxCount]) {
+    if (maxCount != null) {
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.getAll_Callback_2_(unwrap_jso(this), range, maxCount));
+    }
+    return wrap_jso(_blink.BlinkIDBObjectStore.instance.getAll_Callback_1_(unwrap_jso(this), range));
+  }
+
+  Request getAllKeys(Object range, [int maxCount]) {
+    if (maxCount != null) {
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.getAllKeys_Callback_2_(unwrap_jso(this), range, maxCount));
+    }
+    return wrap_jso(_blink.BlinkIDBObjectStore.instance.getAllKeys_Callback_1_(unwrap_jso(this), range));
+  }
+
   @DomName('IDBObjectStore.index')
   @DocsEditable()
   Index index(String name) => wrap_jso(_blink.BlinkIDBObjectStore.instance.index_Callback_1_(unwrap_jso(this), name));
@@ -1310,6 +1329,11 @@
   @DocsEditable()
   String get mode => _blink.BlinkIDBTransaction.instance.mode_Getter_(unwrap_jso(this));
   
+  @DomName('IDBTransaction.objectStoreNames')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> get objectStoreNames => wrap_jso(_blink.BlinkIDBTransaction.instance.objectStoreNames_Getter_(unwrap_jso(this)));
+  
   @DomName('IDBTransaction.abort')
   @DocsEditable()
   void abort() => _blink.BlinkIDBTransaction.instance.abort_Callback_0_(unwrap_jso(this));
@@ -1348,6 +1372,16 @@
   // To suppress missing implicit constructor warnings.
   factory VersionChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('IDBVersionChangeEvent.IDBVersionChangeEvent')
+  @DocsEditable()
+  factory VersionChangeEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return wrap_jso(_blink.BlinkIDBVersionChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    }
+    return wrap_jso(_blink.BlinkIDBVersionChangeEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static VersionChangeEvent internalCreateVersionChangeEvent() {
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 5cb2ace..4b967b9 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -75,49 +75,6 @@
 
 
 @DocsEditable()
-@DomName('SVGAltGlyphElement')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.FIREFOX)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Unstable()
-@Native("SVGAltGlyphElement")
-class AltGlyphElement extends TextPositioningElement implements UriReference {
-  // To suppress missing implicit constructor warnings.
-  factory AltGlyphElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGAltGlyphElement.SVGAltGlyphElement')
-  @DocsEditable()
-  factory AltGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("altGlyph");
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  AltGlyphElement.created() : super.created();
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('altGlyph') && (new SvgElement.tag('altGlyph') is AltGlyphElement);
-
-  @DomName('SVGAltGlyphElement.format')
-  @DocsEditable()
-  String format;
-
-  @DomName('SVGAltGlyphElement.glyphRef')
-  @DocsEditable()
-  String glyphRef;
-
-  // From SVGURIReference
-
-  @DomName('SVGAltGlyphElement.href')
-  @DocsEditable()
-  final AnimatedString href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGAngle')
 @Unstable()
 @Native("SVGAngle")
@@ -1991,6 +1948,16 @@
   @DocsEditable()
   final AnimatedString in1;
 
+  @DomName('SVGFESpecularLightingElement.kernelUnitLengthX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AnimatedNumber kernelUnitLengthX;
+
+  @DomName('SVGFESpecularLightingElement.kernelUnitLengthY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AnimatedNumber kernelUnitLengthY;
+
   @DomName('SVGFESpecularLightingElement.specularConstant')
   @DocsEditable()
   final AnimatedNumber specularConstant;
@@ -2273,14 +2240,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => SvgElement.isTagSupported('filter') && (new SvgElement.tag('filter') is FilterElement);
 
-  @DomName('SVGFilterElement.filterResX')
-  @DocsEditable()
-  final AnimatedInteger filterResX;
-
-  @DomName('SVGFilterElement.filterResY')
-  @DocsEditable()
-  final AnimatedInteger filterResY;
-
   @DomName('SVGFilterElement.filterUnits')
   @DocsEditable()
   final AnimatedEnumeration filterUnits;
@@ -2305,10 +2264,6 @@
   @DocsEditable()
   final AnimatedLength y;
 
-  @DomName('SVGFilterElement.setFilterRes')
-  @DocsEditable()
-  void setFilterRes(int filterResX, int filterResY) native;
-
   // From SVGURIReference
 
   @DomName('SVGFilterElement.href')
@@ -2727,11 +2682,11 @@
   @DomName('SVGLengthList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Length value) native;
+  void __setter__(int index, Length newItem) native;
 
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length item) native;
+  Length appendItem(Length newItem) native;
 
   @DomName('SVGLengthList.clear')
   @DocsEditable()
@@ -2743,11 +2698,11 @@
 
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length item) native;
+  Length initialize(Length newItem) native;
 
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length item, int index) native;
+  Length insertItemBefore(Length newItem, int index) native;
 
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
@@ -2755,7 +2710,7 @@
 
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length item, int index) native;
+  Length replaceItem(Length newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3179,11 +3134,11 @@
   @DomName('SVGNumberList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Number value) native;
+  void __setter__(int index, Number newItem) native;
 
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number item) native;
+  Number appendItem(Number newItem) native;
 
   @DomName('SVGNumberList.clear')
   @DocsEditable()
@@ -3195,11 +3150,11 @@
 
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number item) native;
+  Number initialize(Number newItem) native;
 
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number item, int index) native;
+  Number insertItemBefore(Number newItem, int index) native;
 
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
@@ -3207,7 +3162,7 @@
 
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number item, int index) native;
+  Number replaceItem(Number newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3966,7 +3921,7 @@
   @DomName('SVGPathSegList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, PathSeg value) native;
+  void __setter__(int index, PathSeg newItem) native;
 
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
@@ -4173,11 +4128,11 @@
   @DomName('SVGPointList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Point value) native;
+  void __setter__(int index, Point newItem) native;
 
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point item) native;
+  Point appendItem(Point newItem) native;
 
   @DomName('SVGPointList.clear')
   @DocsEditable()
@@ -4189,11 +4144,11 @@
 
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point item) native;
+  Point initialize(Point newItem) native;
 
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point item, int index) native;
+  Point insertItemBefore(Point newItem, int index) native;
 
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
@@ -4201,7 +4156,7 @@
 
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point item, int index) native;
+  Point replaceItem(Point newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -4471,43 +4426,6 @@
 
 
 @DocsEditable()
-@DomName('SVGRenderingIntent')
-@Unstable()
-@Native("SVGRenderingIntent")
-class RenderingIntent extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory RenderingIntent._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_ABSOLUTE_COLORIMETRIC')
-  @DocsEditable()
-  static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_AUTO')
-  @DocsEditable()
-  static const int RENDERING_INTENT_AUTO = 1;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_PERCEPTUAL')
-  @DocsEditable()
-  static const int RENDERING_INTENT_PERCEPTUAL = 2;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_RELATIVE_COLORIMETRIC')
-  @DocsEditable()
-  static const int RENDERING_INTENT_RELATIVE_COLORIMETRIC = 3;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_SATURATION')
-  @DocsEditable()
-  static const int RENDERING_INTENT_SATURATION = 4;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_UNKNOWN')
-  @DocsEditable()
-  static const int RENDERING_INTENT_UNKNOWN = 0;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGScriptElement')
 @Unstable()
 @Native("SVGScriptElement")
@@ -4661,11 +4579,11 @@
   @DomName('SVGStringList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, String value) native;
+  void __setter__(int index, String newItem) native;
 
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
-  String appendItem(String item) native;
+  String appendItem(String newItem) native;
 
   @DomName('SVGStringList.clear')
   @DocsEditable()
@@ -4677,7 +4595,7 @@
 
   @DomName('SVGStringList.initialize')
   @DocsEditable()
-  String initialize(String item) native;
+  String initialize(String newItem) native;
 
   @DomName('SVGStringList.insertItemBefore')
   @DocsEditable()
@@ -4689,7 +4607,7 @@
 
   @DomName('SVGStringList.replaceItem')
   @DocsEditable()
-  String replaceItem(String item, int index) native;
+  String replaceItem(String newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -5178,19 +5096,15 @@
   @DocsEditable()
   final SvgElement viewportElement;
 
-  @DomName('SVGElement.xmlbase')
-  @DocsEditable()
-  String xmlbase;
-
-  @DomName('SVGElement.xmllang')
+  @DomName('SVGElement.blur')
   @DocsEditable()
   @Experimental() // untriaged
-  String xmllang;
+  void blur() native;
 
-  @DomName('SVGElement.xmlspace')
+  @DomName('SVGElement.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  String xmlspace;
+  void focus() native;
 
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -5799,11 +5713,11 @@
 
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int offset) native;
+  Point getEndPositionOfChar(int charnum) native;
 
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
-  Rect getExtentOfChar(int offset) native;
+  Rect getExtentOfChar(int charnum) native;
 
   @DomName('SVGTextContentElement.getNumberOfChars')
   @DocsEditable()
@@ -5811,19 +5725,19 @@
 
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  double getRotationOfChar(int offset) native;
+  double getRotationOfChar(int charnum) native;
 
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int offset) native;
+  Point getStartPositionOfChar(int charnum) native;
 
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  double getSubStringLength(int offset, int length) native;
+  double getSubStringLength(int charnum, int nchars) native;
 
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
-  void selectSubString(int offset, int length) native;
+  void selectSubString(int charnum, int nchars) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6117,11 +6031,11 @@
   @DomName('SVGTransformList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Transform value) native;
+  void __setter__(int index, Transform newItem) native;
 
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform item) native;
+  Transform appendItem(Transform newItem) native;
 
   @DomName('SVGTransformList.clear')
   @DocsEditable()
@@ -6142,11 +6056,11 @@
 
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform item) native;
+  Transform initialize(Transform newItem) native;
 
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform item, int index) native;
+  Transform insertItemBefore(Transform newItem, int index) native;
 
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
@@ -6154,7 +6068,7 @@
 
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform item, int index) native;
+  Transform replaceItem(Transform newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6457,44 +6371,6 @@
 
 
 @DocsEditable()
-@DomName('SVGAltGlyphDefElement')
-@Unstable()
-@Native("SVGAltGlyphDefElement")
-abstract class _SVGAltGlyphDefElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGAltGlyphDefElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGAltGlyphDefElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGAltGlyphItemElement')
-@Unstable()
-@Native("SVGAltGlyphItemElement")
-abstract class _SVGAltGlyphItemElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGAltGlyphItemElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGAltGlyphItemElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGComponentTransferFunctionElement')
 @Unstable()
 @Native("SVGComponentTransferFunctionElement")
@@ -6569,189 +6445,6 @@
 
 
 @DocsEditable()
-@DomName('SVGFontElement')
-@Unstable()
-@Native("SVGFontElement")
-abstract class _SVGFontElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGFontFaceElement')
-@Unstable()
-@Native("SVGFontFaceElement")
-abstract class _SVGFontFaceElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGFontFaceFormatElement')
-@Unstable()
-@Native("SVGFontFaceFormatElement")
-abstract class _SVGFontFaceFormatElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceFormatElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceFormatElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGFontFaceNameElement')
-@Unstable()
-@Native("SVGFontFaceNameElement")
-abstract class _SVGFontFaceNameElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceNameElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceNameElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGFontFaceSrcElement')
-@Unstable()
-@Native("SVGFontFaceSrcElement")
-abstract class _SVGFontFaceSrcElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceSrcElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceSrcElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGFontFaceUriElement')
-@Unstable()
-@Native("SVGFontFaceUriElement")
-abstract class _SVGFontFaceUriElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceUriElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceUriElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGGlyphElement')
-@Unstable()
-@Native("SVGGlyphElement")
-abstract class _SVGGlyphElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGGlyphElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGGlyphElement.SVGGlyphElement')
-  @DocsEditable()
-  factory _SVGGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGGlyphElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGGlyphRefElement')
-@Unstable()
-@Native("SVGGlyphRefElement")
-abstract class _SVGGlyphRefElement extends SvgElement implements UriReference {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGGlyphRefElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGGlyphRefElement.created() : super.created();
-
-  // From SVGURIReference
-
-}
-
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGHKernElement')
-@Unstable()
-@Native("SVGHKernElement")
-abstract class _SVGHKernElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGHKernElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGHKernElement.SVGHKernElement')
-  @DocsEditable()
-  factory _SVGHKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("hkern");
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGHKernElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGMPathElement')
 @Native("SVGMPathElement")
 abstract class _SVGMPathElement extends SvgElement implements UriReference {
@@ -6772,45 +6465,3 @@
 
 }
 
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGMissingGlyphElement')
-@Unstable()
-@Native("SVGMissingGlyphElement")
-abstract class _SVGMissingGlyphElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGMissingGlyphElement._() { throw new UnsupportedError("Not supported"); }
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGMissingGlyphElement.created() : super.created();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGVKernElement')
-@Unstable()
-@Native("SVGVKernElement")
-abstract class _SVGVKernElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGVKernElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGVKernElement.SVGVKernElement')
-  @DocsEditable()
-  factory _SVGVKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("vkern");
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGVKernElement.created() : super.created();
-}
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 7795952..1e7f276 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -27,9 +27,6 @@
 @Deprecated("Internal Use Only")
 final svgBlinkMap = {
   'SVGAElement': () => AElement,
-  'SVGAltGlyphDefElement': () => _SVGAltGlyphDefElement,
-  'SVGAltGlyphElement': () => AltGlyphElement,
-  'SVGAltGlyphItemElement': () => _SVGAltGlyphItemElement,
   'SVGAngle': () => Angle,
   'SVGAnimateElement': () => AnimateElement,
   'SVGAnimateMotionElement': () => AnimateMotionElement,
@@ -84,20 +81,11 @@
   'SVGFilterElement': () => FilterElement,
   'SVGFilterPrimitiveStandardAttributes': () => FilterPrimitiveStandardAttributes,
   'SVGFitToViewBox': () => FitToViewBox,
-  'SVGFontElement': () => _SVGFontElement,
-  'SVGFontFaceElement': () => _SVGFontFaceElement,
-  'SVGFontFaceFormatElement': () => _SVGFontFaceFormatElement,
-  'SVGFontFaceNameElement': () => _SVGFontFaceNameElement,
-  'SVGFontFaceSrcElement': () => _SVGFontFaceSrcElement,
-  'SVGFontFaceUriElement': () => _SVGFontFaceUriElement,
   'SVGForeignObjectElement': () => ForeignObjectElement,
   'SVGGElement': () => GElement,
   'SVGGeometryElement': () => GeometryElement,
-  'SVGGlyphElement': () => _SVGGlyphElement,
-  'SVGGlyphRefElement': () => _SVGGlyphRefElement,
   'SVGGradientElement': () => _GradientElement,
   'SVGGraphicsElement': () => GraphicsElement,
-  'SVGHKernElement': () => _SVGHKernElement,
   'SVGImageElement': () => ImageElement,
   'SVGLength': () => Length,
   'SVGLengthList': () => LengthList,
@@ -108,7 +96,6 @@
   'SVGMaskElement': () => MaskElement,
   'SVGMatrix': () => Matrix,
   'SVGMetadataElement': () => MetadataElement,
-  'SVGMissingGlyphElement': () => _SVGMissingGlyphElement,
   'SVGNumber': () => Number,
   'SVGNumberList': () => NumberList,
   'SVGPathElement': () => PathElement,
@@ -142,7 +129,6 @@
   'SVGRadialGradientElement': () => RadialGradientElement,
   'SVGRect': () => Rect,
   'SVGRectElement': () => RectElement,
-  'SVGRenderingIntent': () => RenderingIntent,
   'SVGSVGElement': () => SvgSvgElement,
   'SVGScriptElement': () => ScriptElement,
   'SVGSetElement': () => SetElement,
@@ -163,7 +149,6 @@
   'SVGURIReference': () => UriReference,
   'SVGUnitTypes': () => UnitTypes,
   'SVGUseElement': () => UseElement,
-  'SVGVKernElement': () => _SVGVKernElement,
   'SVGViewElement': () => ViewElement,
   'SVGViewSpec': () => ViewSpec,
   'SVGZoomAndPan': () => ZoomAndPan,
@@ -175,9 +160,6 @@
 @Deprecated("Internal Use Only")
 final svgBlinkFunctionMap = {
   'SVGAElement': () => AElement.internalCreateAElement,
-  'SVGAltGlyphDefElement': () => _SVGAltGlyphDefElement.internalCreate_SVGAltGlyphDefElement,
-  'SVGAltGlyphElement': () => AltGlyphElement.internalCreateAltGlyphElement,
-  'SVGAltGlyphItemElement': () => _SVGAltGlyphItemElement.internalCreate_SVGAltGlyphItemElement,
   'SVGAngle': () => Angle.internalCreateAngle,
   'SVGAnimateElement': () => AnimateElement.internalCreateAnimateElement,
   'SVGAnimateMotionElement': () => AnimateMotionElement.internalCreateAnimateMotionElement,
@@ -230,20 +212,11 @@
   'SVGFETileElement': () => FETileElement.internalCreateFETileElement,
   'SVGFETurbulenceElement': () => FETurbulenceElement.internalCreateFETurbulenceElement,
   'SVGFilterElement': () => FilterElement.internalCreateFilterElement,
-  'SVGFontElement': () => _SVGFontElement.internalCreate_SVGFontElement,
-  'SVGFontFaceElement': () => _SVGFontFaceElement.internalCreate_SVGFontFaceElement,
-  'SVGFontFaceFormatElement': () => _SVGFontFaceFormatElement.internalCreate_SVGFontFaceFormatElement,
-  'SVGFontFaceNameElement': () => _SVGFontFaceNameElement.internalCreate_SVGFontFaceNameElement,
-  'SVGFontFaceSrcElement': () => _SVGFontFaceSrcElement.internalCreate_SVGFontFaceSrcElement,
-  'SVGFontFaceUriElement': () => _SVGFontFaceUriElement.internalCreate_SVGFontFaceUriElement,
   'SVGForeignObjectElement': () => ForeignObjectElement.internalCreateForeignObjectElement,
   'SVGGElement': () => GElement.internalCreateGElement,
   'SVGGeometryElement': () => GeometryElement.internalCreateGeometryElement,
-  'SVGGlyphElement': () => _SVGGlyphElement.internalCreate_SVGGlyphElement,
-  'SVGGlyphRefElement': () => _SVGGlyphRefElement.internalCreate_SVGGlyphRefElement,
   'SVGGradientElement': () => _GradientElement.internalCreate_GradientElement,
   'SVGGraphicsElement': () => GraphicsElement.internalCreateGraphicsElement,
-  'SVGHKernElement': () => _SVGHKernElement.internalCreate_SVGHKernElement,
   'SVGImageElement': () => ImageElement.internalCreateImageElement,
   'SVGLength': () => Length.internalCreateLength,
   'SVGLengthList': () => LengthList.internalCreateLengthList,
@@ -254,7 +227,6 @@
   'SVGMaskElement': () => MaskElement.internalCreateMaskElement,
   'SVGMatrix': () => Matrix.internalCreateMatrix,
   'SVGMetadataElement': () => MetadataElement.internalCreateMetadataElement,
-  'SVGMissingGlyphElement': () => _SVGMissingGlyphElement.internalCreate_SVGMissingGlyphElement,
   'SVGNumber': () => Number.internalCreateNumber,
   'SVGNumberList': () => NumberList.internalCreateNumberList,
   'SVGPathElement': () => PathElement.internalCreatePathElement,
@@ -288,7 +260,6 @@
   'SVGRadialGradientElement': () => RadialGradientElement.internalCreateRadialGradientElement,
   'SVGRect': () => Rect.internalCreateRect,
   'SVGRectElement': () => RectElement.internalCreateRectElement,
-  'SVGRenderingIntent': () => RenderingIntent.internalCreateRenderingIntent,
   'SVGSVGElement': () => SvgSvgElement.internalCreateSvgSvgElement,
   'SVGScriptElement': () => ScriptElement.internalCreateScriptElement,
   'SVGSetElement': () => SetElement.internalCreateSetElement,
@@ -307,7 +278,6 @@
   'SVGTransformList': () => TransformList.internalCreateTransformList,
   'SVGUnitTypes': () => UnitTypes.internalCreateUnitTypes,
   'SVGUseElement': () => UseElement.internalCreateUseElement,
-  'SVGVKernElement': () => _SVGVKernElement.internalCreate_SVGVKernElement,
   'SVGViewElement': () => ViewElement.internalCreateViewElement,
   'SVGViewSpec': () => ViewSpec.internalCreateViewSpec,
   'SVGZoomEvent': () => ZoomEvent.internalCreateZoomEvent,
@@ -378,69 +348,6 @@
 
 
 @DocsEditable()
-@DomName('SVGAltGlyphElement')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.FIREFOX)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Unstable()
-class AltGlyphElement extends TextPositioningElement implements UriReference {
-  // To suppress missing implicit constructor warnings.
-  factory AltGlyphElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGAltGlyphElement.SVGAltGlyphElement')
-  @DocsEditable()
-  factory AltGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("altGlyph");
-
-
-  @Deprecated("Internal Use Only")
-  static AltGlyphElement internalCreateAltGlyphElement() {
-    return new AltGlyphElement._internalWrap();
-  }
-
-  external factory AltGlyphElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  AltGlyphElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  AltGlyphElement.created() : super.created();
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => true;
-
-  @DomName('SVGAltGlyphElement.format')
-  @DocsEditable()
-  String get format => _blink.BlinkSVGAltGlyphElement.instance.format_Getter_(unwrap_jso(this));
-  
-  @DomName('SVGAltGlyphElement.format')
-  @DocsEditable()
-  set format(String value) => _blink.BlinkSVGAltGlyphElement.instance.format_Setter_(unwrap_jso(this), value);
-  
-  @DomName('SVGAltGlyphElement.glyphRef')
-  @DocsEditable()
-  String get glyphRef => _blink.BlinkSVGAltGlyphElement.instance.glyphRef_Getter_(unwrap_jso(this));
-  
-  @DomName('SVGAltGlyphElement.glyphRef')
-  @DocsEditable()
-  set glyphRef(String value) => _blink.BlinkSVGAltGlyphElement.instance.glyphRef_Setter_(unwrap_jso(this), value);
-  
-  @DomName('SVGAltGlyphElement.href')
-  @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGAltGlyphElement.instance.href_Getter_(unwrap_jso(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('SVGAngle')
 @Unstable()
 class Angle extends DartHtmlDomObject {
@@ -2968,6 +2875,16 @@
   @DocsEditable()
   AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.in1_Getter_(unwrap_jso(this)));
   
+  @DomName('SVGFESpecularLightingElement.kernelUnitLengthX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimatedNumber get kernelUnitLengthX => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.kernelUnitLengthX_Getter_(unwrap_jso(this)));
+  
+  @DomName('SVGFESpecularLightingElement.kernelUnitLengthY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimatedNumber get kernelUnitLengthY => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.kernelUnitLengthY_Getter_(unwrap_jso(this)));
+  
   @DomName('SVGFESpecularLightingElement.specularConstant')
   @DocsEditable()
   AnimatedNumber get specularConstant => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.specularConstant_Getter_(unwrap_jso(this)));
@@ -3300,14 +3217,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-  @DomName('SVGFilterElement.filterResX')
-  @DocsEditable()
-  AnimatedInteger get filterResX => wrap_jso(_blink.BlinkSVGFilterElement.instance.filterResX_Getter_(unwrap_jso(this)));
-  
-  @DomName('SVGFilterElement.filterResY')
-  @DocsEditable()
-  AnimatedInteger get filterResY => wrap_jso(_blink.BlinkSVGFilterElement.instance.filterResY_Getter_(unwrap_jso(this)));
-  
   @DomName('SVGFilterElement.filterUnits')
   @DocsEditable()
   AnimatedEnumeration get filterUnits => wrap_jso(_blink.BlinkSVGFilterElement.instance.filterUnits_Getter_(unwrap_jso(this)));
@@ -3332,10 +3241,6 @@
   @DocsEditable()
   AnimatedLength get y => wrap_jso(_blink.BlinkSVGFilterElement.instance.y_Getter_(unwrap_jso(this)));
   
-  @DomName('SVGFilterElement.setFilterRes')
-  @DocsEditable()
-  void setFilterRes(int filterResX, int filterResY) => _blink.BlinkSVGFilterElement.instance.setFilterRes_Callback_2_(unwrap_jso(this), filterResX, filterResY);
-  
   @DomName('SVGFilterElement.href')
   @DocsEditable()
   AnimatedString get href => wrap_jso(_blink.BlinkSVGFilterElement.instance.href_Getter_(unwrap_jso(this)));
@@ -3882,11 +3787,11 @@
   @DomName('SVGLengthList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Length value) => _blink.BlinkSVGLengthList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(value));
+  void __setter__(int index, Length newItem) => _blink.BlinkSVGLengthList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
   
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length item) => wrap_jso(_blink.BlinkSVGLengthList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
+  Length appendItem(Length newItem) => wrap_jso(_blink.BlinkSVGLengthList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGLengthList.clear')
   @DocsEditable()
@@ -3898,11 +3803,11 @@
   
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length item) => wrap_jso(_blink.BlinkSVGLengthList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
+  Length initialize(Length newItem) => wrap_jso(_blink.BlinkSVGLengthList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length item, int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
+  Length insertItemBefore(Length newItem, int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
@@ -3910,7 +3815,7 @@
   
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length item, int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
+  Length replaceItem(Length newItem, int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4479,11 +4384,11 @@
   @DomName('SVGNumberList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Number value) => _blink.BlinkSVGNumberList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(value));
+  void __setter__(int index, Number newItem) => _blink.BlinkSVGNumberList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
   
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number item) => wrap_jso(_blink.BlinkSVGNumberList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
+  Number appendItem(Number newItem) => wrap_jso(_blink.BlinkSVGNumberList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGNumberList.clear')
   @DocsEditable()
@@ -4495,11 +4400,11 @@
   
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number item) => wrap_jso(_blink.BlinkSVGNumberList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
+  Number initialize(Number newItem) => wrap_jso(_blink.BlinkSVGNumberList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number item, int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
+  Number insertItemBefore(Number newItem, int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
@@ -4507,7 +4412,7 @@
   
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number item, int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
+  Number replaceItem(Number newItem, int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5749,7 +5654,7 @@
   @DomName('SVGPathSegList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, PathSeg value) => _blink.BlinkSVGPathSegList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(value));
+  void __setter__(int index, PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
   
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
@@ -6050,11 +5955,11 @@
   @DomName('SVGPointList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Point value) => _blink.BlinkSVGPointList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(value));
+  void __setter__(int index, Point newItem) => _blink.BlinkSVGPointList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
   
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point item) => wrap_jso(_blink.BlinkSVGPointList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
+  Point appendItem(Point newItem) => wrap_jso(_blink.BlinkSVGPointList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGPointList.clear')
   @DocsEditable()
@@ -6066,11 +5971,11 @@
   
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point item) => wrap_jso(_blink.BlinkSVGPointList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
+  Point initialize(Point newItem) => wrap_jso(_blink.BlinkSVGPointList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point item, int index) => wrap_jso(_blink.BlinkSVGPointList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
+  Point insertItemBefore(Point newItem, int index) => wrap_jso(_blink.BlinkSVGPointList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
@@ -6078,7 +5983,7 @@
   
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point item, int index) => wrap_jso(_blink.BlinkSVGPointList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
+  Point replaceItem(Point newItem, int index) => wrap_jso(_blink.BlinkSVGPointList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6465,60 +6370,6 @@
 
 
 @DocsEditable()
-@DomName('SVGRenderingIntent')
-@Unstable()
-class RenderingIntent extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory RenderingIntent._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static RenderingIntent internalCreateRenderingIntent() {
-    return new RenderingIntent._internalWrap();
-  }
-
-  factory RenderingIntent._internalWrap() {
-    return new RenderingIntent.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  RenderingIntent.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_ABSOLUTE_COLORIMETRIC')
-  @DocsEditable()
-  static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_AUTO')
-  @DocsEditable()
-  static const int RENDERING_INTENT_AUTO = 1;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_PERCEPTUAL')
-  @DocsEditable()
-  static const int RENDERING_INTENT_PERCEPTUAL = 2;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_RELATIVE_COLORIMETRIC')
-  @DocsEditable()
-  static const int RENDERING_INTENT_RELATIVE_COLORIMETRIC = 3;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_SATURATION')
-  @DocsEditable()
-  static const int RENDERING_INTENT_SATURATION = 4;
-
-  @DomName('SVGRenderingIntent.RENDERING_INTENT_UNKNOWN')
-  @DocsEditable()
-  static const int RENDERING_INTENT_UNKNOWN = 0;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('SVGScriptElement')
 @Unstable()
 class ScriptElement extends SvgElement implements UriReference {
@@ -6729,11 +6580,11 @@
   @DomName('SVGStringList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, String value) => _blink.BlinkSVGStringList.instance.$__setter___Callback_2_(unwrap_jso(this), index, value);
+  void __setter__(int index, String newItem) => _blink.BlinkSVGStringList.instance.$__setter___Callback_2_(unwrap_jso(this), index, newItem);
   
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
-  String appendItem(String item) => _blink.BlinkSVGStringList.instance.appendItem_Callback_1_(unwrap_jso(this), item);
+  String appendItem(String newItem) => _blink.BlinkSVGStringList.instance.appendItem_Callback_1_(unwrap_jso(this), newItem);
   
   @DomName('SVGStringList.clear')
   @DocsEditable()
@@ -6745,7 +6596,7 @@
   
   @DomName('SVGStringList.initialize')
   @DocsEditable()
-  String initialize(String item) => _blink.BlinkSVGStringList.instance.initialize_Callback_1_(unwrap_jso(this), item);
+  String initialize(String newItem) => _blink.BlinkSVGStringList.instance.initialize_Callback_1_(unwrap_jso(this), newItem);
   
   @DomName('SVGStringList.insertItemBefore')
   @DocsEditable()
@@ -6757,7 +6608,7 @@
   
   @DomName('SVGStringList.replaceItem')
   @DocsEditable()
-  String replaceItem(String item, int index) => _blink.BlinkSVGStringList.instance.replaceItem_Callback_2_(unwrap_jso(this), item, index);
+  String replaceItem(String newItem, int index) => _blink.BlinkSVGStringList.instance.replaceItem_Callback_2_(unwrap_jso(this), newItem, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7304,33 +7155,15 @@
   @DocsEditable()
   SvgElement get viewportElement => wrap_jso(_blink.BlinkSVGElement.instance.viewportElement_Getter_(unwrap_jso(this)));
   
-  @DomName('SVGElement.xmlbase')
-  @DocsEditable()
-  String get xmlbase => _blink.BlinkSVGElement.instance.xmlbase_Getter_(unwrap_jso(this));
-  
-  @DomName('SVGElement.xmlbase')
-  @DocsEditable()
-  set xmlbase(String value) => _blink.BlinkSVGElement.instance.xmlbase_Setter_(unwrap_jso(this), value);
-  
-  @DomName('SVGElement.xmllang')
+  @DomName('SVGElement.blur')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmllang => _blink.BlinkSVGElement.instance.xmllang_Getter_(unwrap_jso(this));
+  void blur() => _blink.BlinkSVGElement.instance.blur_Callback_0_(unwrap_jso(this));
   
-  @DomName('SVGElement.xmllang')
+  @DomName('SVGElement.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  set xmllang(String value) => _blink.BlinkSVGElement.instance.xmllang_Setter_(unwrap_jso(this), value);
-  
-  @DomName('SVGElement.xmlspace')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String get xmlspace => _blink.BlinkSVGElement.instance.xmlspace_Getter_(unwrap_jso(this));
-  
-  @DomName('SVGElement.xmlspace')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set xmlspace(String value) => _blink.BlinkSVGElement.instance.xmlspace_Setter_(unwrap_jso(this), value);
+  void focus() => _blink.BlinkSVGElement.instance.focus_Callback_0_(unwrap_jso(this));
   
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -8006,11 +7839,11 @@
   
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int offset) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getEndPositionOfChar_Callback_1_(unwrap_jso(this), offset));
+  Point getEndPositionOfChar(int charnum) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getEndPositionOfChar_Callback_1_(unwrap_jso(this), charnum));
   
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
-  Rect getExtentOfChar(int offset) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getExtentOfChar_Callback_1_(unwrap_jso(this), offset));
+  Rect getExtentOfChar(int charnum) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getExtentOfChar_Callback_1_(unwrap_jso(this), charnum));
   
   @DomName('SVGTextContentElement.getNumberOfChars')
   @DocsEditable()
@@ -8018,19 +7851,19 @@
   
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  num getRotationOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getRotationOfChar_Callback_1_(unwrap_jso(this), offset);
+  num getRotationOfChar(int charnum) => _blink.BlinkSVGTextContentElement.instance.getRotationOfChar_Callback_1_(unwrap_jso(this), charnum);
   
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int offset) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getStartPositionOfChar_Callback_1_(unwrap_jso(this), offset));
+  Point getStartPositionOfChar(int charnum) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getStartPositionOfChar_Callback_1_(unwrap_jso(this), charnum));
   
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  num getSubStringLength(int offset, int length) => _blink.BlinkSVGTextContentElement.instance.getSubStringLength_Callback_2_(unwrap_jso(this), offset, length);
+  num getSubStringLength(int charnum, int nchars) => _blink.BlinkSVGTextContentElement.instance.getSubStringLength_Callback_2_(unwrap_jso(this), charnum, nchars);
   
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
-  void selectSubString(int offset, int length) => _blink.BlinkSVGTextContentElement.instance.selectSubString_Callback_2_(unwrap_jso(this), offset, length);
+  void selectSubString(int charnum, int nchars) => _blink.BlinkSVGTextContentElement.instance.selectSubString_Callback_2_(unwrap_jso(this), charnum, nchars);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8412,11 +8245,11 @@
   @DomName('SVGTransformList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Transform value) => _blink.BlinkSVGTransformList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(value));
+  void __setter__(int index, Transform newItem) => _blink.BlinkSVGTransformList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
   
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform item) => wrap_jso(_blink.BlinkSVGTransformList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
+  Transform appendItem(Transform newItem) => wrap_jso(_blink.BlinkSVGTransformList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGTransformList.clear')
   @DocsEditable()
@@ -8436,11 +8269,11 @@
   
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform item) => wrap_jso(_blink.BlinkSVGTransformList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
+  Transform initialize(Transform newItem) => wrap_jso(_blink.BlinkSVGTransformList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform item, int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
+  Transform insertItemBefore(Transform newItem, int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
@@ -8448,7 +8281,7 @@
   
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform item, int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
+  Transform replaceItem(Transform newItem, int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8855,72 +8688,6 @@
 
 
 @DocsEditable()
-@DomName('SVGAltGlyphDefElement')
-@Unstable()
-class _SVGAltGlyphDefElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGAltGlyphDefElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGAltGlyphDefElement internalCreate_SVGAltGlyphDefElement() {
-    return new _SVGAltGlyphDefElement._internalWrap();
-  }
-
-  external factory _SVGAltGlyphDefElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGAltGlyphDefElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGAltGlyphDefElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGAltGlyphItemElement')
-@Unstable()
-class _SVGAltGlyphItemElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGAltGlyphItemElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGAltGlyphItemElement internalCreate_SVGAltGlyphItemElement() {
-    return new _SVGAltGlyphItemElement._internalWrap();
-  }
-
-  external factory _SVGAltGlyphItemElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGAltGlyphItemElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGAltGlyphItemElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('SVGComponentTransferFunctionElement')
 @Unstable()
 class _SVGComponentTransferFunctionElement extends SvgElement {
@@ -9033,312 +8800,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGFontElement')
-@Unstable()
-class _SVGFontElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGFontElement internalCreate_SVGFontElement() {
-    return new _SVGFontElement._internalWrap();
-  }
-
-  external factory _SVGFontElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGFontElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGFontFaceElement')
-@Unstable()
-class _SVGFontFaceElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGFontFaceElement internalCreate_SVGFontFaceElement() {
-    return new _SVGFontFaceElement._internalWrap();
-  }
-
-  external factory _SVGFontFaceElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGFontFaceElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGFontFaceFormatElement')
-@Unstable()
-class _SVGFontFaceFormatElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceFormatElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGFontFaceFormatElement internalCreate_SVGFontFaceFormatElement() {
-    return new _SVGFontFaceFormatElement._internalWrap();
-  }
-
-  external factory _SVGFontFaceFormatElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGFontFaceFormatElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceFormatElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGFontFaceNameElement')
-@Unstable()
-class _SVGFontFaceNameElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceNameElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGFontFaceNameElement internalCreate_SVGFontFaceNameElement() {
-    return new _SVGFontFaceNameElement._internalWrap();
-  }
-
-  external factory _SVGFontFaceNameElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGFontFaceNameElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceNameElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGFontFaceSrcElement')
-@Unstable()
-class _SVGFontFaceSrcElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceSrcElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGFontFaceSrcElement internalCreate_SVGFontFaceSrcElement() {
-    return new _SVGFontFaceSrcElement._internalWrap();
-  }
-
-  external factory _SVGFontFaceSrcElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGFontFaceSrcElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceSrcElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGFontFaceUriElement')
-@Unstable()
-class _SVGFontFaceUriElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGFontFaceUriElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGFontFaceUriElement internalCreate_SVGFontFaceUriElement() {
-    return new _SVGFontFaceUriElement._internalWrap();
-  }
-
-  external factory _SVGFontFaceUriElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGFontFaceUriElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGFontFaceUriElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGGlyphElement')
-@Unstable()
-class _SVGGlyphElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGGlyphElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGGlyphElement.SVGGlyphElement')
-  @DocsEditable()
-  factory _SVGGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGGlyphElement internalCreate_SVGGlyphElement() {
-    return new _SVGGlyphElement._internalWrap();
-  }
-
-  external factory _SVGGlyphElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGGlyphElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGGlyphElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGGlyphRefElement')
-@Unstable()
-class _SVGGlyphRefElement extends SvgElement implements UriReference {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGGlyphRefElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGGlyphRefElement internalCreate_SVGGlyphRefElement() {
-    return new _SVGGlyphRefElement._internalWrap();
-  }
-
-  external factory _SVGGlyphRefElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGGlyphRefElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGGlyphRefElement.created() : super.created();
-
-  // Override these methods for Dartium _SVGGlyphRefElement can't be abstract.
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGGlyphRefElement.instance.href_Getter_(unwrap_jso(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('SVGHKernElement')
-@Unstable()
-class _SVGHKernElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGHKernElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGHKernElement.SVGHKernElement')
-  @DocsEditable()
-  factory _SVGHKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("hkern");
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGHKernElement internalCreate_SVGHKernElement() {
-    return new _SVGHKernElement._internalWrap();
-  }
-
-  external factory _SVGHKernElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGHKernElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGHKernElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGMPathElement')
@@ -9372,73 +8833,3 @@
   AnimatedString get href => wrap_jso(_blink.BlinkSVGMPathElement.instance.href_Getter_(unwrap_jso(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('SVGMissingGlyphElement')
-@Unstable()
-class _SVGMissingGlyphElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGMissingGlyphElement._() { throw new UnsupportedError("Not supported"); }
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGMissingGlyphElement internalCreate_SVGMissingGlyphElement() {
-    return new _SVGMissingGlyphElement._internalWrap();
-  }
-
-  external factory _SVGMissingGlyphElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGMissingGlyphElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGMissingGlyphElement.created() : super.created();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SVGVKernElement')
-@Unstable()
-class _SVGVKernElement extends SvgElement {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGVKernElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGVKernElement.SVGVKernElement')
-  @DocsEditable()
-  factory _SVGVKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("vkern");
-
-
-  @Deprecated("Internal Use Only")
-  static _SVGVKernElement internalCreate_SVGVKernElement() {
-    return new _SVGVKernElement._internalWrap();
-  }
-
-  external factory _SVGVKernElement._internalWrap();
-
-  @Deprecated("Internal Use Only")
-  _SVGVKernElement.internal_() : super.internal_();
-
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGVKernElement.created() : super.created();
-
-}
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 6005329..2a7e664 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -101,6 +101,16 @@
   @DocsEditable()
   final double sampleRate;
 
+  @DomName('AudioBuffer.copyFromChannel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyFromChannel(Float32List destination, int channelNumber, [int startInChannel]) native;
+
+  @DomName('AudioBuffer.copyToChannel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyToChannel(Float32List source, int channelNumber, [int startInChannel]) native;
+
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
   Float32List getChannelData(int channelIndex) native;
@@ -176,6 +186,11 @@
   @DocsEditable()
   AudioBuffer buffer;
 
+  @DomName('AudioBufferSourceNode.detune')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam detune;
+
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
   bool loop;
@@ -214,16 +229,6 @@
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `complete` events to event
-   * handlers that are not necessarily instances of [AudioContext].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('AudioContext.completeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.AudioContext || window.webkitAudioContext)');
 
@@ -243,6 +248,16 @@
   @DocsEditable()
   final double sampleRate;
 
+  @DomName('AudioContext.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String state;
+
+  @DomName('AudioContext.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future close() native;
+
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
   AnalyserNode createAnalyser() native;
@@ -304,6 +319,11 @@
   @Experimental() // untriaged
   PeriodicWave createPeriodicWave(Float32List real, Float32List imag) native;
 
+  @DomName('AudioContext.createStereoPanner')
+  @DocsEditable()
+  @Experimental() // untriaged
+  StereoPannerNode createStereoPanner() native;
+
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
   WaveShaperNode createWaveShaper() native;
@@ -313,14 +333,15 @@
   @DocsEditable()
   void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
 
-  @DomName('AudioContext.startRendering')
+  @DomName('AudioContext.resume')
   @DocsEditable()
-  void startRendering() native;
+  @Experimental() // untriaged
+  Future resume() native;
 
-  /// Stream of `complete` events handled by this [AudioContext].
-  @DomName('AudioContext.oncomplete')
+  @DomName('AudioContext.suspend')
   @DocsEditable()
-  Stream<Event> get onComplete => completeEvent.forTarget(this);
+  @Experimental() // untriaged
+  Future suspend() native;
 
   factory AudioContext() => JS('AudioContext',
       'new (window.AudioContext || window.webkitAudioContext)()');
@@ -455,11 +476,11 @@
   @JSName('connect')
   @DomName('AudioNode.connect')
   @DocsEditable()
-  void _connect(destination, int output, [int input]) native;
+  void _connect(destination, [int output, int input]) native;
 
   @DomName('AudioNode.disconnect')
   @DocsEditable()
-  void disconnect(int output) native;
+  void disconnect([destination_OR_output, int output, int input]) native;
 
   @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) =>
@@ -811,6 +832,11 @@
     return OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
   }
   static OfflineAudioContext _create_1(numberOfChannels, numberOfFrames, sampleRate) => JS('OfflineAudioContext', 'new OfflineAudioContext(#,#,#)', numberOfChannels, numberOfFrames, sampleRate);
+
+  @DomName('OfflineAudioContext.startRendering')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future startRendering() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -849,14 +875,6 @@
   @DocsEditable()
   String type;
 
-  @DomName('OscillatorNode.noteOff')
-  @DocsEditable()
-  void noteOff(num when) native;
-
-  @DomName('OscillatorNode.noteOn')
-  @DocsEditable()
-  void noteOn(num when) native;
-
   @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1000,6 +1018,24 @@
 
 
 @DocsEditable()
+@DomName('StereoPannerNode')
+@Experimental() // untriaged
+@Native("StereoPannerNode")
+class StereoPannerNode extends AudioNode {
+  // To suppress missing implicit constructor warnings.
+  factory StereoPannerNode._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('StereoPannerNode.pan')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam pan;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WaveShaperNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-WaveShaperNode
 @Experimental()
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 7a3a9c4..d318a3d 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -47,6 +47,7 @@
   'PannerNode': () => PannerNode,
   'PeriodicWave': () => PeriodicWave,
   'ScriptProcessorNode': () => ScriptProcessorNode,
+  'StereoPannerNode': () => StereoPannerNode,
   'WaveShaperNode': () => WaveShaperNode,
 
 };
@@ -80,6 +81,7 @@
   'PannerNode': () => PannerNode.internalCreatePannerNode,
   'PeriodicWave': () => PeriodicWave.internalCreatePeriodicWave,
   'ScriptProcessorNode': () => ScriptProcessorNode.internalCreateScriptProcessorNode,
+  'StereoPannerNode': () => StereoPannerNode.internalCreateStereoPannerNode,
   'WaveShaperNode': () => WaveShaperNode.internalCreateWaveShaperNode,
 
 };
@@ -148,20 +150,20 @@
   
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
-  void getByteFrequencyData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteFrequencyData_Callback_1_(unwrap_jso(this), array);
+  void getByteFrequencyData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteFrequencyData_Callback_1_(unwrap_jso(this), unwrap_jso(array));
   
   @DomName('AnalyserNode.getByteTimeDomainData')
   @DocsEditable()
-  void getByteTimeDomainData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteTimeDomainData_Callback_1_(unwrap_jso(this), array);
+  void getByteTimeDomainData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteTimeDomainData_Callback_1_(unwrap_jso(this), unwrap_jso(array));
   
   @DomName('AnalyserNode.getFloatFrequencyData')
   @DocsEditable()
-  void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatFrequencyData_Callback_1_(unwrap_jso(this), array);
+  void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatFrequencyData_Callback_1_(unwrap_jso(this), unwrap_jso(array));
   
   @DomName('AnalyserNode.getFloatTimeDomainData')
   @DocsEditable()
   @Experimental() // untriaged
-  void getFloatTimeDomainData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatTimeDomainData_Callback_1_(unwrap_jso(this), array);
+  void getFloatTimeDomainData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatTimeDomainData_Callback_1_(unwrap_jso(this), unwrap_jso(array));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -210,9 +212,27 @@
   @DocsEditable()
   num get sampleRate => _blink.BlinkAudioBuffer.instance.sampleRate_Getter_(unwrap_jso(this));
   
+  void copyFromChannel(Float32List destination, int channelNumber, [int startInChannel]) {
+    if (startInChannel != null) {
+      _blink.BlinkAudioBuffer.instance.copyFromChannel_Callback_3_(unwrap_jso(this), unwrap_jso(destination), channelNumber, startInChannel);
+      return;
+    }
+    _blink.BlinkAudioBuffer.instance.copyFromChannel_Callback_2_(unwrap_jso(this), unwrap_jso(destination), channelNumber);
+    return;
+  }
+
+  void copyToChannel(Float32List source, int channelNumber, [int startInChannel]) {
+    if (startInChannel != null) {
+      _blink.BlinkAudioBuffer.instance.copyToChannel_Callback_3_(unwrap_jso(this), unwrap_jso(source), channelNumber, startInChannel);
+      return;
+    }
+    _blink.BlinkAudioBuffer.instance.copyToChannel_Callback_2_(unwrap_jso(this), unwrap_jso(source), channelNumber);
+    return;
+  }
+
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
-  Float32List getChannelData(int channelIndex) => _blink.BlinkAudioBuffer.instance.getChannelData_Callback_1_(unwrap_jso(this), channelIndex);
+  Float32List getChannelData(int channelIndex) => wrap_jso(_blink.BlinkAudioBuffer.instance.getChannelData_Callback_1_(unwrap_jso(this), channelIndex));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -274,6 +294,11 @@
   @DocsEditable()
   set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.instance.buffer_Setter_(unwrap_jso(this), unwrap_jso(value));
   
+  @DomName('AudioBufferSourceNode.detune')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioParam get detune => wrap_jso(_blink.BlinkAudioBufferSourceNode.instance.detune_Getter_(unwrap_jso(this)));
+  
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
   bool get loop => _blink.BlinkAudioBufferSourceNode.instance.loop_Getter_(unwrap_jso(this));
@@ -349,16 +374,6 @@
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `complete` events to event
-   * handlers that are not necessarily instances of [AudioContext].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('AudioContext.completeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
-
   @DomName('AudioContext.AudioContext')
   @DocsEditable()
   factory AudioContext() {
@@ -396,6 +411,16 @@
   @DocsEditable()
   num get sampleRate => _blink.BlinkAudioContext.instance.sampleRate_Getter_(unwrap_jso(this));
   
+  @DomName('AudioContext.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get state => _blink.BlinkAudioContext.instance.state_Getter_(unwrap_jso(this));
+  
+  @DomName('AudioContext.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future close() => wrap_jso(_blink.BlinkAudioContext.instance.close_Callback_0_(unwrap_jso(this)));
+  
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
   AnalyserNode createAnalyser() => wrap_jso(_blink.BlinkAudioContext.instance.createAnalyser_Callback_0_(unwrap_jso(this)));
@@ -468,7 +493,7 @@
   @DomName('AudioContext.createPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => wrap_jso(_blink.BlinkAudioContext.instance.createPeriodicWave_Callback_2_(unwrap_jso(this), real, imag));
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => wrap_jso(_blink.BlinkAudioContext.instance.createPeriodicWave_Callback_2_(unwrap_jso(this), unwrap_jso(real), unwrap_jso(imag)));
   
   ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) {
     if (numberOfOutputChannels != null) {
@@ -483,23 +508,34 @@
     return wrap_jso(_blink.BlinkAudioContext.instance.createScriptProcessor_Callback_0_(unwrap_jso(this)));
   }
 
+  @DomName('AudioContext.createStereoPanner')
+  @DocsEditable()
+  @Experimental() // untriaged
+  StereoPannerNode createStereoPanner() => wrap_jso(_blink.BlinkAudioContext.instance.createStereoPanner_Callback_0_(unwrap_jso(this)));
+  
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
   WaveShaperNode createWaveShaper() => wrap_jso(_blink.BlinkAudioContext.instance.createWaveShaper_Callback_0_(unwrap_jso(this)));
   
-  @DomName('AudioContext.decodeAudioData')
-  @DocsEditable()
-  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.BlinkAudioContext.instance.decodeAudioData_Callback_3_(unwrap_jso(this), audioData, unwrap_jso((audioBuffer) => successCallback(wrap_jso(audioBuffer))), unwrap_jso((audioBuffer) => errorCallback(wrap_jso(audioBuffer))));
-  
-  @DomName('AudioContext.startRendering')
-  @DocsEditable()
-  void startRendering() => _blink.BlinkAudioContext.instance.startRendering_Callback_0_(unwrap_jso(this));
-  
-  /// Stream of `complete` events handled by this [AudioContext].
-  @DomName('AudioContext.oncomplete')
-  @DocsEditable()
-  Stream<Event> get onComplete => completeEvent.forTarget(this);
+  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) {
+    if (errorCallback != null) {
+      _blink.BlinkAudioContext.instance.decodeAudioData_Callback_3_(unwrap_jso(this), unwrap_jso(audioData), unwrap_jso((audioBuffer) => successCallback(wrap_jso(audioBuffer))), unwrap_jso((audioBuffer) => errorCallback(wrap_jso(audioBuffer))));
+      return;
+    }
+    _blink.BlinkAudioContext.instance.decodeAudioData_Callback_2_(unwrap_jso(this), unwrap_jso(audioData), unwrap_jso((audioBuffer) => successCallback(wrap_jso(audioBuffer))));
+    return;
+  }
 
+  @DomName('AudioContext.resume')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future resume() => wrap_jso(_blink.BlinkAudioContext.instance.resume_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('AudioContext.suspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future suspend() => wrap_jso(_blink.BlinkAudioContext.instance.suspend_Callback_0_(unwrap_jso(this)));
+  
   @DomName('AudioContext.decodeAudioData')
   Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
     var completer = new Completer<AudioBuffer>();
@@ -666,22 +702,62 @@
   @DocsEditable()
   int get numberOfOutputs => _blink.BlinkAudioNode.instance.numberOfOutputs_Getter_(unwrap_jso(this));
   
-  void _connect(destination, int output, [int input]) {
-    if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
+  void _connect(destination, [int output, int input]) {
+    if ((destination is AudioNode) && output == null && input == null) {
+      _blink.BlinkAudioNode.instance.connect_Callback_1_(unwrap_jso(this), unwrap_jso(destination));
+      return;
+    }
+    if ((output is int || output == null) && (destination is AudioNode) && input == null) {
+      _blink.BlinkAudioNode.instance.connect_Callback_2_(unwrap_jso(this), unwrap_jso(destination), output);
+      return;
+    }
+    if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode)) {
       _blink.BlinkAudioNode.instance.connect_Callback_3_(unwrap_jso(this), unwrap_jso(destination), output, input);
       return;
     }
-    if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
+    if ((destination is AudioParam) && output == null && input == null) {
+      _blink.BlinkAudioNode.instance.connect_Callback_1_(unwrap_jso(this), unwrap_jso(destination));
+      return;
+    }
+    if ((output is int || output == null) && (destination is AudioParam) && input == null) {
       _blink.BlinkAudioNode.instance.connect_Callback_2_(unwrap_jso(this), unwrap_jso(destination), output);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('AudioNode.disconnect')
-  @DocsEditable()
-  void disconnect(int output) => _blink.BlinkAudioNode.instance.disconnect_Callback_1_(unwrap_jso(this), output);
-  
+  void disconnect([destination_OR_output, int output, int input]) {
+    if (destination_OR_output == null && output == null && input == null) {
+      _blink.BlinkAudioNode.instance.disconnect_Callback_0_(unwrap_jso(this));
+      return;
+    }
+    if ((destination_OR_output is int) && output == null && input == null) {
+      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(unwrap_jso(this), unwrap_jso(destination_OR_output));
+      return;
+    }
+    if ((destination_OR_output is AudioNode) && output == null && input == null) {
+      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(unwrap_jso(this), unwrap_jso(destination_OR_output));
+      return;
+    }
+    if ((output is int) && (destination_OR_output is AudioNode) && input == null) {
+      _blink.BlinkAudioNode.instance.disconnect_Callback_2_(unwrap_jso(this), unwrap_jso(destination_OR_output), output);
+      return;
+    }
+    if ((input is int) && (output is int) && (destination_OR_output is AudioNode)) {
+      _blink.BlinkAudioNode.instance.disconnect_Callback_3_(unwrap_jso(this), unwrap_jso(destination_OR_output), output, input);
+      return;
+    }
+    if ((destination_OR_output is AudioParam) && output == null && input == null) {
+      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(unwrap_jso(this), unwrap_jso(destination_OR_output));
+      return;
+    }
+    if ((output is int) && (destination_OR_output is AudioParam) && input == null) {
+      _blink.BlinkAudioNode.instance.disconnect_Callback_2_(unwrap_jso(this), unwrap_jso(destination_OR_output), output);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) =>
       _connect(destination, output, input);
@@ -754,7 +830,7 @@
   
   @DomName('AudioParam.setValueCurveAtTime')
   @DocsEditable()
-  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.BlinkAudioParam.instance.setValueCurveAtTime_Callback_3_(unwrap_jso(this), values, time, duration);
+  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.BlinkAudioParam.instance.setValueCurveAtTime_Callback_3_(unwrap_jso(this), unwrap_jso(values), time, duration);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -879,7 +955,7 @@
   
   @DomName('BiquadFilterNode.getFrequencyResponse')
   @DocsEditable()
-  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.BlinkBiquadFilterNode.instance.getFrequencyResponse_Callback_3_(unwrap_jso(this), frequencyHz, magResponse, phaseResponse);
+  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.BlinkBiquadFilterNode.instance.getFrequencyResponse_Callback_3_(unwrap_jso(this), unwrap_jso(frequencyHz), unwrap_jso(magResponse), unwrap_jso(phaseResponse));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1260,6 +1336,11 @@
   OfflineAudioContext.internal_() : super.internal_();
 
 
+  @DomName('OfflineAudioContext.startRendering')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future startRendering() => wrap_jso(_blink.BlinkOfflineAudioContext.instance.startRendering_Callback_0_(unwrap_jso(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
@@ -1315,14 +1396,6 @@
   @DocsEditable()
   set type(String value) => _blink.BlinkOscillatorNode.instance.type_Setter_(unwrap_jso(this), value);
   
-  @DomName('OscillatorNode.noteOff')
-  @DocsEditable()
-  void noteOff(num when) => _blink.BlinkOscillatorNode.instance.noteOff_Callback_1_(unwrap_jso(this), when);
-  
-  @DomName('OscillatorNode.noteOn')
-  @DocsEditable()
-  void noteOn(num when) => _blink.BlinkOscillatorNode.instance.noteOn_Callback_1_(unwrap_jso(this), when);
-  
   @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1556,6 +1629,38 @@
 
 
 @DocsEditable()
+@DomName('StereoPannerNode')
+@Experimental() // untriaged
+class StereoPannerNode extends AudioNode {
+  // To suppress missing implicit constructor warnings.
+  factory StereoPannerNode._() { throw new UnsupportedError("Not supported"); }
+
+
+  @Deprecated("Internal Use Only")
+  static StereoPannerNode internalCreateStereoPannerNode() {
+    return new StereoPannerNode._internalWrap();
+  }
+
+  external factory StereoPannerNode._internalWrap();
+
+  @Deprecated("Internal Use Only")
+  StereoPannerNode.internal_() : super.internal_();
+
+
+  @DomName('StereoPannerNode.pan')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioParam get pan => wrap_jso(_blink.BlinkStereoPannerNode.instance.pan_Getter_(unwrap_jso(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('WaveShaperNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-WaveShaperNode
 @Experimental()
@@ -1577,7 +1682,7 @@
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  Float32List get curve => _blink.BlinkWaveShaperNode.instance.curve_Getter_(unwrap_jso(this));
+  Float32List get curve => wrap_jso(_blink.BlinkWaveShaperNode.instance.curve_Getter_(unwrap_jso(this)));
   
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 2ce52d4..37916f4 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -401,6 +401,71 @@
 
 
 @DocsEditable()
+@DomName('CHROMIUMSubscribeUniform')
+@Experimental() // untriaged
+@Native("CHROMIUMSubscribeUniform")
+class ChromiumSubscribeUniform extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ChromiumSubscribeUniform._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('CHROMIUMSubscribeUniform.MOUSE_POSITION_CHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MOUSE_POSITION_CHROMIUM = 0x924C;
+
+  @DomName('CHROMIUMSubscribeUniform.SUBSCRIBED_VALUES_BUFFER_CHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SUBSCRIBED_VALUES_BUFFER_CHROMIUM = 0x924B;
+
+  @JSName('bindValuebufferCHROMIUM')
+  @DomName('CHROMIUMSubscribeUniform.bindValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindValuebufferChromium(int target, ChromiumValuebuffer buffer) native;
+
+  @JSName('createValuebufferCHROMIUM')
+  @DomName('CHROMIUMSubscribeUniform.createValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ChromiumValuebuffer createValuebufferChromium() native;
+
+  @JSName('deleteValuebufferCHROMIUM')
+  @DomName('CHROMIUMSubscribeUniform.deleteValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteValuebufferChromium(ChromiumValuebuffer buffer) native;
+
+  @JSName('isValuebufferCHROMIUM')
+  @DomName('CHROMIUMSubscribeUniform.isValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isValuebufferChromium(ChromiumValuebuffer buffer) native;
+
+  @JSName('populateSubscribedValuesCHROMIUM')
+  @DomName('CHROMIUMSubscribeUniform.populateSubscribedValuesCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void populateSubscribedValuesChromium(int target) native;
+
+  @JSName('subscribeValueCHROMIUM')
+  @DomName('CHROMIUMSubscribeUniform.subscribeValueCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void subscribeValueChromium(int target, int subscriptions) native;
+
+  @JSName('uniformValuebufferCHROMIUM')
+  @DomName('CHROMIUMSubscribeUniform.uniformValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformValuebufferChromium(UniformLocation location, int target, int subscription) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGLCompressedTextureATC')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_atc/
 @Experimental()
@@ -505,70 +570,6 @@
 
 
 @DocsEditable()
-/**
- * The properties of a WebGL rendering context.
- *
- * If [alpha] is `true`, then the context has an alpha channel.
- *
- * If [antialias] is `true`, then antialiasing is performed by the browser, but
- * only if the browser's implementation of WebGL supports antialiasing.
- *
- * If [depth] is `true`, then the context has a depth buffer of at least 16
- * bits.
- *
- * If [premultipliedAlpha] is `true`, then the context's colors are assumed to
- * be premultiplied. This means that color values are assumed to have  been
- * multiplied by their alpha values. If [alpha] is `false`, then this flag is
- * ignored.
- *
- * If [preserveDrawingBuffer] is `false`, then all contents of the context are
- * cleared. If `true`, then all values will remain until changed or cleared.
- *
- * If [stencil] is `true`, then the context has a stencil buffer of at least 8
- * bits.
- */
-@DomName('WebGLContextAttributes')
-@Unstable()
-@Native("WebGLContextAttributes")
-class ContextAttributes extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory ContextAttributes._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('WebGLContextAttributes.alpha')
-  @DocsEditable()
-  bool alpha;
-
-  @DomName('WebGLContextAttributes.antialias')
-  @DocsEditable()
-  bool antialias;
-
-  @DomName('WebGLContextAttributes.depth')
-  @DocsEditable()
-  bool depth;
-
-  @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool failIfMajorPerformanceCaveat;
-
-  @DomName('WebGLContextAttributes.premultipliedAlpha')
-  @DocsEditable()
-  bool premultipliedAlpha;
-
-  @DomName('WebGLContextAttributes.preserveDrawingBuffer')
-  @DocsEditable()
-  bool preserveDrawingBuffer;
-
-  @DomName('WebGLContextAttributes.stencil')
-  @DocsEditable()
-  bool stencil;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('WebGLContextEvent')
 @Unstable()
 @Native("WebGLContextEvent")
@@ -576,6 +577,18 @@
   // To suppress missing implicit constructor warnings.
   factory ContextEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('WebGLContextEvent.WebGLContextEvent')
+  @DocsEditable()
+  factory ContextEvent(String type, [Map eventInit]) {
+    if (eventInit != null) {
+      var eventInit_1 = convertDartToNative_Dictionary(eventInit);
+      return ContextEvent._create_1(type, eventInit_1);
+    }
+    return ContextEvent._create_2(type);
+  }
+  static ContextEvent _create_1(type, eventInit) => JS('ContextEvent', 'new WebGLContextEvent(#,#)', type, eventInit);
+  static ContextEvent _create_2(type) => JS('ContextEvent', 'new WebGLContextEvent(#)', type);
+
   @DomName('WebGLContextEvent.statusMessage')
   @DocsEditable()
   final String statusMessage;
@@ -799,6 +812,39 @@
 
 
 @DocsEditable()
+@DomName('EXTsRGB')
+@Experimental() // untriaged
+@Native("EXTsRGB")
+class EXTsRgb extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory EXTsRgb._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('EXTsRGB.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210;
+
+  @DomName('EXTsRGB.SRGB8_ALPHA8_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRGB8_ALPHA8_EXT = 0x8C43;
+
+  @DomName('EXTsRGB.SRGB_ALPHA_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRGB_ALPHA_EXT = 0x8C42;
+
+  @DomName('EXTsRGB.SRGB_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRGB_EXT = 0x8C40;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('EXTBlendMinMax')
 @Experimental() // untriaged
 @Native("EXTBlendMinMax")
@@ -1013,22 +1059,22 @@
   @JSName('bindVertexArrayOES')
   @DomName('OESVertexArrayObject.bindVertexArrayOES')
   @DocsEditable()
-  void bindVertexArray(VertexArrayObject arrayObject) native;
+  void bindVertexArray(VertexArrayObjectOes arrayObject) native;
 
   @JSName('createVertexArrayOES')
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObject createVertexArray() native;
+  VertexArrayObjectOes createVertexArray() native;
 
   @JSName('deleteVertexArrayOES')
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
-  void deleteVertexArray(VertexArrayObject arrayObject) native;
+  void deleteVertexArray(VertexArrayObjectOes arrayObject) native;
 
   @JSName('isVertexArrayOES')
   @DomName('OESVertexArrayObject.isVertexArrayOES')
   @DocsEditable()
-  bool isVertexArray(VertexArrayObject arrayObject) native;
+  bool isVertexArray(VertexArrayObjectOes arrayObject) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1049,6 +1095,19 @@
 
 
 @DocsEditable()
+@DomName('WebGLQuery')
+@Experimental() // untriaged
+@Native("WebGLQuery")
+class Query extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Query._() { throw new UnsupportedError("Not supported"); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGLRenderbuffer')
 @Unstable()
 @Native("WebGLRenderbuffer")
@@ -2327,18 +2386,6 @@
   @DocsEditable()
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native;
 
-  @JSName('bufferData')
-  /**
-   * Buffers the specified data.
-   *
-   * The [bufferData] method is provided for WebGL API compatibility reasons, but
-   * it is highly recommended that you use [bufferDataTyped] or [bufferByteData]
-   * depending on your purposes.
-   */
-  @DomName('WebGLRenderingContext.bufferData')
-  @DocsEditable()
-  void bufferByteData(int target, ByteBuffer data, int usage) native;
-
   /**
    * Buffers the specified data.
    *
@@ -2350,30 +2397,6 @@
   @DocsEditable()
   void bufferData(int target, data_OR_size, int usage) native;
 
-  @JSName('bufferData')
-  /**
-   * Buffers the specified data.
-   *
-   * The [bufferData] method is provided for WebGL API compatibility reasons, but
-   * it is highly recommended that you use [bufferDataTyped] or [bufferByteData]
-   * depending on your purposes.
-   */
-  @DomName('WebGLRenderingContext.bufferData')
-  @DocsEditable()
-  void bufferDataTyped(int target, TypedData data, int usage) native;
-
-  @JSName('bufferSubData')
-  /**
-   * Buffers the specified subset of data.
-   *
-   * The [bufferSubData] method is provided for WebGL API compatibility reasons, but
-   * it is highly recommended that you use [bufferSubDataTyped] or [bufferSubByteData]
-   * depending on your purposes.
-   */
-  @DomName('WebGLRenderingContext.bufferSubData')
-  @DocsEditable()
-  void bufferSubByteData(int target, int offset, ByteBuffer data) native;
-
   /**
    * Buffers the specified subset of data.
    *
@@ -2385,18 +2408,6 @@
   @DocsEditable()
   void bufferSubData(int target, int offset, data) native;
 
-  @JSName('bufferSubData')
-  /**
-   * Buffers the specified subset of data.
-   *
-   * The [bufferSubData] method is provided for WebGL API compatibility reasons, but
-   * it is highly recommended that you use [bufferSubDataTyped] or [bufferSubByteData]
-   * depending on your purposes.
-   */
-  @DomName('WebGLRenderingContext.bufferSubData')
-  @DocsEditable()
-  void bufferSubDataTyped(int target, int offset, TypedData data) native;
-
   @DomName('WebGLRenderingContext.checkFramebufferStatus')
   @DocsEditable()
   int checkFramebufferStatus(int target) native;
@@ -2581,14 +2592,14 @@
 
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-  @Creates('ContextAttributes|=Object')
-  ContextAttributes getContextAttributes() {
-    return convertNativeToDart_ContextAttributes(_getContextAttributes_1());
+  @Creates('ContextAttributes|Null')
+  Map getContextAttributes() {
+    return convertNativeToDart_Dictionary(_getContextAttributes_1());
   }
   @JSName('getContextAttributes')
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-  @Creates('ContextAttributes|=Object')
+  @Creates('ContextAttributes|Null')
   _getContextAttributes_1() native;
 
   @DomName('WebGLRenderingContext.getError')
@@ -2866,73 +2877,6 @@
   @DocsEditable()
   void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native;
 
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) native;
-
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) native;
-
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) {
-    var pixels_1 = convertDartToNative_ImageData(pixels);
-    _texImage2DImageData_1(target, level, internalformat, format, type, pixels_1);
-    return;
-  }
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void _texImage2DImageData_1(target, level, internalformat, format, type, pixels) native;
-
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) native;
-
   @DomName('WebGLRenderingContext.texParameterf')
   @DocsEditable()
   void texParameterf(int target, int pname, num param) native;
@@ -3036,80 +2980,13 @@
   @DocsEditable()
   void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, VideoElement video) native;
 
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) native;
-
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) native;
-
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) {
-    var pixels_1 = convertDartToNative_ImageData(pixels);
-    _texSubImage2DImageData_1(target, level, xoffset, yoffset, format, type, pixels_1);
-    return;
-  }
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void _texSubImage2DImageData_1(target, level, xoffset, yoffset, format, type, pixels) native;
-
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) native;
-
   @DomName('WebGLRenderingContext.uniform1f')
   @DocsEditable()
   void uniform1f(UniformLocation location, num x) native;
 
   @DomName('WebGLRenderingContext.uniform1fv')
   @DocsEditable()
-  void uniform1fv(UniformLocation location, Float32List v) native;
+  void uniform1fv(UniformLocation location, v) native;
 
   @DomName('WebGLRenderingContext.uniform1i')
   @DocsEditable()
@@ -3117,7 +2994,7 @@
 
   @DomName('WebGLRenderingContext.uniform1iv')
   @DocsEditable()
-  void uniform1iv(UniformLocation location, Int32List v) native;
+  void uniform1iv(UniformLocation location, v) native;
 
   @DomName('WebGLRenderingContext.uniform2f')
   @DocsEditable()
@@ -3125,7 +3002,7 @@
 
   @DomName('WebGLRenderingContext.uniform2fv')
   @DocsEditable()
-  void uniform2fv(UniformLocation location, Float32List v) native;
+  void uniform2fv(UniformLocation location, v) native;
 
   @DomName('WebGLRenderingContext.uniform2i')
   @DocsEditable()
@@ -3133,7 +3010,7 @@
 
   @DomName('WebGLRenderingContext.uniform2iv')
   @DocsEditable()
-  void uniform2iv(UniformLocation location, Int32List v) native;
+  void uniform2iv(UniformLocation location, v) native;
 
   @DomName('WebGLRenderingContext.uniform3f')
   @DocsEditable()
@@ -3141,7 +3018,7 @@
 
   @DomName('WebGLRenderingContext.uniform3fv')
   @DocsEditable()
-  void uniform3fv(UniformLocation location, Float32List v) native;
+  void uniform3fv(UniformLocation location, v) native;
 
   @DomName('WebGLRenderingContext.uniform3i')
   @DocsEditable()
@@ -3149,7 +3026,7 @@
 
   @DomName('WebGLRenderingContext.uniform3iv')
   @DocsEditable()
-  void uniform3iv(UniformLocation location, Int32List v) native;
+  void uniform3iv(UniformLocation location, v) native;
 
   @DomName('WebGLRenderingContext.uniform4f')
   @DocsEditable()
@@ -3157,7 +3034,7 @@
 
   @DomName('WebGLRenderingContext.uniform4fv')
   @DocsEditable()
-  void uniform4fv(UniformLocation location, Float32List v) native;
+  void uniform4fv(UniformLocation location, v) native;
 
   @DomName('WebGLRenderingContext.uniform4i')
   @DocsEditable()
@@ -3165,19 +3042,19 @@
 
   @DomName('WebGLRenderingContext.uniform4iv')
   @DocsEditable()
-  void uniform4iv(UniformLocation location, Int32List v) native;
+  void uniform4iv(UniformLocation location, v) native;
 
   @DomName('WebGLRenderingContext.uniformMatrix2fv')
   @DocsEditable()
-  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) native;
+  void uniformMatrix2fv(UniformLocation location, bool transpose, array) native;
 
   @DomName('WebGLRenderingContext.uniformMatrix3fv')
   @DocsEditable()
-  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) native;
+  void uniformMatrix3fv(UniformLocation location, bool transpose, array) native;
 
   @DomName('WebGLRenderingContext.uniformMatrix4fv')
   @DocsEditable()
-  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) native;
+  void uniformMatrix4fv(UniformLocation location, bool transpose, array) native;
 
   @DomName('WebGLRenderingContext.useProgram')
   @DocsEditable()
@@ -3193,7 +3070,7 @@
 
   @DomName('WebGLRenderingContext.vertexAttrib1fv')
   @DocsEditable()
-  void vertexAttrib1fv(int indx, Float32List values) native;
+  void vertexAttrib1fv(int indx, values) native;
 
   @DomName('WebGLRenderingContext.vertexAttrib2f')
   @DocsEditable()
@@ -3201,7 +3078,7 @@
 
   @DomName('WebGLRenderingContext.vertexAttrib2fv')
   @DocsEditable()
-  void vertexAttrib2fv(int indx, Float32List values) native;
+  void vertexAttrib2fv(int indx, values) native;
 
   @DomName('WebGLRenderingContext.vertexAttrib3f')
   @DocsEditable()
@@ -3209,7 +3086,7 @@
 
   @DomName('WebGLRenderingContext.vertexAttrib3fv')
   @DocsEditable()
-  void vertexAttrib3fv(int indx, Float32List values) native;
+  void vertexAttrib3fv(int indx, values) native;
 
   @DomName('WebGLRenderingContext.vertexAttrib4f')
   @DocsEditable()
@@ -3217,7 +3094,7 @@
 
   @DomName('WebGLRenderingContext.vertexAttrib4fv')
   @DocsEditable()
-  void vertexAttrib4fv(int indx, Float32List values) native;
+  void vertexAttrib4fv(int indx, values) native;
 
   @DomName('WebGLRenderingContext.vertexAttribPointer')
   @DocsEditable()
@@ -3276,6 +3153,2824 @@
 
 
 @DocsEditable()
+@DomName('WebGL2RenderingContext')
+@Experimental() // untriaged
+@Native("WebGL2RenderingContext")
+class RenderingContext2 extends Interceptor implements _WebGL2RenderingContextBase, _WebGLRenderingContextBase {
+  // To suppress missing implicit constructor warnings.
+  factory RenderingContext2._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WebGL2RenderingContext.ACTIVE_ATTRIBUTES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_ATTRIBUTES = 0x8B89;
+
+  @DomName('WebGL2RenderingContext.ACTIVE_TEXTURE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_TEXTURE = 0x84E0;
+
+  @DomName('WebGL2RenderingContext.ACTIVE_UNIFORMS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_UNIFORMS = 0x8B86;
+
+  @DomName('WebGL2RenderingContext.ALIASED_LINE_WIDTH_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
+
+  @DomName('WebGL2RenderingContext.ALIASED_POINT_SIZE_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
+
+  @DomName('WebGL2RenderingContext.ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALPHA = 0x1906;
+
+  @DomName('WebGL2RenderingContext.ALPHA_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALPHA_BITS = 0x0D55;
+
+  @DomName('WebGL2RenderingContext.ALWAYS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALWAYS = 0x0207;
+
+  @DomName('WebGL2RenderingContext.ARRAY_BUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ARRAY_BUFFER = 0x8892;
+
+  @DomName('WebGL2RenderingContext.ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ARRAY_BUFFER_BINDING = 0x8894;
+
+  @DomName('WebGL2RenderingContext.ATTACHED_SHADERS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ATTACHED_SHADERS = 0x8B85;
+
+  @DomName('WebGL2RenderingContext.BACK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BACK = 0x0405;
+
+  @DomName('WebGL2RenderingContext.BLEND')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND = 0x0BE2;
+
+  @DomName('WebGL2RenderingContext.BLEND_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_COLOR = 0x8005;
+
+  @DomName('WebGL2RenderingContext.BLEND_DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_DST_ALPHA = 0x80CA;
+
+  @DomName('WebGL2RenderingContext.BLEND_DST_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_DST_RGB = 0x80C8;
+
+  @DomName('WebGL2RenderingContext.BLEND_EQUATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION = 0x8009;
+
+  @DomName('WebGL2RenderingContext.BLEND_EQUATION_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION_ALPHA = 0x883D;
+
+  @DomName('WebGL2RenderingContext.BLEND_EQUATION_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION_RGB = 0x8009;
+
+  @DomName('WebGL2RenderingContext.BLEND_SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_SRC_ALPHA = 0x80CB;
+
+  @DomName('WebGL2RenderingContext.BLEND_SRC_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_SRC_RGB = 0x80C9;
+
+  @DomName('WebGL2RenderingContext.BLUE_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLUE_BITS = 0x0D54;
+
+  @DomName('WebGL2RenderingContext.BOOL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL = 0x8B56;
+
+  @DomName('WebGL2RenderingContext.BOOL_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC2 = 0x8B57;
+
+  @DomName('WebGL2RenderingContext.BOOL_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC3 = 0x8B58;
+
+  @DomName('WebGL2RenderingContext.BOOL_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC4 = 0x8B59;
+
+  @DomName('WebGL2RenderingContext.BROWSER_DEFAULT_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
+
+  @DomName('WebGL2RenderingContext.BUFFER_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BUFFER_SIZE = 0x8764;
+
+  @DomName('WebGL2RenderingContext.BUFFER_USAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BUFFER_USAGE = 0x8765;
+
+  @DomName('WebGL2RenderingContext.BYTE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BYTE = 0x1400;
+
+  @DomName('WebGL2RenderingContext.CCW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CCW = 0x0901;
+
+  @DomName('WebGL2RenderingContext.CLAMP_TO_EDGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CLAMP_TO_EDGE = 0x812F;
+
+  @DomName('WebGL2RenderingContext.COLOR_ATTACHMENT0')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_ATTACHMENT0 = 0x8CE0;
+
+  @DomName('WebGL2RenderingContext.COLOR_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_BUFFER_BIT = 0x00004000;
+
+  @DomName('WebGL2RenderingContext.COLOR_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_CLEAR_VALUE = 0x0C22;
+
+  @DomName('WebGL2RenderingContext.COLOR_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_WRITEMASK = 0x0C23;
+
+  @DomName('WebGL2RenderingContext.COMPILE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPILE_STATUS = 0x8B81;
+
+  @DomName('WebGL2RenderingContext.COMPRESSED_TEXTURE_FORMATS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
+
+  @DomName('WebGL2RenderingContext.CONSTANT_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONSTANT_ALPHA = 0x8003;
+
+  @DomName('WebGL2RenderingContext.CONSTANT_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONSTANT_COLOR = 0x8001;
+
+  @DomName('WebGL2RenderingContext.CONTEXT_LOST_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONTEXT_LOST_WEBGL = 0x9242;
+
+  @DomName('WebGL2RenderingContext.CULL_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CULL_FACE = 0x0B44;
+
+  @DomName('WebGL2RenderingContext.CULL_FACE_MODE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CULL_FACE_MODE = 0x0B45;
+
+  @DomName('WebGL2RenderingContext.CURRENT_PROGRAM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CURRENT_PROGRAM = 0x8B8D;
+
+  @DomName('WebGL2RenderingContext.CURRENT_VERTEX_ATTRIB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
+
+  @DomName('WebGL2RenderingContext.CW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CW = 0x0900;
+
+  @DomName('WebGL2RenderingContext.DECR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DECR = 0x1E03;
+
+  @DomName('WebGL2RenderingContext.DECR_WRAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DECR_WRAP = 0x8508;
+
+  @DomName('WebGL2RenderingContext.DELETE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DELETE_STATUS = 0x8B80;
+
+  @DomName('WebGL2RenderingContext.DEPTH_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_ATTACHMENT = 0x8D00;
+
+  @DomName('WebGL2RenderingContext.DEPTH_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_BITS = 0x0D56;
+
+  @DomName('WebGL2RenderingContext.DEPTH_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_BUFFER_BIT = 0x00000100;
+
+  @DomName('WebGL2RenderingContext.DEPTH_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_CLEAR_VALUE = 0x0B73;
+
+  @DomName('WebGL2RenderingContext.DEPTH_COMPONENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_COMPONENT = 0x1902;
+
+  @DomName('WebGL2RenderingContext.DEPTH_COMPONENT16')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_COMPONENT16 = 0x81A5;
+
+  @DomName('WebGL2RenderingContext.DEPTH_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_FUNC = 0x0B74;
+
+  @DomName('WebGL2RenderingContext.DEPTH_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_RANGE = 0x0B70;
+
+  @DomName('WebGL2RenderingContext.DEPTH_STENCIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_STENCIL = 0x84F9;
+
+  @DomName('WebGL2RenderingContext.DEPTH_STENCIL_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
+
+  @DomName('WebGL2RenderingContext.DEPTH_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_TEST = 0x0B71;
+
+  @DomName('WebGL2RenderingContext.DEPTH_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_WRITEMASK = 0x0B72;
+
+  @DomName('WebGL2RenderingContext.DITHER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DITHER = 0x0BD0;
+
+  @DomName('WebGL2RenderingContext.DONT_CARE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DONT_CARE = 0x1100;
+
+  @DomName('WebGL2RenderingContext.DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DST_ALPHA = 0x0304;
+
+  @DomName('WebGL2RenderingContext.DST_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DST_COLOR = 0x0306;
+
+  @DomName('WebGL2RenderingContext.DYNAMIC_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DYNAMIC_DRAW = 0x88E8;
+
+  @DomName('WebGL2RenderingContext.ELEMENT_ARRAY_BUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
+
+  @DomName('WebGL2RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
+
+  @DomName('WebGL2RenderingContext.EQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int EQUAL = 0x0202;
+
+  @DomName('WebGL2RenderingContext.FASTEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FASTEST = 0x1101;
+
+  @DomName('WebGL2RenderingContext.FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT = 0x1406;
+
+  @DomName('WebGL2RenderingContext.FLOAT_MAT2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT2 = 0x8B5A;
+
+  @DomName('WebGL2RenderingContext.FLOAT_MAT3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT3 = 0x8B5B;
+
+  @DomName('WebGL2RenderingContext.FLOAT_MAT4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT4 = 0x8B5C;
+
+  @DomName('WebGL2RenderingContext.FLOAT_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC2 = 0x8B50;
+
+  @DomName('WebGL2RenderingContext.FLOAT_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC3 = 0x8B51;
+
+  @DomName('WebGL2RenderingContext.FLOAT_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC4 = 0x8B52;
+
+  @DomName('WebGL2RenderingContext.FRAGMENT_SHADER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAGMENT_SHADER = 0x8B30;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER = 0x8D40;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_BINDING = 0x8CA6;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_COMPLETE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_UNSUPPORTED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
+
+  @DomName('WebGL2RenderingContext.FRONT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT = 0x0404;
+
+  @DomName('WebGL2RenderingContext.FRONT_AND_BACK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT_AND_BACK = 0x0408;
+
+  @DomName('WebGL2RenderingContext.FRONT_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT_FACE = 0x0B46;
+
+  @DomName('WebGL2RenderingContext.FUNC_ADD')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_ADD = 0x8006;
+
+  @DomName('WebGL2RenderingContext.FUNC_REVERSE_SUBTRACT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
+
+  @DomName('WebGL2RenderingContext.FUNC_SUBTRACT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_SUBTRACT = 0x800A;
+
+  @DomName('WebGL2RenderingContext.GENERATE_MIPMAP_HINT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GENERATE_MIPMAP_HINT = 0x8192;
+
+  @DomName('WebGL2RenderingContext.GEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GEQUAL = 0x0206;
+
+  @DomName('WebGL2RenderingContext.GREATER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GREATER = 0x0204;
+
+  @DomName('WebGL2RenderingContext.GREEN_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GREEN_BITS = 0x0D53;
+
+  @DomName('WebGL2RenderingContext.HIGH_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int HIGH_FLOAT = 0x8DF2;
+
+  @DomName('WebGL2RenderingContext.HIGH_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int HIGH_INT = 0x8DF5;
+
+  @DomName('WebGL2RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
+
+  @DomName('WebGL2RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
+
+  @DomName('WebGL2RenderingContext.INCR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INCR = 0x1E02;
+
+  @DomName('WebGL2RenderingContext.INCR_WRAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INCR_WRAP = 0x8507;
+
+  @DomName('WebGL2RenderingContext.INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT = 0x1404;
+
+  @DomName('WebGL2RenderingContext.INT_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC2 = 0x8B53;
+
+  @DomName('WebGL2RenderingContext.INT_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC3 = 0x8B54;
+
+  @DomName('WebGL2RenderingContext.INT_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC4 = 0x8B55;
+
+  @DomName('WebGL2RenderingContext.INVALID_ENUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_ENUM = 0x0500;
+
+  @DomName('WebGL2RenderingContext.INVALID_FRAMEBUFFER_OPERATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
+
+  @DomName('WebGL2RenderingContext.INVALID_OPERATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_OPERATION = 0x0502;
+
+  @DomName('WebGL2RenderingContext.INVALID_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_VALUE = 0x0501;
+
+  @DomName('WebGL2RenderingContext.INVERT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVERT = 0x150A;
+
+  @DomName('WebGL2RenderingContext.KEEP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int KEEP = 0x1E00;
+
+  @DomName('WebGL2RenderingContext.LEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LEQUAL = 0x0203;
+
+  @DomName('WebGL2RenderingContext.LESS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LESS = 0x0201;
+
+  @DomName('WebGL2RenderingContext.LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR = 0x2601;
+
+  @DomName('WebGL2RenderingContext.LINEAR_MIPMAP_LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
+
+  @DomName('WebGL2RenderingContext.LINEAR_MIPMAP_NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
+
+  @DomName('WebGL2RenderingContext.LINES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINES = 0x0001;
+
+  @DomName('WebGL2RenderingContext.LINE_LOOP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_LOOP = 0x0002;
+
+  @DomName('WebGL2RenderingContext.LINE_STRIP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_STRIP = 0x0003;
+
+  @DomName('WebGL2RenderingContext.LINE_WIDTH')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_WIDTH = 0x0B21;
+
+  @DomName('WebGL2RenderingContext.LINK_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINK_STATUS = 0x8B82;
+
+  @DomName('WebGL2RenderingContext.LOW_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LOW_FLOAT = 0x8DF0;
+
+  @DomName('WebGL2RenderingContext.LOW_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LOW_INT = 0x8DF3;
+
+  @DomName('WebGL2RenderingContext.LUMINANCE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LUMINANCE = 0x1909;
+
+  @DomName('WebGL2RenderingContext.LUMINANCE_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LUMINANCE_ALPHA = 0x190A;
+
+  @DomName('WebGL2RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+
+  @DomName('WebGL2RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
+
+  @DomName('WebGL2RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
+
+  @DomName('WebGL2RenderingContext.MAX_RENDERBUFFER_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
+
+  @DomName('WebGL2RenderingContext.MAX_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
+
+  @DomName('WebGL2RenderingContext.MAX_TEXTURE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_TEXTURE_SIZE = 0x0D33;
+
+  @DomName('WebGL2RenderingContext.MAX_VARYING_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VARYING_VECTORS = 0x8DFC;
+
+  @DomName('WebGL2RenderingContext.MAX_VERTEX_ATTRIBS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_ATTRIBS = 0x8869;
+
+  @DomName('WebGL2RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
+
+  @DomName('WebGL2RenderingContext.MAX_VERTEX_UNIFORM_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
+
+  @DomName('WebGL2RenderingContext.MAX_VIEWPORT_DIMS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
+
+  @DomName('WebGL2RenderingContext.MEDIUM_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MEDIUM_FLOAT = 0x8DF1;
+
+  @DomName('WebGL2RenderingContext.MEDIUM_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MEDIUM_INT = 0x8DF4;
+
+  @DomName('WebGL2RenderingContext.MIRRORED_REPEAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MIRRORED_REPEAT = 0x8370;
+
+  @DomName('WebGL2RenderingContext.NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST = 0x2600;
+
+  @DomName('WebGL2RenderingContext.NEAREST_MIPMAP_LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
+
+  @DomName('WebGL2RenderingContext.NEAREST_MIPMAP_NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
+
+  @DomName('WebGL2RenderingContext.NEVER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEVER = 0x0200;
+
+  @DomName('WebGL2RenderingContext.NICEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NICEST = 0x1102;
+
+  @DomName('WebGL2RenderingContext.NONE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NONE = 0;
+
+  @DomName('WebGL2RenderingContext.NOTEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NOTEQUAL = 0x0205;
+
+  @DomName('WebGL2RenderingContext.NO_ERROR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NO_ERROR = 0;
+
+  @DomName('WebGL2RenderingContext.ONE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE = 1;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_CONSTANT_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_CONSTANT_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_DST_ALPHA = 0x0305;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_DST_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_DST_COLOR = 0x0307;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_SRC_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_SRC_COLOR = 0x0301;
+
+  @DomName('WebGL2RenderingContext.OUT_OF_MEMORY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int OUT_OF_MEMORY = 0x0505;
+
+  @DomName('WebGL2RenderingContext.PACK_ALIGNMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int PACK_ALIGNMENT = 0x0D05;
+
+  @DomName('WebGL2RenderingContext.POINTS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POINTS = 0x0000;
+
+  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_FACTOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_FACTOR = 0x8038;
+
+  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_FILL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_FILL = 0x8037;
+
+  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_UNITS = 0x2A00;
+
+  @DomName('WebGL2RenderingContext.RED_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RED_BITS = 0x0D52;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER = 0x8D41;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_ALPHA_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_BINDING = 0x8CA7;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_BLUE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_DEPTH_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_GREEN_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_HEIGHT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_HEIGHT = 0x8D43;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_INTERNAL_FORMAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_RED_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_STENCIL_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_WIDTH')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_WIDTH = 0x8D42;
+
+  @DomName('WebGL2RenderingContext.RENDERER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERER = 0x1F01;
+
+  @DomName('WebGL2RenderingContext.REPEAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int REPEAT = 0x2901;
+
+  @DomName('WebGL2RenderingContext.REPLACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int REPLACE = 0x1E01;
+
+  @DomName('WebGL2RenderingContext.RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB = 0x1907;
+
+  @DomName('WebGL2RenderingContext.RGB565')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB565 = 0x8D62;
+
+  @DomName('WebGL2RenderingContext.RGB5_A1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB5_A1 = 0x8057;
+
+  @DomName('WebGL2RenderingContext.RGBA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGBA = 0x1908;
+
+  @DomName('WebGL2RenderingContext.RGBA4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGBA4 = 0x8056;
+
+  @DomName('WebGL2RenderingContext.SAMPLER_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLER_2D = 0x8B5E;
+
+  @DomName('WebGL2RenderingContext.SAMPLER_CUBE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLER_CUBE = 0x8B60;
+
+  @DomName('WebGL2RenderingContext.SAMPLES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLES = 0x80A9;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_ALPHA_TO_COVERAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_BUFFERS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_BUFFERS = 0x80A8;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE = 0x80A0;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE_INVERT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
+
+  @DomName('WebGL2RenderingContext.SCISSOR_BOX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SCISSOR_BOX = 0x0C10;
+
+  @DomName('WebGL2RenderingContext.SCISSOR_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SCISSOR_TEST = 0x0C11;
+
+  @DomName('WebGL2RenderingContext.SHADER_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHADER_TYPE = 0x8B4F;
+
+  @DomName('WebGL2RenderingContext.SHADING_LANGUAGE_VERSION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
+
+  @DomName('WebGL2RenderingContext.SHORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHORT = 0x1402;
+
+  @DomName('WebGL2RenderingContext.SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_ALPHA = 0x0302;
+
+  @DomName('WebGL2RenderingContext.SRC_ALPHA_SATURATE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_ALPHA_SATURATE = 0x0308;
+
+  @DomName('WebGL2RenderingContext.SRC_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_COLOR = 0x0300;
+
+  @DomName('WebGL2RenderingContext.STATIC_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STATIC_DRAW = 0x88E4;
+
+  @DomName('WebGL2RenderingContext.STENCIL_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_ATTACHMENT = 0x8D20;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_FAIL = 0x8801;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_FUNC = 0x8800;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_REF')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_REF = 0x8CA3;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_VALUE_MASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BITS = 0x0D57;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BUFFER_BIT = 0x00000400;
+
+  @DomName('WebGL2RenderingContext.STENCIL_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_CLEAR_VALUE = 0x0B91;
+
+  @DomName('WebGL2RenderingContext.STENCIL_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_FAIL = 0x0B94;
+
+  @DomName('WebGL2RenderingContext.STENCIL_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_FUNC = 0x0B92;
+
+  @DomName('WebGL2RenderingContext.STENCIL_INDEX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_INDEX = 0x1901;
+
+  @DomName('WebGL2RenderingContext.STENCIL_INDEX8')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_INDEX8 = 0x8D48;
+
+  @DomName('WebGL2RenderingContext.STENCIL_PASS_DEPTH_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
+
+  @DomName('WebGL2RenderingContext.STENCIL_PASS_DEPTH_PASS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
+
+  @DomName('WebGL2RenderingContext.STENCIL_REF')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_REF = 0x0B97;
+
+  @DomName('WebGL2RenderingContext.STENCIL_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_TEST = 0x0B90;
+
+  @DomName('WebGL2RenderingContext.STENCIL_VALUE_MASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_VALUE_MASK = 0x0B93;
+
+  @DomName('WebGL2RenderingContext.STENCIL_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_WRITEMASK = 0x0B98;
+
+  @DomName('WebGL2RenderingContext.STREAM_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STREAM_DRAW = 0x88E0;
+
+  @DomName('WebGL2RenderingContext.SUBPIXEL_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SUBPIXEL_BITS = 0x0D50;
+
+  @DomName('WebGL2RenderingContext.TEXTURE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE = 0x1702;
+
+  @DomName('WebGL2RenderingContext.TEXTURE0')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE0 = 0x84C0;
+
+  @DomName('WebGL2RenderingContext.TEXTURE1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE1 = 0x84C1;
+
+  @DomName('WebGL2RenderingContext.TEXTURE10')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE10 = 0x84CA;
+
+  @DomName('WebGL2RenderingContext.TEXTURE11')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE11 = 0x84CB;
+
+  @DomName('WebGL2RenderingContext.TEXTURE12')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE12 = 0x84CC;
+
+  @DomName('WebGL2RenderingContext.TEXTURE13')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE13 = 0x84CD;
+
+  @DomName('WebGL2RenderingContext.TEXTURE14')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE14 = 0x84CE;
+
+  @DomName('WebGL2RenderingContext.TEXTURE15')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE15 = 0x84CF;
+
+  @DomName('WebGL2RenderingContext.TEXTURE16')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE16 = 0x84D0;
+
+  @DomName('WebGL2RenderingContext.TEXTURE17')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE17 = 0x84D1;
+
+  @DomName('WebGL2RenderingContext.TEXTURE18')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE18 = 0x84D2;
+
+  @DomName('WebGL2RenderingContext.TEXTURE19')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE19 = 0x84D3;
+
+  @DomName('WebGL2RenderingContext.TEXTURE2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE2 = 0x84C2;
+
+  @DomName('WebGL2RenderingContext.TEXTURE20')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE20 = 0x84D4;
+
+  @DomName('WebGL2RenderingContext.TEXTURE21')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE21 = 0x84D5;
+
+  @DomName('WebGL2RenderingContext.TEXTURE22')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE22 = 0x84D6;
+
+  @DomName('WebGL2RenderingContext.TEXTURE23')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE23 = 0x84D7;
+
+  @DomName('WebGL2RenderingContext.TEXTURE24')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE24 = 0x84D8;
+
+  @DomName('WebGL2RenderingContext.TEXTURE25')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE25 = 0x84D9;
+
+  @DomName('WebGL2RenderingContext.TEXTURE26')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE26 = 0x84DA;
+
+  @DomName('WebGL2RenderingContext.TEXTURE27')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE27 = 0x84DB;
+
+  @DomName('WebGL2RenderingContext.TEXTURE28')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE28 = 0x84DC;
+
+  @DomName('WebGL2RenderingContext.TEXTURE29')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE29 = 0x84DD;
+
+  @DomName('WebGL2RenderingContext.TEXTURE3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE3 = 0x84C3;
+
+  @DomName('WebGL2RenderingContext.TEXTURE30')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE30 = 0x84DE;
+
+  @DomName('WebGL2RenderingContext.TEXTURE31')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE31 = 0x84DF;
+
+  @DomName('WebGL2RenderingContext.TEXTURE4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE4 = 0x84C4;
+
+  @DomName('WebGL2RenderingContext.TEXTURE5')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE5 = 0x84C5;
+
+  @DomName('WebGL2RenderingContext.TEXTURE6')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE6 = 0x84C6;
+
+  @DomName('WebGL2RenderingContext.TEXTURE7')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE7 = 0x84C7;
+
+  @DomName('WebGL2RenderingContext.TEXTURE8')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE8 = 0x84C8;
+
+  @DomName('WebGL2RenderingContext.TEXTURE9')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE9 = 0x84C9;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_2D = 0x0DE1;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_BINDING_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_BINDING_2D = 0x8069;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_BINDING_CUBE_MAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP = 0x8513;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_MAG_FILTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_MAG_FILTER = 0x2800;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_MIN_FILTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_MIN_FILTER = 0x2801;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_WRAP_S')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_WRAP_S = 0x2802;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_WRAP_T')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_WRAP_T = 0x2803;
+
+  @DomName('WebGL2RenderingContext.TRIANGLES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLES = 0x0004;
+
+  @DomName('WebGL2RenderingContext.TRIANGLE_FAN')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLE_FAN = 0x0006;
+
+  @DomName('WebGL2RenderingContext.TRIANGLE_STRIP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLE_STRIP = 0x0005;
+
+  @DomName('WebGL2RenderingContext.UNPACK_ALIGNMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_ALIGNMENT = 0x0CF5;
+
+  @DomName('WebGL2RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+
+  @DomName('WebGL2RenderingContext.UNPACK_FLIP_Y_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
+
+  @DomName('WebGL2RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_BYTE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_BYTE = 0x1401;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_INT = 0x1405;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT = 0x1403;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_4_4_4_4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_5_5_5_1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_5_6_5')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
+
+  @DomName('WebGL2RenderingContext.VALIDATE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VALIDATE_STATUS = 0x8B83;
+
+  @DomName('WebGL2RenderingContext.VENDOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VENDOR = 0x1F00;
+
+  @DomName('WebGL2RenderingContext.VERSION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERSION = 0x1F02;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
+
+  @DomName('WebGL2RenderingContext.VERTEX_SHADER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_SHADER = 0x8B31;
+
+  @DomName('WebGL2RenderingContext.VIEWPORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VIEWPORT = 0x0BA2;
+
+  @DomName('WebGL2RenderingContext.ZERO')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ZERO = 0;
+
+  // From WebGL2RenderingContextBase
+
+  @DomName('WebGL2RenderingContext.beginQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void beginQuery(int target, Query query) native;
+
+  @DomName('WebGL2RenderingContext.beginTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void beginTransformFeedback(int primitiveMode) native;
+
+  @DomName('WebGL2RenderingContext.bindBufferBase')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindBufferBase(int target, int index, Buffer buffer) native;
+
+  @DomName('WebGL2RenderingContext.bindBufferRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindBufferRange(int target, int index, Buffer buffer, int offset, int size) native;
+
+  @DomName('WebGL2RenderingContext.bindSampler')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindSampler(int unit, Sampler sampler) native;
+
+  @DomName('WebGL2RenderingContext.bindTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindTransformFeedback(int target, TransformFeedback feedback) native;
+
+  @DomName('WebGL2RenderingContext.bindVertexArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindVertexArray(VertexArrayObject vertexArray) native;
+
+  @DomName('WebGL2RenderingContext.blitFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) native;
+
+  @DomName('WebGL2RenderingContext.clearBufferfi')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearBufferfi(int buffer, int drawbuffer, num depth, int stencil) native;
+
+  @DomName('WebGL2RenderingContext.clearBufferfv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearBufferfv(int buffer, int drawbuffer, value) native;
+
+  @DomName('WebGL2RenderingContext.clearBufferiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearBufferiv(int buffer, int drawbuffer, value) native;
+
+  @DomName('WebGL2RenderingContext.clearBufferuiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearBufferuiv(int buffer, int drawbuffer, value) native;
+
+  @DomName('WebGL2RenderingContext.clientWaitSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int clientWaitSync(Sync sync, int flags, int timeout) native;
+
+  @DomName('WebGL2RenderingContext.compressedTexImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, TypedData data) native;
+
+  @DomName('WebGL2RenderingContext.compressedTexSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, TypedData data) native;
+
+  @DomName('WebGL2RenderingContext.copyBufferSubData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyBufferSubData(int readTarget, int writeTarget, int readOffset, int writeOffset, int size) native;
+
+  @DomName('WebGL2RenderingContext.copyTexSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) native;
+
+  @DomName('WebGL2RenderingContext.createQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Query createQuery() native;
+
+  @DomName('WebGL2RenderingContext.createSampler')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Sampler createSampler() native;
+
+  @DomName('WebGL2RenderingContext.createTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  TransformFeedback createTransformFeedback() native;
+
+  @DomName('WebGL2RenderingContext.createVertexArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VertexArrayObject createVertexArray() native;
+
+  @DomName('WebGL2RenderingContext.deleteQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteQuery(Query query) native;
+
+  @DomName('WebGL2RenderingContext.deleteSampler')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteSampler(Sampler sampler) native;
+
+  @DomName('WebGL2RenderingContext.deleteSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteSync(Sync sync) native;
+
+  @DomName('WebGL2RenderingContext.deleteTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteTransformFeedback(TransformFeedback feedback) native;
+
+  @DomName('WebGL2RenderingContext.deleteVertexArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteVertexArray(VertexArrayObject vertexArray) native;
+
+  @DomName('WebGL2RenderingContext.drawArraysInstanced')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawArraysInstanced(int mode, int first, int count, int instanceCount) native;
+
+  @DomName('WebGL2RenderingContext.drawBuffers')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawBuffers(List<int> buffers) native;
+
+  @DomName('WebGL2RenderingContext.drawElementsInstanced')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawElementsInstanced(int mode, int count, int type, int offset, int instanceCount) native;
+
+  @DomName('WebGL2RenderingContext.drawRangeElements')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawRangeElements(int mode, int start, int end, int count, int type, int offset) native;
+
+  @DomName('WebGL2RenderingContext.endQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void endQuery(int target) native;
+
+  @DomName('WebGL2RenderingContext.endTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void endTransformFeedback() native;
+
+  @DomName('WebGL2RenderingContext.fenceSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Sync fenceSync(int condition, int flags) native;
+
+  @DomName('WebGL2RenderingContext.framebufferTextureLayer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void framebufferTextureLayer(int target, int attachment, Texture texture, int level, int layer) native;
+
+  @DomName('WebGL2RenderingContext.getActiveUniformBlockName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getActiveUniformBlockName(Program program, int uniformBlockIndex) native;
+
+  @DomName('WebGL2RenderingContext.getActiveUniformBlockParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getActiveUniformBlockParameter(Program program, int uniformBlockIndex, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getActiveUniforms')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<int> getActiveUniforms(Program program, List<int> uniformIndices, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getBufferSubData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getBufferSubData(int target, int offset, ByteBuffer returnedData) native;
+
+  @DomName('WebGL2RenderingContext.getFragDataLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getFragDataLocation(Program program, String name) native;
+
+  @DomName('WebGL2RenderingContext.getIndexedParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getIndexedParameter(int target, int index) native;
+
+  @DomName('WebGL2RenderingContext.getInternalformatParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getInternalformatParameter(int target, int internalformat, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Query getQuery(int target, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getQueryParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getQueryParameter(Query query, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getSamplerParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getSamplerParameter(Sampler sampler, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getSyncParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getSyncParameter(Sync sync, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getTransformFeedbackVarying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ActiveInfo getTransformFeedbackVarying(Program program, int index) native;
+
+  @DomName('WebGL2RenderingContext.getUniformBlockIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getUniformBlockIndex(Program program, String uniformBlockName) native;
+
+  @DomName('WebGL2RenderingContext.getUniformIndices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<int> getUniformIndices(Program program, List<String> uniformNames) {
+    List uniformNames_1 = convertDartToNative_StringArray(uniformNames);
+    return _getUniformIndices_1(program, uniformNames_1);
+  }
+  @JSName('getUniformIndices')
+  @DomName('WebGL2RenderingContext.getUniformIndices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<int> _getUniformIndices_1(Program program, List uniformNames) native;
+
+  @DomName('WebGL2RenderingContext.invalidateFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void invalidateFramebuffer(int target, List<int> attachments) native;
+
+  @DomName('WebGL2RenderingContext.invalidateSubFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void invalidateSubFramebuffer(int target, List<int> attachments, int x, int y, int width, int height) native;
+
+  @DomName('WebGL2RenderingContext.isQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isQuery(Query query) native;
+
+  @DomName('WebGL2RenderingContext.isSampler')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isSampler(Sampler sampler) native;
+
+  @DomName('WebGL2RenderingContext.isSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isSync(Sync sync) native;
+
+  @DomName('WebGL2RenderingContext.isTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isTransformFeedback(TransformFeedback feedback) native;
+
+  @DomName('WebGL2RenderingContext.isVertexArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isVertexArray(VertexArrayObject vertexArray) native;
+
+  @DomName('WebGL2RenderingContext.pauseTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void pauseTransformFeedback() native;
+
+  @DomName('WebGL2RenderingContext.readBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void readBuffer(int mode) native;
+
+  @DomName('WebGL2RenderingContext.renderbufferStorageMultisample')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void renderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) native;
+
+  @DomName('WebGL2RenderingContext.resumeTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void resumeTransformFeedback() native;
+
+  @DomName('WebGL2RenderingContext.samplerParameterf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void samplerParameterf(Sampler sampler, int pname, num param) native;
+
+  @DomName('WebGL2RenderingContext.samplerParameteri')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void samplerParameteri(Sampler sampler, int pname, int param) native;
+
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, TypedData pixels) native;
+
+  @DomName('WebGL2RenderingContext.texStorage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texStorage2D(int target, int levels, int internalformat, int width, int height) native;
+
+  @DomName('WebGL2RenderingContext.texStorage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texStorage3D(int target, int levels, int internalformat, int width, int height, int depth) native;
+
+  @DomName('WebGL2RenderingContext.texSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int format_OR_width, int height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video, [int format, int type, TypedData pixels]) {
+    if (pixels != null && type != null && format != null && (canvas_OR_data_OR_depth_OR_image_OR_video is int)) {
+      _texSubImage3D_1(target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video, format, type, pixels);
+      return;
+    }
+    if ((canvas_OR_data_OR_depth_OR_image_OR_video is ImageData || canvas_OR_data_OR_depth_OR_image_OR_video == null) && format == null && type == null && pixels == null) {
+      var data_1 = convertDartToNative_ImageData(canvas_OR_data_OR_depth_OR_image_OR_video);
+      _texSubImage3D_2(target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, data_1);
+      return;
+    }
+    if ((canvas_OR_data_OR_depth_OR_image_OR_video is ImageElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && format == null && type == null && pixels == null) {
+      _texSubImage3D_3(target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video);
+      return;
+    }
+    if ((canvas_OR_data_OR_depth_OR_image_OR_video is CanvasElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && format == null && type == null && pixels == null) {
+      _texSubImage3D_4(target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video);
+      return;
+    }
+    if ((canvas_OR_data_OR_depth_OR_image_OR_video is VideoElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && format == null && type == null && pixels == null) {
+      _texSubImage3D_5(target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  @JSName('texSubImage3D')
+  @DomName('WebGL2RenderingContext.texSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage3D_1(target, level, xoffset, yoffset, zoffset, width, height, int depth, format, type, TypedData pixels) native;
+  @JSName('texSubImage3D')
+  @DomName('WebGL2RenderingContext.texSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage3D_2(target, level, xoffset, yoffset, zoffset, format, type, data) native;
+  @JSName('texSubImage3D')
+  @DomName('WebGL2RenderingContext.texSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage3D_3(target, level, xoffset, yoffset, zoffset, format, type, ImageElement image) native;
+  @JSName('texSubImage3D')
+  @DomName('WebGL2RenderingContext.texSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage3D_4(target, level, xoffset, yoffset, zoffset, format, type, CanvasElement canvas) native;
+  @JSName('texSubImage3D')
+  @DomName('WebGL2RenderingContext.texSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage3D_5(target, level, xoffset, yoffset, zoffset, format, type, VideoElement video) native;
+
+  @DomName('WebGL2RenderingContext.transformFeedbackVaryings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void transformFeedbackVaryings(Program program, List<String> varyings, int bufferMode) {
+    List varyings_1 = convertDartToNative_StringArray(varyings);
+    _transformFeedbackVaryings_1(program, varyings_1, bufferMode);
+    return;
+  }
+  @JSName('transformFeedbackVaryings')
+  @DomName('WebGL2RenderingContext.transformFeedbackVaryings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _transformFeedbackVaryings_1(Program program, List varyings, bufferMode) native;
+
+  @DomName('WebGL2RenderingContext.uniform1ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1ui(UniformLocation location, int v0) native;
+
+  @DomName('WebGL2RenderingContext.uniform1uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1uiv(UniformLocation location, List<int> value) native;
+
+  @DomName('WebGL2RenderingContext.uniform2ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2ui(UniformLocation location, int v0, int v1) native;
+
+  @DomName('WebGL2RenderingContext.uniform2uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2uiv(UniformLocation location, List<int> value) native;
+
+  @DomName('WebGL2RenderingContext.uniform3ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3ui(UniformLocation location, int v0, int v1, int v2) native;
+
+  @DomName('WebGL2RenderingContext.uniform3uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3uiv(UniformLocation location, List<int> value) native;
+
+  @DomName('WebGL2RenderingContext.uniform4ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4ui(UniformLocation location, int v0, int v1, int v2, int v3) native;
+
+  @DomName('WebGL2RenderingContext.uniform4uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4uiv(UniformLocation location, List<int> value) native;
+
+  @DomName('WebGL2RenderingContext.uniformBlockBinding')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformBlockBinding(Program program, int uniformBlockIndex, int uniformBlockBinding) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix2x3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix2x3fv(UniformLocation location, bool transpose, value) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix2x4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix2x4fv(UniformLocation location, bool transpose, value) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix3x2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix3x2fv(UniformLocation location, bool transpose, value) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix3x4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix3x4fv(UniformLocation location, bool transpose, value) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix4x2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix4x2fv(UniformLocation location, bool transpose, value) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix4x3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix4x3fv(UniformLocation location, bool transpose, value) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttribDivisor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribDivisor(int index, int divisor) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttribI4i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribI4i(int index, int x, int y, int z, int w) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttribI4iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribI4iv(int index, List<int> v) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttribI4ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribI4ui(int index, int x, int y, int z, int w) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttribI4uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribI4uiv(int index, List<int> v) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttribIPointer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribIPointer(int index, int size, int type, int stride, int offset) native;
+
+  @DomName('WebGL2RenderingContext.waitSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void waitSync(Sync sync, int flags, int timeout) native;
+
+  // From WebGLRenderingContextBase
+
+  @DomName('WebGL2RenderingContext.canvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CanvasElement canvas;
+
+  @DomName('WebGL2RenderingContext.drawingBufferHeight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int drawingBufferHeight;
+
+  @DomName('WebGL2RenderingContext.drawingBufferWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int drawingBufferWidth;
+
+  @DomName('WebGL2RenderingContext.activeTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void activeTexture(int texture) native;
+
+  @DomName('WebGL2RenderingContext.attachShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void attachShader(Program program, Shader shader) native;
+
+  @DomName('WebGL2RenderingContext.bindAttribLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindAttribLocation(Program program, int index, String name) native;
+
+  @DomName('WebGL2RenderingContext.bindBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindBuffer(int target, Buffer buffer) native;
+
+  @DomName('WebGL2RenderingContext.bindFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindFramebuffer(int target, Framebuffer framebuffer) native;
+
+  @DomName('WebGL2RenderingContext.bindRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) native;
+
+  @DomName('WebGL2RenderingContext.bindTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindTexture(int target, Texture texture) native;
+
+  @DomName('WebGL2RenderingContext.blendColor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendColor(num red, num green, num blue, num alpha) native;
+
+  @DomName('WebGL2RenderingContext.blendEquation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendEquation(int mode) native;
+
+  @DomName('WebGL2RenderingContext.blendEquationSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendEquationSeparate(int modeRGB, int modeAlpha) native;
+
+  @DomName('WebGL2RenderingContext.blendFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendFunc(int sfactor, int dfactor) native;
+
+  @DomName('WebGL2RenderingContext.blendFuncSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native;
+
+  @DomName('WebGL2RenderingContext.bufferData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bufferData(int target, data_OR_size, int usage) native;
+
+  @DomName('WebGL2RenderingContext.bufferSubData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bufferSubData(int target, int offset, data) native;
+
+  @DomName('WebGL2RenderingContext.checkFramebufferStatus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int checkFramebufferStatus(int target) native;
+
+  @DomName('WebGL2RenderingContext.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clear(int mask) native;
+
+  @DomName('WebGL2RenderingContext.clearColor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearColor(num red, num green, num blue, num alpha) native;
+
+  @DomName('WebGL2RenderingContext.clearDepth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearDepth(num depth) native;
+
+  @DomName('WebGL2RenderingContext.clearStencil')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearStencil(int s) native;
+
+  @DomName('WebGL2RenderingContext.colorMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void colorMask(bool red, bool green, bool blue, bool alpha) native;
+
+  @DomName('WebGL2RenderingContext.compileShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compileShader(Shader shader) native;
+
+  @DomName('WebGL2RenderingContext.compressedTexImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) native;
+
+  @DomName('WebGL2RenderingContext.compressedTexSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) native;
+
+  @DomName('WebGL2RenderingContext.copyTexImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native;
+
+  @DomName('WebGL2RenderingContext.copyTexSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native;
+
+  @DomName('WebGL2RenderingContext.createBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Buffer createBuffer() native;
+
+  @DomName('WebGL2RenderingContext.createFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Framebuffer createFramebuffer() native;
+
+  @DomName('WebGL2RenderingContext.createProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Program createProgram() native;
+
+  @DomName('WebGL2RenderingContext.createRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Renderbuffer createRenderbuffer() native;
+
+  @DomName('WebGL2RenderingContext.createShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Shader createShader(int type) native;
+
+  @DomName('WebGL2RenderingContext.createTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Texture createTexture() native;
+
+  @DomName('WebGL2RenderingContext.cullFace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cullFace(int mode) native;
+
+  @DomName('WebGL2RenderingContext.deleteBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteBuffer(Buffer buffer) native;
+
+  @DomName('WebGL2RenderingContext.deleteFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteFramebuffer(Framebuffer framebuffer) native;
+
+  @DomName('WebGL2RenderingContext.deleteProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteProgram(Program program) native;
+
+  @DomName('WebGL2RenderingContext.deleteRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteRenderbuffer(Renderbuffer renderbuffer) native;
+
+  @DomName('WebGL2RenderingContext.deleteShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteShader(Shader shader) native;
+
+  @DomName('WebGL2RenderingContext.deleteTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteTexture(Texture texture) native;
+
+  @DomName('WebGL2RenderingContext.depthFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthFunc(int func) native;
+
+  @DomName('WebGL2RenderingContext.depthMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthMask(bool flag) native;
+
+  @DomName('WebGL2RenderingContext.depthRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthRange(num zNear, num zFar) native;
+
+  @DomName('WebGL2RenderingContext.detachShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void detachShader(Program program, Shader shader) native;
+
+  @DomName('WebGL2RenderingContext.disable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disable(int cap) native;
+
+  @DomName('WebGL2RenderingContext.disableVertexAttribArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disableVertexAttribArray(int index) native;
+
+  @DomName('WebGL2RenderingContext.drawArrays')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawArrays(int mode, int first, int count) native;
+
+  @DomName('WebGL2RenderingContext.drawElements')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawElements(int mode, int count, int type, int offset) native;
+
+  @DomName('WebGL2RenderingContext.enable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void enable(int cap) native;
+
+  @DomName('WebGL2RenderingContext.enableVertexAttribArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void enableVertexAttribArray(int index) native;
+
+  @DomName('WebGL2RenderingContext.finish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void finish() native;
+
+  @DomName('WebGL2RenderingContext.flush')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void flush() native;
+
+  @DomName('WebGL2RenderingContext.framebufferRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) native;
+
+  @DomName('WebGL2RenderingContext.framebufferTexture2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) native;
+
+  @DomName('WebGL2RenderingContext.frontFace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void frontFace(int mode) native;
+
+  @DomName('WebGL2RenderingContext.generateMipmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void generateMipmap(int target) native;
+
+  @DomName('WebGL2RenderingContext.getActiveAttrib')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ActiveInfo getActiveAttrib(Program program, int index) native;
+
+  @DomName('WebGL2RenderingContext.getActiveUniform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ActiveInfo getActiveUniform(Program program, int index) native;
+
+  @DomName('WebGL2RenderingContext.getAttachedShaders')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Shader> getAttachedShaders(Program program) native;
+
+  @DomName('WebGL2RenderingContext.getAttribLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getAttribLocation(Program program, String name) native;
+
+  @DomName('WebGL2RenderingContext.getBufferParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getBufferParameter(int target, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getContextAttributes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Map getContextAttributes() {
+    return convertNativeToDart_Dictionary(_getContextAttributes_1());
+  }
+  @JSName('getContextAttributes')
+  @DomName('WebGL2RenderingContext.getContextAttributes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _getContextAttributes_1() native;
+
+  @DomName('WebGL2RenderingContext.getError')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getError() native;
+
+  @DomName('WebGL2RenderingContext.getExtension')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getExtension(String name) native;
+
+  @DomName('WebGL2RenderingContext.getFramebufferAttachmentParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getParameter(int pname) native;
+
+  @DomName('WebGL2RenderingContext.getProgramInfoLog')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getProgramInfoLog(Program program) native;
+
+  @DomName('WebGL2RenderingContext.getProgramParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getProgramParameter(Program program, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getRenderbufferParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getRenderbufferParameter(int target, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getShaderInfoLog')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getShaderInfoLog(Shader shader) native;
+
+  @DomName('WebGL2RenderingContext.getShaderParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getShaderParameter(Shader shader, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getShaderPrecisionFormat')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native;
+
+  @DomName('WebGL2RenderingContext.getShaderSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getShaderSource(Shader shader) native;
+
+  @DomName('WebGL2RenderingContext.getSupportedExtensions')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> getSupportedExtensions() native;
+
+  @DomName('WebGL2RenderingContext.getTexParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getTexParameter(int target, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getUniform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getUniform(Program program, UniformLocation location) native;
+
+  @DomName('WebGL2RenderingContext.getUniformLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  UniformLocation getUniformLocation(Program program, String name) native;
+
+  @DomName('WebGL2RenderingContext.getVertexAttrib')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getVertexAttrib(int index, int pname) native;
+
+  @DomName('WebGL2RenderingContext.getVertexAttribOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getVertexAttribOffset(int index, int pname) native;
+
+  @DomName('WebGL2RenderingContext.hint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void hint(int target, int mode) native;
+
+  @DomName('WebGL2RenderingContext.isBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isBuffer(Buffer buffer) native;
+
+  @DomName('WebGL2RenderingContext.isContextLost')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isContextLost() native;
+
+  @DomName('WebGL2RenderingContext.isEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isEnabled(int cap) native;
+
+  @DomName('WebGL2RenderingContext.isFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isFramebuffer(Framebuffer framebuffer) native;
+
+  @DomName('WebGL2RenderingContext.isProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isProgram(Program program) native;
+
+  @DomName('WebGL2RenderingContext.isRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isRenderbuffer(Renderbuffer renderbuffer) native;
+
+  @DomName('WebGL2RenderingContext.isShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isShader(Shader shader) native;
+
+  @DomName('WebGL2RenderingContext.isTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isTexture(Texture texture) native;
+
+  @DomName('WebGL2RenderingContext.lineWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void lineWidth(num width) native;
+
+  @DomName('WebGL2RenderingContext.linkProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void linkProgram(Program program) native;
+
+  @DomName('WebGL2RenderingContext.pixelStorei')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void pixelStorei(int pname, int param) native;
+
+  @DomName('WebGL2RenderingContext.polygonOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void polygonOffset(num factor, num units) native;
+
+  @DomName('WebGL2RenderingContext.readPixels')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) native;
+
+  @DomName('WebGL2RenderingContext.renderbufferStorage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void renderbufferStorage(int target, int internalformat, int width, int height) native;
+
+  @DomName('WebGL2RenderingContext.sampleCoverage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void sampleCoverage(num value, bool invert) native;
+
+  @DomName('WebGL2RenderingContext.scissor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scissor(int x, int y, int width, int height) native;
+
+  @DomName('WebGL2RenderingContext.shaderSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void shaderSource(Shader shader, String string) native;
+
+  @DomName('WebGL2RenderingContext.stencilFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilFunc(int func, int ref, int mask) native;
+
+  @DomName('WebGL2RenderingContext.stencilFuncSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilFuncSeparate(int face, int func, int ref, int mask) native;
+
+  @DomName('WebGL2RenderingContext.stencilMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilMask(int mask) native;
+
+  @DomName('WebGL2RenderingContext.stencilMaskSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilMaskSeparate(int face, int mask) native;
+
+  @DomName('WebGL2RenderingContext.stencilOp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilOp(int fail, int zfail, int zpass) native;
+
+  @DomName('WebGL2RenderingContext.stencilOpSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
+
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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, TypedData pixels]) {
+    if (pixels != null && type != null && format != null && (border_OR_canvas_OR_image_OR_pixels_OR_video is int)) {
+      _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 ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
+      var pixels_1 = convertDartToNative_ImageData(border_OR_canvas_OR_image_OR_pixels_OR_video);
+      _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement) && format == null && type == null && pixels == null) {
+      _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement) && format == null && type == null && pixels == null) {
+      _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement) && format == null && type == null && pixels == null) {
+      _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");
+  }
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D_1(target, level, internalformat, width, height, int border, format, type, TypedData pixels) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D_2(target, level, internalformat, format, type, pixels) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D_3(target, level, internalformat, format, type, ImageElement image) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D_4(target, level, internalformat, format, type, CanvasElement canvas) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native;
+
+  @DomName('WebGL2RenderingContext.texParameterf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texParameterf(int target, int pname, num param) native;
+
+  @DomName('WebGL2RenderingContext.texParameteri')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texParameteri(int target, int pname, int param) native;
+
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  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, TypedData pixels]) {
+    if (pixels != null && type != null && (canvas_OR_format_OR_image_OR_pixels_OR_video is int)) {
+      _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 ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
+      var pixels_1 = convertDartToNative_ImageData(canvas_OR_format_OR_image_OR_pixels_OR_video);
+      _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement) && type == null && pixels == null) {
+      _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement) && type == null && pixels == null) {
+      _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement) && type == null && pixels == null) {
+      _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");
+  }
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D_1(target, level, xoffset, yoffset, width, height, int format, type, TypedData pixels) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D_3(target, level, xoffset, yoffset, format, type, ImageElement image) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D_4(target, level, xoffset, yoffset, format, type, CanvasElement canvas) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, VideoElement video) native;
+
+  @DomName('WebGL2RenderingContext.uniform1f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1f(UniformLocation location, num x) native;
+
+  @DomName('WebGL2RenderingContext.uniform1fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1fv(UniformLocation location, v) native;
+
+  @DomName('WebGL2RenderingContext.uniform1i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1i(UniformLocation location, int x) native;
+
+  @DomName('WebGL2RenderingContext.uniform1iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1iv(UniformLocation location, v) native;
+
+  @DomName('WebGL2RenderingContext.uniform2f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2f(UniformLocation location, num x, num y) native;
+
+  @DomName('WebGL2RenderingContext.uniform2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2fv(UniformLocation location, v) native;
+
+  @DomName('WebGL2RenderingContext.uniform2i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2i(UniformLocation location, int x, int y) native;
+
+  @DomName('WebGL2RenderingContext.uniform2iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2iv(UniformLocation location, v) native;
+
+  @DomName('WebGL2RenderingContext.uniform3f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3f(UniformLocation location, num x, num y, num z) native;
+
+  @DomName('WebGL2RenderingContext.uniform3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3fv(UniformLocation location, v) native;
+
+  @DomName('WebGL2RenderingContext.uniform3i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3i(UniformLocation location, int x, int y, int z) native;
+
+  @DomName('WebGL2RenderingContext.uniform3iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3iv(UniformLocation location, v) native;
+
+  @DomName('WebGL2RenderingContext.uniform4f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) native;
+
+  @DomName('WebGL2RenderingContext.uniform4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4fv(UniformLocation location, v) native;
+
+  @DomName('WebGL2RenderingContext.uniform4i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) native;
+
+  @DomName('WebGL2RenderingContext.uniform4iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4iv(UniformLocation location, v) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix2fv(UniformLocation location, bool transpose, array) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix3fv(UniformLocation location, bool transpose, array) native;
+
+  @DomName('WebGL2RenderingContext.uniformMatrix4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix4fv(UniformLocation location, bool transpose, array) native;
+
+  @DomName('WebGL2RenderingContext.useProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void useProgram(Program program) native;
+
+  @DomName('WebGL2RenderingContext.validateProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void validateProgram(Program program) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttrib1f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib1f(int indx, num x) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttrib1fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib1fv(int indx, values) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttrib2f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib2f(int indx, num x, num y) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttrib2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib2fv(int indx, values) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttrib3f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib3f(int indx, num x, num y, num z) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttrib3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib3fv(int indx, values) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttrib4f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttrib4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib4fv(int indx, values) native;
+
+  @DomName('WebGL2RenderingContext.vertexAttribPointer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native;
+
+  @DomName('WebGL2RenderingContext.viewport')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void viewport(int x, int y, int width, int height) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGLSampler')
+@Experimental() // untriaged
+@Native("WebGLSampler")
+class Sampler extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Sampler._() { throw new UnsupportedError("Not supported"); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGLShader')
 @Native("WebGLShader")
 class Shader extends Interceptor {
@@ -3312,6 +6007,19 @@
 
 
 @DocsEditable()
+@DomName('WebGLSync')
+@Experimental() // untriaged
+@Native("WebGLSync")
+class Sync extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Sync._() { throw new UnsupportedError("Not supported"); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGLTexture')
 @Native("WebGLTexture")
 class Texture extends Interceptor {
@@ -3324,6 +6032,19 @@
 
 
 @DocsEditable()
+@DomName('WebGLTransformFeedback')
+@Experimental() // untriaged
+@Native("WebGLTransformFeedback")
+class TransformFeedback extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory TransformFeedback._() { throw new UnsupportedError("Not supported"); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGLUniformLocation')
 @Native("WebGLUniformLocation")
 class UniformLocation extends Interceptor {
@@ -3336,13 +6057,41 @@
 
 
 @DocsEditable()
+@DomName('WebGLVertexArrayObject')
+@Experimental() // untriaged
+@Native("WebGLVertexArrayObject")
+class VertexArrayObject extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VertexArrayObject._() { throw new UnsupportedError("Not supported"); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGLVertexArrayObjectOES')
 // http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
 @Experimental() // experimental
 @Native("WebGLVertexArrayObjectOES")
-class VertexArrayObject extends Interceptor {
+class VertexArrayObjectOes extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VertexArrayObject._() { throw new UnsupportedError("Not supported"); }
+  factory VertexArrayObjectOes._() { throw new UnsupportedError("Not supported"); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGL2RenderingContextBase')
+@Experimental() // untriaged
+@Native("WebGL2RenderingContextBase")
+abstract class _WebGL2RenderingContextBase extends Interceptor implements _WebGLRenderingContextBase {
+  // To suppress missing implicit constructor warnings.
+  factory _WebGL2RenderingContextBase._() { throw new UnsupportedError("Not supported"); }
+
+  // From WebGLRenderingContextBase
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index 707af2d..ede152f 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -23,10 +23,12 @@
 @Deprecated("Internal Use Only")
 final web_glBlinkMap = {
   'ANGLEInstancedArrays': () => AngleInstancedArrays,
+  'CHROMIUMSubscribeUniform': () => ChromiumSubscribeUniform,
   'EXTBlendMinMax': () => ExtBlendMinMax,
   'EXTFragDepth': () => ExtFragDepth,
   'EXTShaderTextureLOD': () => ExtShaderTextureLod,
   'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic,
+  'EXTsRGB': () => EXTsRgb,
   'OESElementIndexUint': () => OesElementIndexUint,
   'OESStandardDerivatives': () => OesStandardDerivatives,
   'OESTextureFloat': () => OesTextureFloat,
@@ -34,13 +36,14 @@
   'OESTextureHalfFloat': () => OesTextureHalfFloat,
   'OESTextureHalfFloatLinear': () => OesTextureHalfFloatLinear,
   'OESVertexArrayObject': () => OesVertexArrayObject,
+  'WebGL2RenderingContext': () => RenderingContext2,
+  'WebGL2RenderingContextBase': () => _WebGL2RenderingContextBase,
   'WebGLActiveInfo': () => ActiveInfo,
   'WebGLBuffer': () => Buffer,
   'WebGLCompressedTextureATC': () => CompressedTextureAtc,
   'WebGLCompressedTextureETC1': () => CompressedTextureETC1,
   'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc,
   'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC,
-  'WebGLContextAttributes': () => ContextAttributes,
   'WebGLContextEvent': () => ContextEvent,
   'WebGLDebugRendererInfo': () => DebugRendererInfo,
   'WebGLDebugShaders': () => DebugShaders,
@@ -49,14 +52,19 @@
   'WebGLFramebuffer': () => Framebuffer,
   'WebGLLoseContext': () => LoseContext,
   'WebGLProgram': () => Program,
+  'WebGLQuery': () => Query,
   'WebGLRenderbuffer': () => Renderbuffer,
   'WebGLRenderingContext': () => RenderingContext,
   'WebGLRenderingContextBase': () => _WebGLRenderingContextBase,
+  'WebGLSampler': () => Sampler,
   'WebGLShader': () => Shader,
   'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat,
+  'WebGLSync': () => Sync,
   'WebGLTexture': () => Texture,
+  'WebGLTransformFeedback': () => TransformFeedback,
   'WebGLUniformLocation': () => UniformLocation,
-  'WebGLVertexArrayObjectOES': () => VertexArrayObject,
+  'WebGLVertexArrayObject': () => VertexArrayObject,
+  'WebGLVertexArrayObjectOES': () => VertexArrayObjectOes,
 
 };
 
@@ -64,10 +72,12 @@
 @Deprecated("Internal Use Only")
 final web_glBlinkFunctionMap = {
   'ANGLEInstancedArrays': () => AngleInstancedArrays.internalCreateAngleInstancedArrays,
+  'CHROMIUMSubscribeUniform': () => ChromiumSubscribeUniform.internalCreateChromiumSubscribeUniform,
   'EXTBlendMinMax': () => ExtBlendMinMax.internalCreateExtBlendMinMax,
   'EXTFragDepth': () => ExtFragDepth.internalCreateExtFragDepth,
   'EXTShaderTextureLOD': () => ExtShaderTextureLod.internalCreateExtShaderTextureLod,
   'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic.internalCreateExtTextureFilterAnisotropic,
+  'EXTsRGB': () => EXTsRgb.internalCreateEXTsRgb,
   'OESElementIndexUint': () => OesElementIndexUint.internalCreateOesElementIndexUint,
   'OESStandardDerivatives': () => OesStandardDerivatives.internalCreateOesStandardDerivatives,
   'OESTextureFloat': () => OesTextureFloat.internalCreateOesTextureFloat,
@@ -75,13 +85,14 @@
   'OESTextureHalfFloat': () => OesTextureHalfFloat.internalCreateOesTextureHalfFloat,
   'OESTextureHalfFloatLinear': () => OesTextureHalfFloatLinear.internalCreateOesTextureHalfFloatLinear,
   'OESVertexArrayObject': () => OesVertexArrayObject.internalCreateOesVertexArrayObject,
+  'WebGL2RenderingContext': () => RenderingContext2.internalCreateRenderingContext2,
+  'WebGL2RenderingContextBase': () => _WebGL2RenderingContextBase.internalCreate_WebGL2RenderingContextBase,
   'WebGLActiveInfo': () => ActiveInfo.internalCreateActiveInfo,
   'WebGLBuffer': () => Buffer.internalCreateBuffer,
   'WebGLCompressedTextureATC': () => CompressedTextureAtc.internalCreateCompressedTextureAtc,
   'WebGLCompressedTextureETC1': () => CompressedTextureETC1.internalCreateCompressedTextureETC1,
   'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc.internalCreateCompressedTexturePvrtc,
   'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC.internalCreateCompressedTextureS3TC,
-  'WebGLContextAttributes': () => ContextAttributes.internalCreateContextAttributes,
   'WebGLContextEvent': () => ContextEvent.internalCreateContextEvent,
   'WebGLDebugRendererInfo': () => DebugRendererInfo.internalCreateDebugRendererInfo,
   'WebGLDebugShaders': () => DebugShaders.internalCreateDebugShaders,
@@ -90,13 +101,18 @@
   'WebGLFramebuffer': () => Framebuffer.internalCreateFramebuffer,
   'WebGLLoseContext': () => LoseContext.internalCreateLoseContext,
   'WebGLProgram': () => Program.internalCreateProgram,
+  'WebGLQuery': () => Query.internalCreateQuery,
   'WebGLRenderbuffer': () => Renderbuffer.internalCreateRenderbuffer,
   'WebGLRenderingContext': () => RenderingContext.internalCreateRenderingContext,
+  'WebGLSampler': () => Sampler.internalCreateSampler,
   'WebGLShader': () => Shader.internalCreateShader,
   'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat.internalCreateShaderPrecisionFormat,
+  'WebGLSync': () => Sync.internalCreateSync,
   'WebGLTexture': () => Texture.internalCreateTexture,
+  'WebGLTransformFeedback': () => TransformFeedback.internalCreateTransformFeedback,
   'WebGLUniformLocation': () => UniformLocation.internalCreateUniformLocation,
-  'WebGLVertexArrayObjectOES': () => VertexArrayObject.internalCreateVertexArrayObject,
+  'WebGLVertexArrayObject': () => VertexArrayObject.internalCreateVertexArrayObject,
+  'WebGLVertexArrayObjectOES': () => VertexArrayObjectOes.internalCreateVertexArrayObjectOes,
 
 };
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -530,6 +546,81 @@
 
 
 @DocsEditable()
+@DomName('CHROMIUMSubscribeUniform')
+@Experimental() // untriaged
+class ChromiumSubscribeUniform extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory ChromiumSubscribeUniform._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static ChromiumSubscribeUniform internalCreateChromiumSubscribeUniform() {
+    return new ChromiumSubscribeUniform._internalWrap();
+  }
+
+  factory ChromiumSubscribeUniform._internalWrap() {
+    return new ChromiumSubscribeUniform.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  ChromiumSubscribeUniform.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('CHROMIUMSubscribeUniform.MOUSE_POSITION_CHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MOUSE_POSITION_CHROMIUM = 0x924C;
+
+  @DomName('CHROMIUMSubscribeUniform.SUBSCRIBED_VALUES_BUFFER_CHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SUBSCRIBED_VALUES_BUFFER_CHROMIUM = 0x924B;
+
+  @DomName('CHROMIUMSubscribeUniform.bindValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindValuebufferChromium(int target, ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.bindValuebufferCHROMIUM_Callback_2_(unwrap_jso(this), target, unwrap_jso(buffer));
+  
+  @DomName('CHROMIUMSubscribeUniform.createValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ChromiumValuebuffer createValuebufferChromium() => wrap_jso(_blink.BlinkCHROMIUMSubscribeUniform.instance.createValuebufferCHROMIUM_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('CHROMIUMSubscribeUniform.deleteValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteValuebufferChromium(ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.deleteValuebufferCHROMIUM_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  
+  @DomName('CHROMIUMSubscribeUniform.isValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isValuebufferChromium(ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.isValuebufferCHROMIUM_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  
+  @DomName('CHROMIUMSubscribeUniform.populateSubscribedValuesCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void populateSubscribedValuesChromium(int target) => _blink.BlinkCHROMIUMSubscribeUniform.instance.populateSubscribedValuesCHROMIUM_Callback_1_(unwrap_jso(this), target);
+  
+  @DomName('CHROMIUMSubscribeUniform.subscribeValueCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void subscribeValueChromium(int target, int subscriptions) => _blink.BlinkCHROMIUMSubscribeUniform.instance.subscribeValueCHROMIUM_Callback_2_(unwrap_jso(this), target, subscriptions);
+  
+  @DomName('CHROMIUMSubscribeUniform.uniformValuebufferCHROMIUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformValuebufferChromium(UniformLocation location, int target, int subscription) => _blink.BlinkCHROMIUMSubscribeUniform.instance.uniformValuebufferCHROMIUM_Callback_3_(unwrap_jso(this), unwrap_jso(location), target, subscription);
+  
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('WebGLCompressedTextureATC')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_atc/
 @Experimental()
@@ -702,122 +793,22 @@
 
 
 @DocsEditable()
-/**
- * The properties of a WebGL rendering context.
- *
- * If [alpha] is `true`, then the context has an alpha channel.
- *
- * If [antialias] is `true`, then antialiasing is performed by the browser, but
- * only if the browser's implementation of WebGL supports antialiasing.
- *
- * If [depth] is `true`, then the context has a depth buffer of at least 16
- * bits.
- *
- * If [premultipliedAlpha] is `true`, then the context's colors are assumed to
- * be premultiplied. This means that color values are assumed to have  been
- * multiplied by their alpha values. If [alpha] is `false`, then this flag is
- * ignored.
- *
- * If [preserveDrawingBuffer] is `false`, then all contents of the context are
- * cleared. If `true`, then all values will remain until changed or cleared.
- *
- * If [stencil] is `true`, then the context has a stencil buffer of at least 8
- * bits.
- */
-@DomName('WebGLContextAttributes')
-@Unstable()
-class ContextAttributes extends DartHtmlDomObject {
-  // To suppress missing implicit constructor warnings.
-  factory ContextAttributes._() { throw new UnsupportedError("Not supported"); }
-
-  @Deprecated("Internal Use Only")
-  static ContextAttributes internalCreateContextAttributes() {
-    return new ContextAttributes._internalWrap();
-  }
-
-  factory ContextAttributes._internalWrap() {
-    return new ContextAttributes.internal_();
-  }
-
-  @Deprecated("Internal Use Only")
-  ContextAttributes.internal_() { }
-
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
-  @DomName('WebGLContextAttributes.alpha')
-  @DocsEditable()
-  bool get alpha => _blink.BlinkWebGLContextAttributes.instance.alpha_Getter_(unwrap_jso(this));
-  
-  @DomName('WebGLContextAttributes.alpha')
-  @DocsEditable()
-  set alpha(bool value) => _blink.BlinkWebGLContextAttributes.instance.alpha_Setter_(unwrap_jso(this), value);
-  
-  @DomName('WebGLContextAttributes.antialias')
-  @DocsEditable()
-  bool get antialias => _blink.BlinkWebGLContextAttributes.instance.antialias_Getter_(unwrap_jso(this));
-  
-  @DomName('WebGLContextAttributes.antialias')
-  @DocsEditable()
-  set antialias(bool value) => _blink.BlinkWebGLContextAttributes.instance.antialias_Setter_(unwrap_jso(this), value);
-  
-  @DomName('WebGLContextAttributes.depth')
-  @DocsEditable()
-  bool get depth => _blink.BlinkWebGLContextAttributes.instance.depth_Getter_(unwrap_jso(this));
-  
-  @DomName('WebGLContextAttributes.depth')
-  @DocsEditable()
-  set depth(bool value) => _blink.BlinkWebGLContextAttributes.instance.depth_Setter_(unwrap_jso(this), value);
-  
-  @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool get failIfMajorPerformanceCaveat => _blink.BlinkWebGLContextAttributes.instance.failIfMajorPerformanceCaveat_Getter_(unwrap_jso(this));
-  
-  @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
-  @DocsEditable()
-  @Experimental() // untriaged
-  set failIfMajorPerformanceCaveat(bool value) => _blink.BlinkWebGLContextAttributes.instance.failIfMajorPerformanceCaveat_Setter_(unwrap_jso(this), value);
-  
-  @DomName('WebGLContextAttributes.premultipliedAlpha')
-  @DocsEditable()
-  bool get premultipliedAlpha => _blink.BlinkWebGLContextAttributes.instance.premultipliedAlpha_Getter_(unwrap_jso(this));
-  
-  @DomName('WebGLContextAttributes.premultipliedAlpha')
-  @DocsEditable()
-  set premultipliedAlpha(bool value) => _blink.BlinkWebGLContextAttributes.instance.premultipliedAlpha_Setter_(unwrap_jso(this), value);
-  
-  @DomName('WebGLContextAttributes.preserveDrawingBuffer')
-  @DocsEditable()
-  bool get preserveDrawingBuffer => _blink.BlinkWebGLContextAttributes.instance.preserveDrawingBuffer_Getter_(unwrap_jso(this));
-  
-  @DomName('WebGLContextAttributes.preserveDrawingBuffer')
-  @DocsEditable()
-  set preserveDrawingBuffer(bool value) => _blink.BlinkWebGLContextAttributes.instance.preserveDrawingBuffer_Setter_(unwrap_jso(this), value);
-  
-  @DomName('WebGLContextAttributes.stencil')
-  @DocsEditable()
-  bool get stencil => _blink.BlinkWebGLContextAttributes.instance.stencil_Getter_(unwrap_jso(this));
-  
-  @DomName('WebGLContextAttributes.stencil')
-  @DocsEditable()
-  set stencil(bool value) => _blink.BlinkWebGLContextAttributes.instance.stencil_Setter_(unwrap_jso(this), 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('WebGLContextEvent')
 @Unstable()
 class ContextEvent extends Event {
   // To suppress missing implicit constructor warnings.
   factory ContextEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('WebGLContextEvent.WebGLContextEvent')
+  @DocsEditable()
+  factory ContextEvent(String type, [Map eventInit]) {
+    if (eventInit != null) {
+      var eventInit_1 = convertDartToNative_Dictionary(eventInit);
+      return wrap_jso(_blink.BlinkWebGLContextEvent.instance.constructorCallback_2_(type, eventInit_1));
+    }
+    return wrap_jso(_blink.BlinkWebGLContextEvent.instance.constructorCallback_1_(type));
+  }
+
 
   @Deprecated("Internal Use Only")
   static ContextEvent internalCreateContextEvent() {
@@ -1123,6 +1114,56 @@
 
 
 @DocsEditable()
+@DomName('EXTsRGB')
+@Experimental() // untriaged
+class EXTsRgb extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory EXTsRgb._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static EXTsRgb internalCreateEXTsRgb() {
+    return new EXTsRgb._internalWrap();
+  }
+
+  factory EXTsRgb._internalWrap() {
+    return new EXTsRgb.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  EXTsRgb.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('EXTsRGB.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210;
+
+  @DomName('EXTsRGB.SRGB8_ALPHA8_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRGB8_ALPHA8_EXT = 0x8C43;
+
+  @DomName('EXTsRGB.SRGB_ALPHA_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRGB_ALPHA_EXT = 0x8C42;
+
+  @DomName('EXTsRGB.SRGB_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRGB_EXT = 0x8C40;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('EXTBlendMinMax')
 @Experimental() // untriaged
 class ExtBlendMinMax extends DartHtmlDomObject {
@@ -1554,19 +1595,19 @@
 
   @DomName('OESVertexArrayObject.bindVertexArrayOES')
   @DocsEditable()
-  void bindVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.instance.bindVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
+  void bindVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.bindVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
   
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObject createVertexArray() => wrap_jso(_blink.BlinkOESVertexArrayObject.instance.createVertexArrayOES_Callback_0_(unwrap_jso(this)));
+  VertexArrayObjectOes createVertexArray() => wrap_jso(_blink.BlinkOESVertexArrayObject.instance.createVertexArrayOES_Callback_0_(unwrap_jso(this)));
   
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
-  void deleteVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.instance.deleteVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
+  void deleteVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.deleteVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
   
   @DomName('OESVertexArrayObject.isVertexArrayOES')
   @DocsEditable()
-  bool isVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.instance.isVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
+  bool isVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.isVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1607,6 +1648,36 @@
 
 
 @DocsEditable()
+@DomName('WebGLQuery')
+@Experimental() // untriaged
+class Query extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory Query._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static Query internalCreateQuery() {
+    return new Query._internalWrap();
+  }
+
+  factory Query._internalWrap() {
+    return new Query.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  Query.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source 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')
 @Unstable()
 class Renderbuffer extends DartHtmlDomObject {
@@ -2912,10 +2983,6 @@
   @DocsEditable()
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGLRenderingContext.instance.blendFuncSeparate_Callback_4_(unwrap_jso(this), srcRGB, dstRGB, srcAlpha, dstAlpha);
   
-  @DomName('WebGLRenderingContext.bufferByteData')
-  @DocsEditable()
-  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, data, usage);
-  
   void bufferData(int target, data_OR_size, int usage) {
     if ((usage is int) && (data_OR_size is int) && (target is int)) {
       _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
@@ -2932,14 +2999,6 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('WebGLRenderingContext.bufferDataTyped')
-  @DocsEditable()
-  void bufferDataTyped(int target, TypedData data, int usage) => _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data), usage);
-  
-  @DomName('WebGLRenderingContext.bufferSubByteData')
-  @DocsEditable()
-  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, data);
-  
   void bufferSubData(int target, int offset, data) {
     if ((data is TypedData) && (offset is int) && (target is int)) {
       _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(data));
@@ -2952,10 +3011,6 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('WebGLRenderingContext.bufferSubDataTyped')
-  @DocsEditable()
-  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(data));
-  
   @DomName('WebGLRenderingContext.checkFramebufferStatus')
   @DocsEditable()
   int checkFramebufferStatus(int target) => _blink.BlinkWebGLRenderingContext.instance.checkFramebufferStatus_Callback_1_(unwrap_jso(this), target);
@@ -3138,7 +3193,7 @@
   
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-  ContextAttributes getContextAttributes() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getContextAttributes_Callback_0_(unwrap_jso(this)));
+   getContextAttributes() => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getContextAttributes_Callback_0_(unwrap_jso(this))));
   
   @DomName('WebGLRenderingContext.getError')
   @DocsEditable()
@@ -3328,22 +3383,6 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('WebGLRenderingContext.texImage2DCanvas')
-  @DocsEditable()
-  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format, type, unwrap_jso(canvas));
-  
-  @DomName('WebGLRenderingContext.texImage2DImage')
-  @DocsEditable()
-  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format, type, unwrap_jso(image));
-  
-  @DomName('WebGLRenderingContext.texImage2DImageData')
-  @DocsEditable()
-  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format, type, unwrap_jso(pixels));
-  
-  @DomName('WebGLRenderingContext.texImage2DVideo')
-  @DocsEditable()
-  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format, type, unwrap_jso(video));
-  
   @DomName('WebGLRenderingContext.texParameterf')
   @DocsEditable()
   void texParameterf(int target, int pname, num param) => _blink.BlinkWebGLRenderingContext.instance.texParameterf_Callback_3_(unwrap_jso(this), target, pname, param);
@@ -3376,98 +3415,170 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('WebGLRenderingContext.texSubImage2DCanvas')
-  @DocsEditable()
-  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format, type, unwrap_jso(canvas));
-  
-  @DomName('WebGLRenderingContext.texSubImage2DImage')
-  @DocsEditable()
-  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format, type, unwrap_jso(image));
-  
-  @DomName('WebGLRenderingContext.texSubImage2DImageData')
-  @DocsEditable()
-  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format, type, unwrap_jso(pixels));
-  
-  @DomName('WebGLRenderingContext.texSubImage2DVideo')
-  @DocsEditable()
-  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format, type, unwrap_jso(video));
-  
   @DomName('WebGLRenderingContext.uniform1f')
   @DocsEditable()
   void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGLRenderingContext.instance.uniform1f_Callback_2_(unwrap_jso(this), unwrap_jso(location), x);
   
-  @DomName('WebGLRenderingContext.uniform1fv')
-  @DocsEditable()
-  void uniform1fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), v);
-  
+  void uniform1fv(UniformLocation location, v) {
+    if ((v is Float32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<num>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.uniform1i')
   @DocsEditable()
   void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGLRenderingContext.instance.uniform1i_Callback_2_(unwrap_jso(this), unwrap_jso(location), x);
   
-  @DomName('WebGLRenderingContext.uniform1iv')
-  @DocsEditable()
-  void uniform1iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), v);
-  
+  void uniform1iv(UniformLocation location, v) {
+    if ((v is Int32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<int>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.uniform2f')
   @DocsEditable()
   void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGLRenderingContext.instance.uniform2f_Callback_3_(unwrap_jso(this), unwrap_jso(location), x, y);
   
-  @DomName('WebGLRenderingContext.uniform2fv')
-  @DocsEditable()
-  void uniform2fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), v);
-  
+  void uniform2fv(UniformLocation location, v) {
+    if ((v is Float32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<num>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.uniform2i')
   @DocsEditable()
   void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGLRenderingContext.instance.uniform2i_Callback_3_(unwrap_jso(this), unwrap_jso(location), x, y);
   
-  @DomName('WebGLRenderingContext.uniform2iv')
-  @DocsEditable()
-  void uniform2iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), v);
-  
+  void uniform2iv(UniformLocation location, v) {
+    if ((v is Int32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<int>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.uniform3f')
   @DocsEditable()
   void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.instance.uniform3f_Callback_4_(unwrap_jso(this), unwrap_jso(location), x, y, z);
   
-  @DomName('WebGLRenderingContext.uniform3fv')
-  @DocsEditable()
-  void uniform3fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), v);
-  
+  void uniform3fv(UniformLocation location, v) {
+    if ((v is Float32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<num>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.uniform3i')
   @DocsEditable()
   void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGLRenderingContext.instance.uniform3i_Callback_4_(unwrap_jso(this), unwrap_jso(location), x, y, z);
   
-  @DomName('WebGLRenderingContext.uniform3iv')
-  @DocsEditable()
-  void uniform3iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), v);
-  
+  void uniform3iv(UniformLocation location, v) {
+    if ((v is Int32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<int>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.uniform4f')
   @DocsEditable()
   void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.instance.uniform4f_Callback_5_(unwrap_jso(this), unwrap_jso(location), x, y, z, w);
   
-  @DomName('WebGLRenderingContext.uniform4fv')
-  @DocsEditable()
-  void uniform4fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), v);
-  
+  void uniform4fv(UniformLocation location, v) {
+    if ((v is Float32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<num>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.uniform4i')
   @DocsEditable()
   void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGLRenderingContext.instance.uniform4i_Callback_5_(unwrap_jso(this), unwrap_jso(location), x, y, z, w);
   
-  @DomName('WebGLRenderingContext.uniform4iv')
-  @DocsEditable()
-  void uniform4iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), v);
-  
-  @DomName('WebGLRenderingContext.uniformMatrix2fv')
-  @DocsEditable()
-  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, array);
-  
-  @DomName('WebGLRenderingContext.uniformMatrix3fv')
-  @DocsEditable()
-  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, array);
-  
-  @DomName('WebGLRenderingContext.uniformMatrix4fv')
-  @DocsEditable()
-  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, array);
-  
+  void uniform4iv(UniformLocation location, v) {
+    if ((v is Int32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<int>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix2fv(UniformLocation location, bool transpose, array) {
+    if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix3fv(UniformLocation location, bool transpose, array) {
+    if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix4fv(UniformLocation location, bool transpose, array) {
+    if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.useProgram')
   @DocsEditable()
   void useProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.useProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
@@ -3480,34 +3591,66 @@
   @DocsEditable()
   void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1f_Callback_2_(unwrap_jso(this), indx, x);
   
-  @DomName('WebGLRenderingContext.vertexAttrib1fv')
-  @DocsEditable()
-  void vertexAttrib1fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, values);
-  
+  void vertexAttrib1fv(int indx, values) {
+    if ((values is Float32List) && (indx is int)) {
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    if ((values is List<num>) && (indx is int)) {
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.vertexAttrib2f')
   @DocsEditable()
   void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2f_Callback_3_(unwrap_jso(this), indx, x, y);
   
-  @DomName('WebGLRenderingContext.vertexAttrib2fv')
-  @DocsEditable()
-  void vertexAttrib2fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, values);
-  
+  void vertexAttrib2fv(int indx, values) {
+    if ((values is Float32List) && (indx is int)) {
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    if ((values is List<num>) && (indx is int)) {
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.vertexAttrib3f')
   @DocsEditable()
   void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3f_Callback_4_(unwrap_jso(this), indx, x, y, z);
   
-  @DomName('WebGLRenderingContext.vertexAttrib3fv')
-  @DocsEditable()
-  void vertexAttrib3fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, values);
-  
+  void vertexAttrib3fv(int indx, values) {
+    if ((values is Float32List) && (indx is int)) {
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    if ((values is List<num>) && (indx is int)) {
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.vertexAttrib4f')
   @DocsEditable()
   void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4f_Callback_5_(unwrap_jso(this), indx, x, y, z, w);
   
-  @DomName('WebGLRenderingContext.vertexAttrib4fv')
-  @DocsEditable()
-  void vertexAttrib4fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, values);
-  
+  void vertexAttrib4fv(int indx, values) {
+    if ((values is Float32List) && (indx is int)) {
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    if ((values is List<num>) && (indx is int)) {
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('WebGLRenderingContext.vertexAttribPointer')
   @DocsEditable()
   void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGLRenderingContext.instance.vertexAttribPointer_Callback_6_(unwrap_jso(this), indx, size, type, normalized, stride, offset);
@@ -3585,6 +3728,2929 @@
 
 
 @DocsEditable()
+@DomName('WebGL2RenderingContext')
+@Experimental() // untriaged
+class RenderingContext2 extends DartHtmlDomObject implements _WebGL2RenderingContextBase, _WebGLRenderingContextBase {
+  // To suppress missing implicit constructor warnings.
+  factory RenderingContext2._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static RenderingContext2 internalCreateRenderingContext2() {
+    return new RenderingContext2._internalWrap();
+  }
+
+  factory RenderingContext2._internalWrap() {
+    return new RenderingContext2.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  RenderingContext2.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  @DomName('WebGL2RenderingContext.ACTIVE_ATTRIBUTES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_ATTRIBUTES = 0x8B89;
+
+  @DomName('WebGL2RenderingContext.ACTIVE_TEXTURE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_TEXTURE = 0x84E0;
+
+  @DomName('WebGL2RenderingContext.ACTIVE_UNIFORMS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_UNIFORMS = 0x8B86;
+
+  @DomName('WebGL2RenderingContext.ALIASED_LINE_WIDTH_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
+
+  @DomName('WebGL2RenderingContext.ALIASED_POINT_SIZE_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
+
+  @DomName('WebGL2RenderingContext.ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALPHA = 0x1906;
+
+  @DomName('WebGL2RenderingContext.ALPHA_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALPHA_BITS = 0x0D55;
+
+  @DomName('WebGL2RenderingContext.ALWAYS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALWAYS = 0x0207;
+
+  @DomName('WebGL2RenderingContext.ARRAY_BUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ARRAY_BUFFER = 0x8892;
+
+  @DomName('WebGL2RenderingContext.ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ARRAY_BUFFER_BINDING = 0x8894;
+
+  @DomName('WebGL2RenderingContext.ATTACHED_SHADERS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ATTACHED_SHADERS = 0x8B85;
+
+  @DomName('WebGL2RenderingContext.BACK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BACK = 0x0405;
+
+  @DomName('WebGL2RenderingContext.BLEND')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND = 0x0BE2;
+
+  @DomName('WebGL2RenderingContext.BLEND_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_COLOR = 0x8005;
+
+  @DomName('WebGL2RenderingContext.BLEND_DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_DST_ALPHA = 0x80CA;
+
+  @DomName('WebGL2RenderingContext.BLEND_DST_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_DST_RGB = 0x80C8;
+
+  @DomName('WebGL2RenderingContext.BLEND_EQUATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION = 0x8009;
+
+  @DomName('WebGL2RenderingContext.BLEND_EQUATION_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION_ALPHA = 0x883D;
+
+  @DomName('WebGL2RenderingContext.BLEND_EQUATION_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION_RGB = 0x8009;
+
+  @DomName('WebGL2RenderingContext.BLEND_SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_SRC_ALPHA = 0x80CB;
+
+  @DomName('WebGL2RenderingContext.BLEND_SRC_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_SRC_RGB = 0x80C9;
+
+  @DomName('WebGL2RenderingContext.BLUE_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLUE_BITS = 0x0D54;
+
+  @DomName('WebGL2RenderingContext.BOOL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL = 0x8B56;
+
+  @DomName('WebGL2RenderingContext.BOOL_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC2 = 0x8B57;
+
+  @DomName('WebGL2RenderingContext.BOOL_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC3 = 0x8B58;
+
+  @DomName('WebGL2RenderingContext.BOOL_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC4 = 0x8B59;
+
+  @DomName('WebGL2RenderingContext.BROWSER_DEFAULT_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
+
+  @DomName('WebGL2RenderingContext.BUFFER_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BUFFER_SIZE = 0x8764;
+
+  @DomName('WebGL2RenderingContext.BUFFER_USAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BUFFER_USAGE = 0x8765;
+
+  @DomName('WebGL2RenderingContext.BYTE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BYTE = 0x1400;
+
+  @DomName('WebGL2RenderingContext.CCW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CCW = 0x0901;
+
+  @DomName('WebGL2RenderingContext.CLAMP_TO_EDGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CLAMP_TO_EDGE = 0x812F;
+
+  @DomName('WebGL2RenderingContext.COLOR_ATTACHMENT0')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_ATTACHMENT0 = 0x8CE0;
+
+  @DomName('WebGL2RenderingContext.COLOR_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_BUFFER_BIT = 0x00004000;
+
+  @DomName('WebGL2RenderingContext.COLOR_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_CLEAR_VALUE = 0x0C22;
+
+  @DomName('WebGL2RenderingContext.COLOR_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_WRITEMASK = 0x0C23;
+
+  @DomName('WebGL2RenderingContext.COMPILE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPILE_STATUS = 0x8B81;
+
+  @DomName('WebGL2RenderingContext.COMPRESSED_TEXTURE_FORMATS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
+
+  @DomName('WebGL2RenderingContext.CONSTANT_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONSTANT_ALPHA = 0x8003;
+
+  @DomName('WebGL2RenderingContext.CONSTANT_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONSTANT_COLOR = 0x8001;
+
+  @DomName('WebGL2RenderingContext.CONTEXT_LOST_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONTEXT_LOST_WEBGL = 0x9242;
+
+  @DomName('WebGL2RenderingContext.CULL_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CULL_FACE = 0x0B44;
+
+  @DomName('WebGL2RenderingContext.CULL_FACE_MODE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CULL_FACE_MODE = 0x0B45;
+
+  @DomName('WebGL2RenderingContext.CURRENT_PROGRAM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CURRENT_PROGRAM = 0x8B8D;
+
+  @DomName('WebGL2RenderingContext.CURRENT_VERTEX_ATTRIB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
+
+  @DomName('WebGL2RenderingContext.CW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CW = 0x0900;
+
+  @DomName('WebGL2RenderingContext.DECR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DECR = 0x1E03;
+
+  @DomName('WebGL2RenderingContext.DECR_WRAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DECR_WRAP = 0x8508;
+
+  @DomName('WebGL2RenderingContext.DELETE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DELETE_STATUS = 0x8B80;
+
+  @DomName('WebGL2RenderingContext.DEPTH_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_ATTACHMENT = 0x8D00;
+
+  @DomName('WebGL2RenderingContext.DEPTH_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_BITS = 0x0D56;
+
+  @DomName('WebGL2RenderingContext.DEPTH_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_BUFFER_BIT = 0x00000100;
+
+  @DomName('WebGL2RenderingContext.DEPTH_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_CLEAR_VALUE = 0x0B73;
+
+  @DomName('WebGL2RenderingContext.DEPTH_COMPONENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_COMPONENT = 0x1902;
+
+  @DomName('WebGL2RenderingContext.DEPTH_COMPONENT16')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_COMPONENT16 = 0x81A5;
+
+  @DomName('WebGL2RenderingContext.DEPTH_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_FUNC = 0x0B74;
+
+  @DomName('WebGL2RenderingContext.DEPTH_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_RANGE = 0x0B70;
+
+  @DomName('WebGL2RenderingContext.DEPTH_STENCIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_STENCIL = 0x84F9;
+
+  @DomName('WebGL2RenderingContext.DEPTH_STENCIL_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
+
+  @DomName('WebGL2RenderingContext.DEPTH_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_TEST = 0x0B71;
+
+  @DomName('WebGL2RenderingContext.DEPTH_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_WRITEMASK = 0x0B72;
+
+  @DomName('WebGL2RenderingContext.DITHER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DITHER = 0x0BD0;
+
+  @DomName('WebGL2RenderingContext.DONT_CARE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DONT_CARE = 0x1100;
+
+  @DomName('WebGL2RenderingContext.DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DST_ALPHA = 0x0304;
+
+  @DomName('WebGL2RenderingContext.DST_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DST_COLOR = 0x0306;
+
+  @DomName('WebGL2RenderingContext.DYNAMIC_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DYNAMIC_DRAW = 0x88E8;
+
+  @DomName('WebGL2RenderingContext.ELEMENT_ARRAY_BUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
+
+  @DomName('WebGL2RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
+
+  @DomName('WebGL2RenderingContext.EQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int EQUAL = 0x0202;
+
+  @DomName('WebGL2RenderingContext.FASTEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FASTEST = 0x1101;
+
+  @DomName('WebGL2RenderingContext.FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT = 0x1406;
+
+  @DomName('WebGL2RenderingContext.FLOAT_MAT2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT2 = 0x8B5A;
+
+  @DomName('WebGL2RenderingContext.FLOAT_MAT3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT3 = 0x8B5B;
+
+  @DomName('WebGL2RenderingContext.FLOAT_MAT4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT4 = 0x8B5C;
+
+  @DomName('WebGL2RenderingContext.FLOAT_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC2 = 0x8B50;
+
+  @DomName('WebGL2RenderingContext.FLOAT_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC3 = 0x8B51;
+
+  @DomName('WebGL2RenderingContext.FLOAT_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC4 = 0x8B52;
+
+  @DomName('WebGL2RenderingContext.FRAGMENT_SHADER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAGMENT_SHADER = 0x8B30;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER = 0x8D40;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_BINDING = 0x8CA6;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_COMPLETE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+
+  @DomName('WebGL2RenderingContext.FRAMEBUFFER_UNSUPPORTED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
+
+  @DomName('WebGL2RenderingContext.FRONT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT = 0x0404;
+
+  @DomName('WebGL2RenderingContext.FRONT_AND_BACK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT_AND_BACK = 0x0408;
+
+  @DomName('WebGL2RenderingContext.FRONT_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT_FACE = 0x0B46;
+
+  @DomName('WebGL2RenderingContext.FUNC_ADD')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_ADD = 0x8006;
+
+  @DomName('WebGL2RenderingContext.FUNC_REVERSE_SUBTRACT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
+
+  @DomName('WebGL2RenderingContext.FUNC_SUBTRACT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_SUBTRACT = 0x800A;
+
+  @DomName('WebGL2RenderingContext.GENERATE_MIPMAP_HINT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GENERATE_MIPMAP_HINT = 0x8192;
+
+  @DomName('WebGL2RenderingContext.GEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GEQUAL = 0x0206;
+
+  @DomName('WebGL2RenderingContext.GREATER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GREATER = 0x0204;
+
+  @DomName('WebGL2RenderingContext.GREEN_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GREEN_BITS = 0x0D53;
+
+  @DomName('WebGL2RenderingContext.HIGH_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int HIGH_FLOAT = 0x8DF2;
+
+  @DomName('WebGL2RenderingContext.HIGH_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int HIGH_INT = 0x8DF5;
+
+  @DomName('WebGL2RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
+
+  @DomName('WebGL2RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
+
+  @DomName('WebGL2RenderingContext.INCR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INCR = 0x1E02;
+
+  @DomName('WebGL2RenderingContext.INCR_WRAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INCR_WRAP = 0x8507;
+
+  @DomName('WebGL2RenderingContext.INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT = 0x1404;
+
+  @DomName('WebGL2RenderingContext.INT_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC2 = 0x8B53;
+
+  @DomName('WebGL2RenderingContext.INT_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC3 = 0x8B54;
+
+  @DomName('WebGL2RenderingContext.INT_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC4 = 0x8B55;
+
+  @DomName('WebGL2RenderingContext.INVALID_ENUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_ENUM = 0x0500;
+
+  @DomName('WebGL2RenderingContext.INVALID_FRAMEBUFFER_OPERATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
+
+  @DomName('WebGL2RenderingContext.INVALID_OPERATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_OPERATION = 0x0502;
+
+  @DomName('WebGL2RenderingContext.INVALID_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_VALUE = 0x0501;
+
+  @DomName('WebGL2RenderingContext.INVERT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVERT = 0x150A;
+
+  @DomName('WebGL2RenderingContext.KEEP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int KEEP = 0x1E00;
+
+  @DomName('WebGL2RenderingContext.LEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LEQUAL = 0x0203;
+
+  @DomName('WebGL2RenderingContext.LESS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LESS = 0x0201;
+
+  @DomName('WebGL2RenderingContext.LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR = 0x2601;
+
+  @DomName('WebGL2RenderingContext.LINEAR_MIPMAP_LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
+
+  @DomName('WebGL2RenderingContext.LINEAR_MIPMAP_NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
+
+  @DomName('WebGL2RenderingContext.LINES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINES = 0x0001;
+
+  @DomName('WebGL2RenderingContext.LINE_LOOP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_LOOP = 0x0002;
+
+  @DomName('WebGL2RenderingContext.LINE_STRIP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_STRIP = 0x0003;
+
+  @DomName('WebGL2RenderingContext.LINE_WIDTH')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_WIDTH = 0x0B21;
+
+  @DomName('WebGL2RenderingContext.LINK_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINK_STATUS = 0x8B82;
+
+  @DomName('WebGL2RenderingContext.LOW_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LOW_FLOAT = 0x8DF0;
+
+  @DomName('WebGL2RenderingContext.LOW_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LOW_INT = 0x8DF3;
+
+  @DomName('WebGL2RenderingContext.LUMINANCE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LUMINANCE = 0x1909;
+
+  @DomName('WebGL2RenderingContext.LUMINANCE_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LUMINANCE_ALPHA = 0x190A;
+
+  @DomName('WebGL2RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+
+  @DomName('WebGL2RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
+
+  @DomName('WebGL2RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
+
+  @DomName('WebGL2RenderingContext.MAX_RENDERBUFFER_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
+
+  @DomName('WebGL2RenderingContext.MAX_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
+
+  @DomName('WebGL2RenderingContext.MAX_TEXTURE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_TEXTURE_SIZE = 0x0D33;
+
+  @DomName('WebGL2RenderingContext.MAX_VARYING_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VARYING_VECTORS = 0x8DFC;
+
+  @DomName('WebGL2RenderingContext.MAX_VERTEX_ATTRIBS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_ATTRIBS = 0x8869;
+
+  @DomName('WebGL2RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
+
+  @DomName('WebGL2RenderingContext.MAX_VERTEX_UNIFORM_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
+
+  @DomName('WebGL2RenderingContext.MAX_VIEWPORT_DIMS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
+
+  @DomName('WebGL2RenderingContext.MEDIUM_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MEDIUM_FLOAT = 0x8DF1;
+
+  @DomName('WebGL2RenderingContext.MEDIUM_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MEDIUM_INT = 0x8DF4;
+
+  @DomName('WebGL2RenderingContext.MIRRORED_REPEAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MIRRORED_REPEAT = 0x8370;
+
+  @DomName('WebGL2RenderingContext.NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST = 0x2600;
+
+  @DomName('WebGL2RenderingContext.NEAREST_MIPMAP_LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
+
+  @DomName('WebGL2RenderingContext.NEAREST_MIPMAP_NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
+
+  @DomName('WebGL2RenderingContext.NEVER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEVER = 0x0200;
+
+  @DomName('WebGL2RenderingContext.NICEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NICEST = 0x1102;
+
+  @DomName('WebGL2RenderingContext.NONE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NONE = 0;
+
+  @DomName('WebGL2RenderingContext.NOTEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NOTEQUAL = 0x0205;
+
+  @DomName('WebGL2RenderingContext.NO_ERROR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NO_ERROR = 0;
+
+  @DomName('WebGL2RenderingContext.ONE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE = 1;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_CONSTANT_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_CONSTANT_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_DST_ALPHA = 0x0305;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_DST_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_DST_COLOR = 0x0307;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
+
+  @DomName('WebGL2RenderingContext.ONE_MINUS_SRC_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_SRC_COLOR = 0x0301;
+
+  @DomName('WebGL2RenderingContext.OUT_OF_MEMORY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int OUT_OF_MEMORY = 0x0505;
+
+  @DomName('WebGL2RenderingContext.PACK_ALIGNMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int PACK_ALIGNMENT = 0x0D05;
+
+  @DomName('WebGL2RenderingContext.POINTS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POINTS = 0x0000;
+
+  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_FACTOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_FACTOR = 0x8038;
+
+  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_FILL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_FILL = 0x8037;
+
+  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_UNITS = 0x2A00;
+
+  @DomName('WebGL2RenderingContext.RED_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RED_BITS = 0x0D52;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER = 0x8D41;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_ALPHA_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_BINDING = 0x8CA7;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_BLUE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_DEPTH_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_GREEN_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_HEIGHT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_HEIGHT = 0x8D43;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_INTERNAL_FORMAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_RED_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_STENCIL_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
+
+  @DomName('WebGL2RenderingContext.RENDERBUFFER_WIDTH')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_WIDTH = 0x8D42;
+
+  @DomName('WebGL2RenderingContext.RENDERER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERER = 0x1F01;
+
+  @DomName('WebGL2RenderingContext.REPEAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int REPEAT = 0x2901;
+
+  @DomName('WebGL2RenderingContext.REPLACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int REPLACE = 0x1E01;
+
+  @DomName('WebGL2RenderingContext.RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB = 0x1907;
+
+  @DomName('WebGL2RenderingContext.RGB565')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB565 = 0x8D62;
+
+  @DomName('WebGL2RenderingContext.RGB5_A1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB5_A1 = 0x8057;
+
+  @DomName('WebGL2RenderingContext.RGBA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGBA = 0x1908;
+
+  @DomName('WebGL2RenderingContext.RGBA4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGBA4 = 0x8056;
+
+  @DomName('WebGL2RenderingContext.SAMPLER_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLER_2D = 0x8B5E;
+
+  @DomName('WebGL2RenderingContext.SAMPLER_CUBE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLER_CUBE = 0x8B60;
+
+  @DomName('WebGL2RenderingContext.SAMPLES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLES = 0x80A9;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_ALPHA_TO_COVERAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_BUFFERS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_BUFFERS = 0x80A8;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE = 0x80A0;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE_INVERT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
+
+  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
+
+  @DomName('WebGL2RenderingContext.SCISSOR_BOX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SCISSOR_BOX = 0x0C10;
+
+  @DomName('WebGL2RenderingContext.SCISSOR_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SCISSOR_TEST = 0x0C11;
+
+  @DomName('WebGL2RenderingContext.SHADER_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHADER_TYPE = 0x8B4F;
+
+  @DomName('WebGL2RenderingContext.SHADING_LANGUAGE_VERSION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
+
+  @DomName('WebGL2RenderingContext.SHORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHORT = 0x1402;
+
+  @DomName('WebGL2RenderingContext.SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_ALPHA = 0x0302;
+
+  @DomName('WebGL2RenderingContext.SRC_ALPHA_SATURATE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_ALPHA_SATURATE = 0x0308;
+
+  @DomName('WebGL2RenderingContext.SRC_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_COLOR = 0x0300;
+
+  @DomName('WebGL2RenderingContext.STATIC_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STATIC_DRAW = 0x88E4;
+
+  @DomName('WebGL2RenderingContext.STENCIL_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_ATTACHMENT = 0x8D20;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_FAIL = 0x8801;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_FUNC = 0x8800;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_REF')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_REF = 0x8CA3;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_VALUE_MASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BACK_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BITS = 0x0D57;
+
+  @DomName('WebGL2RenderingContext.STENCIL_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BUFFER_BIT = 0x00000400;
+
+  @DomName('WebGL2RenderingContext.STENCIL_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_CLEAR_VALUE = 0x0B91;
+
+  @DomName('WebGL2RenderingContext.STENCIL_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_FAIL = 0x0B94;
+
+  @DomName('WebGL2RenderingContext.STENCIL_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_FUNC = 0x0B92;
+
+  @DomName('WebGL2RenderingContext.STENCIL_INDEX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_INDEX = 0x1901;
+
+  @DomName('WebGL2RenderingContext.STENCIL_INDEX8')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_INDEX8 = 0x8D48;
+
+  @DomName('WebGL2RenderingContext.STENCIL_PASS_DEPTH_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
+
+  @DomName('WebGL2RenderingContext.STENCIL_PASS_DEPTH_PASS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
+
+  @DomName('WebGL2RenderingContext.STENCIL_REF')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_REF = 0x0B97;
+
+  @DomName('WebGL2RenderingContext.STENCIL_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_TEST = 0x0B90;
+
+  @DomName('WebGL2RenderingContext.STENCIL_VALUE_MASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_VALUE_MASK = 0x0B93;
+
+  @DomName('WebGL2RenderingContext.STENCIL_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_WRITEMASK = 0x0B98;
+
+  @DomName('WebGL2RenderingContext.STREAM_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STREAM_DRAW = 0x88E0;
+
+  @DomName('WebGL2RenderingContext.SUBPIXEL_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SUBPIXEL_BITS = 0x0D50;
+
+  @DomName('WebGL2RenderingContext.TEXTURE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE = 0x1702;
+
+  @DomName('WebGL2RenderingContext.TEXTURE0')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE0 = 0x84C0;
+
+  @DomName('WebGL2RenderingContext.TEXTURE1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE1 = 0x84C1;
+
+  @DomName('WebGL2RenderingContext.TEXTURE10')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE10 = 0x84CA;
+
+  @DomName('WebGL2RenderingContext.TEXTURE11')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE11 = 0x84CB;
+
+  @DomName('WebGL2RenderingContext.TEXTURE12')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE12 = 0x84CC;
+
+  @DomName('WebGL2RenderingContext.TEXTURE13')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE13 = 0x84CD;
+
+  @DomName('WebGL2RenderingContext.TEXTURE14')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE14 = 0x84CE;
+
+  @DomName('WebGL2RenderingContext.TEXTURE15')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE15 = 0x84CF;
+
+  @DomName('WebGL2RenderingContext.TEXTURE16')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE16 = 0x84D0;
+
+  @DomName('WebGL2RenderingContext.TEXTURE17')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE17 = 0x84D1;
+
+  @DomName('WebGL2RenderingContext.TEXTURE18')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE18 = 0x84D2;
+
+  @DomName('WebGL2RenderingContext.TEXTURE19')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE19 = 0x84D3;
+
+  @DomName('WebGL2RenderingContext.TEXTURE2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE2 = 0x84C2;
+
+  @DomName('WebGL2RenderingContext.TEXTURE20')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE20 = 0x84D4;
+
+  @DomName('WebGL2RenderingContext.TEXTURE21')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE21 = 0x84D5;
+
+  @DomName('WebGL2RenderingContext.TEXTURE22')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE22 = 0x84D6;
+
+  @DomName('WebGL2RenderingContext.TEXTURE23')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE23 = 0x84D7;
+
+  @DomName('WebGL2RenderingContext.TEXTURE24')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE24 = 0x84D8;
+
+  @DomName('WebGL2RenderingContext.TEXTURE25')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE25 = 0x84D9;
+
+  @DomName('WebGL2RenderingContext.TEXTURE26')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE26 = 0x84DA;
+
+  @DomName('WebGL2RenderingContext.TEXTURE27')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE27 = 0x84DB;
+
+  @DomName('WebGL2RenderingContext.TEXTURE28')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE28 = 0x84DC;
+
+  @DomName('WebGL2RenderingContext.TEXTURE29')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE29 = 0x84DD;
+
+  @DomName('WebGL2RenderingContext.TEXTURE3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE3 = 0x84C3;
+
+  @DomName('WebGL2RenderingContext.TEXTURE30')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE30 = 0x84DE;
+
+  @DomName('WebGL2RenderingContext.TEXTURE31')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE31 = 0x84DF;
+
+  @DomName('WebGL2RenderingContext.TEXTURE4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE4 = 0x84C4;
+
+  @DomName('WebGL2RenderingContext.TEXTURE5')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE5 = 0x84C5;
+
+  @DomName('WebGL2RenderingContext.TEXTURE6')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE6 = 0x84C6;
+
+  @DomName('WebGL2RenderingContext.TEXTURE7')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE7 = 0x84C7;
+
+  @DomName('WebGL2RenderingContext.TEXTURE8')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE8 = 0x84C8;
+
+  @DomName('WebGL2RenderingContext.TEXTURE9')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE9 = 0x84C9;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_2D = 0x0DE1;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_BINDING_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_BINDING_2D = 0x8069;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_BINDING_CUBE_MAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP = 0x8513;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_MAG_FILTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_MAG_FILTER = 0x2800;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_MIN_FILTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_MIN_FILTER = 0x2801;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_WRAP_S')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_WRAP_S = 0x2802;
+
+  @DomName('WebGL2RenderingContext.TEXTURE_WRAP_T')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_WRAP_T = 0x2803;
+
+  @DomName('WebGL2RenderingContext.TRIANGLES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLES = 0x0004;
+
+  @DomName('WebGL2RenderingContext.TRIANGLE_FAN')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLE_FAN = 0x0006;
+
+  @DomName('WebGL2RenderingContext.TRIANGLE_STRIP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLE_STRIP = 0x0005;
+
+  @DomName('WebGL2RenderingContext.UNPACK_ALIGNMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_ALIGNMENT = 0x0CF5;
+
+  @DomName('WebGL2RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+
+  @DomName('WebGL2RenderingContext.UNPACK_FLIP_Y_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
+
+  @DomName('WebGL2RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_BYTE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_BYTE = 0x1401;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_INT = 0x1405;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT = 0x1403;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_4_4_4_4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_5_5_5_1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
+
+  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_5_6_5')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
+
+  @DomName('WebGL2RenderingContext.VALIDATE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VALIDATE_STATUS = 0x8B83;
+
+  @DomName('WebGL2RenderingContext.VENDOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VENDOR = 0x1F00;
+
+  @DomName('WebGL2RenderingContext.VERSION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERSION = 0x1F02;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
+
+  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
+
+  @DomName('WebGL2RenderingContext.VERTEX_SHADER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_SHADER = 0x8B31;
+
+  @DomName('WebGL2RenderingContext.VIEWPORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VIEWPORT = 0x0BA2;
+
+  @DomName('WebGL2RenderingContext.ZERO')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ZERO = 0;
+
+  @DomName('WebGL2RenderingContext.beginQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void beginQuery(int target, Query query) => _blink.BlinkWebGL2RenderingContext.instance.beginQuery_Callback_2_(unwrap_jso(this), target, unwrap_jso(query));
+  
+  @DomName('WebGL2RenderingContext.beginTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void beginTransformFeedback(int primitiveMode) => _blink.BlinkWebGL2RenderingContext.instance.beginTransformFeedback_Callback_1_(unwrap_jso(this), primitiveMode);
+  
+  @DomName('WebGL2RenderingContext.bindBufferBase')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindBufferBase(int target, int index, Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.bindBufferBase_Callback_3_(unwrap_jso(this), target, index, unwrap_jso(buffer));
+  
+  @DomName('WebGL2RenderingContext.bindBufferRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindBufferRange(int target, int index, Buffer buffer, int offset, int size) => _blink.BlinkWebGL2RenderingContext.instance.bindBufferRange_Callback_5_(unwrap_jso(this), target, index, unwrap_jso(buffer), offset, size);
+  
+  @DomName('WebGL2RenderingContext.bindSampler')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindSampler(int unit, Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.bindSampler_Callback_2_(unwrap_jso(this), unit, unwrap_jso(sampler));
+  
+  @DomName('WebGL2RenderingContext.bindTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindTransformFeedback(int target, TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.bindTransformFeedback_Callback_2_(unwrap_jso(this), target, unwrap_jso(feedback));
+  
+  @DomName('WebGL2RenderingContext.bindVertexArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.bindVertexArray_Callback_1_(unwrap_jso(this), unwrap_jso(vertexArray));
+  
+  @DomName('WebGL2RenderingContext.blitFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) => _blink.BlinkWebGL2RenderingContext.instance.blitFramebuffer_Callback_10_(unwrap_jso(this), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+  
+  @DomName('WebGL2RenderingContext.clearBufferfi')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearBufferfi(int buffer, int drawbuffer, num depth, int stencil) => _blink.BlinkWebGL2RenderingContext.instance.clearBufferfi_Callback_4_(unwrap_jso(this), buffer, drawbuffer, depth, stencil);
+  
+  void clearBufferfv(int buffer, int drawbuffer, value) {
+    if ((value is Float32List) && (drawbuffer is int) && (buffer is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferfv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<num>) && (drawbuffer is int) && (buffer is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferfv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void clearBufferiv(int buffer, int drawbuffer, value) {
+    if ((value is Int32List) && (drawbuffer is int) && (buffer is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferiv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<int>) && (drawbuffer is int) && (buffer is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferiv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void clearBufferuiv(int buffer, int drawbuffer, value) {
+    if ((value is Uint32List) && (drawbuffer is int) && (buffer is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferuiv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<int>) && (drawbuffer is int) && (buffer is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferuiv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.clientWaitSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int clientWaitSync(Sync sync, int flags, int timeout) => _blink.BlinkWebGL2RenderingContext.instance.clientWaitSync_Callback_3_(unwrap_jso(this), unwrap_jso(sync), flags, timeout);
+  
+  @DomName('WebGL2RenderingContext.compressedTexImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexImage3D_Callback_8_(unwrap_jso(this), target, level, internalformat, width, height, depth, border, unwrap_jso(data));
+  
+  @DomName('WebGL2RenderingContext.compressedTexSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexSubImage3D_Callback_10_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, width, height, depth, format, unwrap_jso(data));
+  
+  @DomName('WebGL2RenderingContext.copyBufferSubData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyBufferSubData(int readTarget, int writeTarget, int readOffset, int writeOffset, int size) => _blink.BlinkWebGL2RenderingContext.instance.copyBufferSubData_Callback_5_(unwrap_jso(this), readTarget, writeTarget, readOffset, writeOffset, size);
+  
+  @DomName('WebGL2RenderingContext.copyTexSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.copyTexSubImage3D_Callback_9_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, x, y, width, height);
+  
+  @DomName('WebGL2RenderingContext.createQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Query createQuery() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createQuery_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.createSampler')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Sampler createSampler() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createSampler_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.createTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  TransformFeedback createTransformFeedback() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createTransformFeedback_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.createVertexArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VertexArrayObject createVertexArray() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createVertexArray_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.deleteQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteQuery(Query query) => _blink.BlinkWebGL2RenderingContext.instance.deleteQuery_Callback_1_(unwrap_jso(this), unwrap_jso(query));
+  
+  @DomName('WebGL2RenderingContext.deleteSampler')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteSampler(Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.deleteSampler_Callback_1_(unwrap_jso(this), unwrap_jso(sampler));
+  
+  @DomName('WebGL2RenderingContext.deleteSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteSync(Sync sync) => _blink.BlinkWebGL2RenderingContext.instance.deleteSync_Callback_1_(unwrap_jso(this), unwrap_jso(sync));
+  
+  @DomName('WebGL2RenderingContext.deleteTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteTransformFeedback(TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.deleteTransformFeedback_Callback_1_(unwrap_jso(this), unwrap_jso(feedback));
+  
+  @DomName('WebGL2RenderingContext.deleteVertexArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.deleteVertexArray_Callback_1_(unwrap_jso(this), unwrap_jso(vertexArray));
+  
+  @DomName('WebGL2RenderingContext.drawArraysInstanced')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawArraysInstanced(int mode, int first, int count, int instanceCount) => _blink.BlinkWebGL2RenderingContext.instance.drawArraysInstanced_Callback_4_(unwrap_jso(this), mode, first, count, instanceCount);
+  
+  @DomName('WebGL2RenderingContext.drawBuffers')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawBuffers(List<int> buffers) => _blink.BlinkWebGL2RenderingContext.instance.drawBuffers_Callback_1_(unwrap_jso(this), buffers);
+  
+  @DomName('WebGL2RenderingContext.drawElementsInstanced')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawElementsInstanced(int mode, int count, int type, int offset, int instanceCount) => _blink.BlinkWebGL2RenderingContext.instance.drawElementsInstanced_Callback_5_(unwrap_jso(this), mode, count, type, offset, instanceCount);
+  
+  @DomName('WebGL2RenderingContext.drawRangeElements')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawRangeElements(int mode, int start, int end, int count, int type, int offset) => _blink.BlinkWebGL2RenderingContext.instance.drawRangeElements_Callback_6_(unwrap_jso(this), mode, start, end, count, type, offset);
+  
+  @DomName('WebGL2RenderingContext.endQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void endQuery(int target) => _blink.BlinkWebGL2RenderingContext.instance.endQuery_Callback_1_(unwrap_jso(this), target);
+  
+  @DomName('WebGL2RenderingContext.endTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void endTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.endTransformFeedback_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.fenceSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Sync fenceSync(int condition, int flags) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.fenceSync_Callback_2_(unwrap_jso(this), condition, flags));
+  
+  @DomName('WebGL2RenderingContext.framebufferTextureLayer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void framebufferTextureLayer(int target, int attachment, Texture texture, int level, int layer) => _blink.BlinkWebGL2RenderingContext.instance.framebufferTextureLayer_Callback_5_(unwrap_jso(this), target, attachment, unwrap_jso(texture), level, layer);
+  
+  @DomName('WebGL2RenderingContext.getActiveUniformBlockName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getActiveUniformBlockName(Program program, int uniformBlockIndex) => _blink.BlinkWebGL2RenderingContext.instance.getActiveUniformBlockName_Callback_2_(unwrap_jso(this), unwrap_jso(program), uniformBlockIndex);
+  
+  @DomName('WebGL2RenderingContext.getActiveUniformBlockParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getActiveUniformBlockParameter(Program program, int uniformBlockIndex, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getActiveUniformBlockParameter_Callback_3_(unwrap_jso(this), unwrap_jso(program), uniformBlockIndex, pname));
+  
+  @DomName('WebGL2RenderingContext.getActiveUniforms')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<int> getActiveUniforms(Program program, List<int> uniformIndices, int pname) => _blink.BlinkWebGL2RenderingContext.instance.getActiveUniforms_Callback_3_(unwrap_jso(this), unwrap_jso(program), uniformIndices, pname);
+  
+  @DomName('WebGL2RenderingContext.getBufferSubData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getBufferSubData(int target, int offset, ByteBuffer returnedData) => _blink.BlinkWebGL2RenderingContext.instance.getBufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(returnedData));
+  
+  @DomName('WebGL2RenderingContext.getFragDataLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getFragDataLocation(Program program, String name) => _blink.BlinkWebGL2RenderingContext.instance.getFragDataLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name);
+  
+  @DomName('WebGL2RenderingContext.getIndexedParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getIndexedParameter(int target, int index) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getIndexedParameter_Callback_2_(unwrap_jso(this), target, index));
+  
+  @DomName('WebGL2RenderingContext.getInternalformatParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getInternalformatParameter(int target, int internalformat, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getInternalformatParameter_Callback_3_(unwrap_jso(this), target, internalformat, pname));
+  
+  @DomName('WebGL2RenderingContext.getQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Query getQuery(int target, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getQuery_Callback_2_(unwrap_jso(this), target, pname));
+  
+  @DomName('WebGL2RenderingContext.getQueryParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getQueryParameter(Query query, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getQueryParameter_Callback_2_(unwrap_jso(this), unwrap_jso(query), pname));
+  
+  @DomName('WebGL2RenderingContext.getSamplerParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getSamplerParameter(Sampler sampler, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getSamplerParameter_Callback_2_(unwrap_jso(this), unwrap_jso(sampler), pname));
+  
+  @DomName('WebGL2RenderingContext.getSyncParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getSyncParameter(Sync sync, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getSyncParameter_Callback_2_(unwrap_jso(this), unwrap_jso(sync), pname));
+  
+  @DomName('WebGL2RenderingContext.getTransformFeedbackVarying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ActiveInfo getTransformFeedbackVarying(Program program, int index) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getTransformFeedbackVarying_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
+  
+  @DomName('WebGL2RenderingContext.getUniformBlockIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getUniformBlockIndex(Program program, String uniformBlockName) => _blink.BlinkWebGL2RenderingContext.instance.getUniformBlockIndex_Callback_2_(unwrap_jso(this), unwrap_jso(program), uniformBlockName);
+  
+  @DomName('WebGL2RenderingContext.getUniformIndices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<int> getUniformIndices(Program program, List<String> uniformNames) => _blink.BlinkWebGL2RenderingContext.instance.getUniformIndices_Callback_2_(unwrap_jso(this), unwrap_jso(program), uniformNames);
+  
+  @DomName('WebGL2RenderingContext.invalidateFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void invalidateFramebuffer(int target, List<int> attachments) => _blink.BlinkWebGL2RenderingContext.instance.invalidateFramebuffer_Callback_2_(unwrap_jso(this), target, attachments);
+  
+  @DomName('WebGL2RenderingContext.invalidateSubFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void invalidateSubFramebuffer(int target, List<int> attachments, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.invalidateSubFramebuffer_Callback_6_(unwrap_jso(this), target, attachments, x, y, width, height);
+  
+  @DomName('WebGL2RenderingContext.isQuery')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isQuery(Query query) => _blink.BlinkWebGL2RenderingContext.instance.isQuery_Callback_1_(unwrap_jso(this), unwrap_jso(query));
+  
+  @DomName('WebGL2RenderingContext.isSampler')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isSampler(Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.isSampler_Callback_1_(unwrap_jso(this), unwrap_jso(sampler));
+  
+  @DomName('WebGL2RenderingContext.isSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isSync(Sync sync) => _blink.BlinkWebGL2RenderingContext.instance.isSync_Callback_1_(unwrap_jso(this), unwrap_jso(sync));
+  
+  @DomName('WebGL2RenderingContext.isTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isTransformFeedback(TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.isTransformFeedback_Callback_1_(unwrap_jso(this), unwrap_jso(feedback));
+  
+  @DomName('WebGL2RenderingContext.isVertexArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.isVertexArray_Callback_1_(unwrap_jso(this), unwrap_jso(vertexArray));
+  
+  @DomName('WebGL2RenderingContext.pauseTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void pauseTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.pauseTransformFeedback_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.readBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void readBuffer(int mode) => _blink.BlinkWebGL2RenderingContext.instance.readBuffer_Callback_1_(unwrap_jso(this), mode);
+  
+  @DomName('WebGL2RenderingContext.renderbufferStorageMultisample')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void renderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.renderbufferStorageMultisample_Callback_5_(unwrap_jso(this), target, samples, internalformat, width, height);
+  
+  @DomName('WebGL2RenderingContext.resumeTransformFeedback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void resumeTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.resumeTransformFeedback_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.samplerParameterf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void samplerParameterf(Sampler sampler, int pname, num param) => _blink.BlinkWebGL2RenderingContext.instance.samplerParameterf_Callback_3_(unwrap_jso(this), unwrap_jso(sampler), pname, param);
+  
+  @DomName('WebGL2RenderingContext.samplerParameteri')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void samplerParameteri(Sampler sampler, int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.samplerParameteri_Callback_3_(unwrap_jso(this), unwrap_jso(sampler), pname, param);
+  
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, TypedData pixels) => _blink.BlinkWebGL2RenderingContext.instance.texImage3D_Callback_10_(unwrap_jso(this), target, level, internalformat, width, height, depth, border, format, type, unwrap_jso(pixels));
+  
+  @DomName('WebGL2RenderingContext.texStorage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texStorage2D(int target, int levels, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.texStorage2D_Callback_5_(unwrap_jso(this), target, levels, internalformat, width, height);
+  
+  @DomName('WebGL2RenderingContext.texStorage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texStorage3D(int target, int levels, int internalformat, int width, int height, int depth) => _blink.BlinkWebGL2RenderingContext.instance.texStorage3D_Callback_6_(unwrap_jso(this), target, levels, internalformat, width, height, depth);
+  
+  void texSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int format_OR_width, int height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video, [int format, int type, TypedData pixels]) {
+    if ((pixels is TypedData || pixels == null) && (type is int) && (format is int) && (canvas_OR_data_OR_depth_OR_image_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_11_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video), format, type, unwrap_jso(pixels));
+      return;
+    }
+    if ((canvas_OR_data_OR_depth_OR_image_OR_video is ImageData || canvas_OR_data_OR_depth_OR_image_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video));
+      return;
+    }
+    if ((canvas_OR_data_OR_depth_OR_image_OR_video is ImageElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video));
+      return;
+    }
+    if ((canvas_OR_data_OR_depth_OR_image_OR_video is CanvasElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video));
+      return;
+    }
+    if ((canvas_OR_data_OR_depth_OR_image_OR_video is VideoElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.transformFeedbackVaryings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void transformFeedbackVaryings(Program program, List<String> varyings, int bufferMode) => _blink.BlinkWebGL2RenderingContext.instance.transformFeedbackVaryings_Callback_3_(unwrap_jso(this), unwrap_jso(program), varyings, bufferMode);
+  
+  @DomName('WebGL2RenderingContext.uniform1ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1ui(UniformLocation location, int v0) => _blink.BlinkWebGL2RenderingContext.instance.uniform1ui_Callback_2_(unwrap_jso(this), unwrap_jso(location), v0);
+  
+  @DomName('WebGL2RenderingContext.uniform1uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform1uiv_Callback_2_(unwrap_jso(this), unwrap_jso(location), value);
+  
+  @DomName('WebGL2RenderingContext.uniform2ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2ui(UniformLocation location, int v0, int v1) => _blink.BlinkWebGL2RenderingContext.instance.uniform2ui_Callback_3_(unwrap_jso(this), unwrap_jso(location), v0, v1);
+  
+  @DomName('WebGL2RenderingContext.uniform2uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform2uiv_Callback_2_(unwrap_jso(this), unwrap_jso(location), value);
+  
+  @DomName('WebGL2RenderingContext.uniform3ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3ui(UniformLocation location, int v0, int v1, int v2) => _blink.BlinkWebGL2RenderingContext.instance.uniform3ui_Callback_4_(unwrap_jso(this), unwrap_jso(location), v0, v1, v2);
+  
+  @DomName('WebGL2RenderingContext.uniform3uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform3uiv_Callback_2_(unwrap_jso(this), unwrap_jso(location), value);
+  
+  @DomName('WebGL2RenderingContext.uniform4ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4ui(UniformLocation location, int v0, int v1, int v2, int v3) => _blink.BlinkWebGL2RenderingContext.instance.uniform4ui_Callback_5_(unwrap_jso(this), unwrap_jso(location), v0, v1, v2, v3);
+  
+  @DomName('WebGL2RenderingContext.uniform4uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform4uiv_Callback_2_(unwrap_jso(this), unwrap_jso(location), value);
+  
+  @DomName('WebGL2RenderingContext.uniformBlockBinding')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformBlockBinding(Program program, int uniformBlockIndex, int uniformBlockBinding) => _blink.BlinkWebGL2RenderingContext.instance.uniformBlockBinding_Callback_3_(unwrap_jso(this), unwrap_jso(program), uniformBlockIndex, uniformBlockBinding);
+  
+  void uniformMatrix2x3fv(UniformLocation location, bool transpose, value) {
+    if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix2x4fv(UniformLocation location, bool transpose, value) {
+    if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix3x2fv(UniformLocation location, bool transpose, value) {
+    if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix3x4fv(UniformLocation location, bool transpose, value) {
+    if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix4x2fv(UniformLocation location, bool transpose, value) {
+    if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix4x3fv(UniformLocation location, bool transpose, value) {
+    if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.vertexAttribDivisor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribDivisor(int index, int divisor) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribDivisor_Callback_2_(unwrap_jso(this), index, divisor);
+  
+  @DomName('WebGL2RenderingContext.vertexAttribI4i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribI4i(int index, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4i_Callback_5_(unwrap_jso(this), index, x, y, z, w);
+  
+  @DomName('WebGL2RenderingContext.vertexAttribI4iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribI4iv(int index, List<int> v) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4iv_Callback_2_(unwrap_jso(this), index, v);
+  
+  @DomName('WebGL2RenderingContext.vertexAttribI4ui')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribI4ui(int index, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4ui_Callback_5_(unwrap_jso(this), index, x, y, z, w);
+  
+  @DomName('WebGL2RenderingContext.vertexAttribI4uiv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribI4uiv(int index, List<int> v) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4uiv_Callback_2_(unwrap_jso(this), index, v);
+  
+  @DomName('WebGL2RenderingContext.vertexAttribIPointer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribIPointer(int index, int size, int type, int stride, int offset) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribIPointer_Callback_5_(unwrap_jso(this), index, size, type, stride, offset);
+  
+  @DomName('WebGL2RenderingContext.waitSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void waitSync(Sync sync, int flags, int timeout) => _blink.BlinkWebGL2RenderingContext.instance.waitSync_Callback_3_(unwrap_jso(this), unwrap_jso(sync), flags, timeout);
+  
+  @DomName('WebGL2RenderingContext.canvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasElement get canvas => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.canvas_Getter_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.drawingBufferHeight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get drawingBufferHeight => _blink.BlinkWebGL2RenderingContext.instance.drawingBufferHeight_Getter_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.drawingBufferWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get drawingBufferWidth => _blink.BlinkWebGL2RenderingContext.instance.drawingBufferWidth_Getter_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.activeTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void activeTexture(int texture) => _blink.BlinkWebGL2RenderingContext.instance.activeTexture_Callback_1_(unwrap_jso(this), texture);
+  
+  @DomName('WebGL2RenderingContext.attachShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void attachShader(Program program, Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.attachShader_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(shader));
+  
+  @DomName('WebGL2RenderingContext.bindAttribLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGL2RenderingContext.instance.bindAttribLocation_Callback_3_(unwrap_jso(this), unwrap_jso(program), index, name);
+  
+  @DomName('WebGL2RenderingContext.bindBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.bindBuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(buffer));
+  
+  @DomName('WebGL2RenderingContext.bindFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.bindFramebuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(framebuffer));
+  
+  @DomName('WebGL2RenderingContext.bindRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.bindRenderbuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(renderbuffer));
+  
+  @DomName('WebGL2RenderingContext.bindTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindTexture(int target, Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.bindTexture_Callback_2_(unwrap_jso(this), target, unwrap_jso(texture));
+  
+  @DomName('WebGL2RenderingContext.blendColor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGL2RenderingContext.instance.blendColor_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  
+  @DomName('WebGL2RenderingContext.blendEquation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendEquation(int mode) => _blink.BlinkWebGL2RenderingContext.instance.blendEquation_Callback_1_(unwrap_jso(this), mode);
+  
+  @DomName('WebGL2RenderingContext.blendEquationSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGL2RenderingContext.instance.blendEquationSeparate_Callback_2_(unwrap_jso(this), modeRGB, modeAlpha);
+  
+  @DomName('WebGL2RenderingContext.blendFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGL2RenderingContext.instance.blendFunc_Callback_2_(unwrap_jso(this), sfactor, dfactor);
+  
+  @DomName('WebGL2RenderingContext.blendFuncSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGL2RenderingContext.instance.blendFuncSeparate_Callback_4_(unwrap_jso(this), srcRGB, dstRGB, srcAlpha, dstAlpha);
+  
+  void bufferData(int target, data_OR_size, int usage) {
+    if ((usage is int) && (data_OR_size is int) && (target is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      return;
+    }
+    if ((usage is int) && (data_OR_size is TypedData) && (target is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      return;
+    }
+    if ((usage is int) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void bufferSubData(int target, int offset, data) {
+    if ((data is TypedData) && (offset is int) && (target is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(data));
+      return;
+    }
+    if ((data is ByteBuffer || data == null) && (offset is int) && (target is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(data));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.checkFramebufferStatus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int checkFramebufferStatus(int target) => _blink.BlinkWebGL2RenderingContext.instance.checkFramebufferStatus_Callback_1_(unwrap_jso(this), target);
+  
+  @DomName('WebGL2RenderingContext.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clear(int mask) => _blink.BlinkWebGL2RenderingContext.instance.clear_Callback_1_(unwrap_jso(this), mask);
+  
+  @DomName('WebGL2RenderingContext.clearColor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGL2RenderingContext.instance.clearColor_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  
+  @DomName('WebGL2RenderingContext.clearDepth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearDepth(num depth) => _blink.BlinkWebGL2RenderingContext.instance.clearDepth_Callback_1_(unwrap_jso(this), depth);
+  
+  @DomName('WebGL2RenderingContext.clearStencil')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearStencil(int s) => _blink.BlinkWebGL2RenderingContext.instance.clearStencil_Callback_1_(unwrap_jso(this), s);
+  
+  @DomName('WebGL2RenderingContext.colorMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGL2RenderingContext.instance.colorMask_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  
+  @DomName('WebGL2RenderingContext.compileShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compileShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.compileShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  
+  @DomName('WebGL2RenderingContext.compressedTexImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexImage2D_Callback_7_(unwrap_jso(this), target, level, internalformat, width, height, border, unwrap_jso(data));
+  
+  @DomName('WebGL2RenderingContext.compressedTexSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexSubImage2D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, width, height, format, unwrap_jso(data));
+  
+  @DomName('WebGL2RenderingContext.copyTexImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGL2RenderingContext.instance.copyTexImage2D_Callback_8_(unwrap_jso(this), target, level, internalformat, x, y, width, height, border);
+  
+  @DomName('WebGL2RenderingContext.copyTexSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.copyTexSubImage2D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, x, y, width, height);
+  
+  @DomName('WebGL2RenderingContext.createBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Buffer createBuffer() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createBuffer_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.createFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Framebuffer createFramebuffer() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createFramebuffer_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.createProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Program createProgram() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createProgram_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.createRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Renderbuffer createRenderbuffer() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createRenderbuffer_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.createShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Shader createShader(int type) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createShader_Callback_1_(unwrap_jso(this), type));
+  
+  @DomName('WebGL2RenderingContext.createTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Texture createTexture() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createTexture_Callback_0_(unwrap_jso(this)));
+  
+  @DomName('WebGL2RenderingContext.cullFace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cullFace(int mode) => _blink.BlinkWebGL2RenderingContext.instance.cullFace_Callback_1_(unwrap_jso(this), mode);
+  
+  @DomName('WebGL2RenderingContext.deleteBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  
+  @DomName('WebGL2RenderingContext.deleteFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteFramebuffer_Callback_1_(unwrap_jso(this), unwrap_jso(framebuffer));
+  
+  @DomName('WebGL2RenderingContext.deleteProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.deleteProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  
+  @DomName('WebGL2RenderingContext.deleteRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteRenderbuffer_Callback_1_(unwrap_jso(this), unwrap_jso(renderbuffer));
+  
+  @DomName('WebGL2RenderingContext.deleteShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.deleteShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  
+  @DomName('WebGL2RenderingContext.deleteTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteTexture(Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.deleteTexture_Callback_1_(unwrap_jso(this), unwrap_jso(texture));
+  
+  @DomName('WebGL2RenderingContext.depthFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthFunc(int func) => _blink.BlinkWebGL2RenderingContext.instance.depthFunc_Callback_1_(unwrap_jso(this), func);
+  
+  @DomName('WebGL2RenderingContext.depthMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthMask(bool flag) => _blink.BlinkWebGL2RenderingContext.instance.depthMask_Callback_1_(unwrap_jso(this), flag);
+  
+  @DomName('WebGL2RenderingContext.depthRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthRange(num zNear, num zFar) => _blink.BlinkWebGL2RenderingContext.instance.depthRange_Callback_2_(unwrap_jso(this), zNear, zFar);
+  
+  @DomName('WebGL2RenderingContext.detachShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void detachShader(Program program, Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.detachShader_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(shader));
+  
+  @DomName('WebGL2RenderingContext.disable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disable(int cap) => _blink.BlinkWebGL2RenderingContext.instance.disable_Callback_1_(unwrap_jso(this), cap);
+  
+  @DomName('WebGL2RenderingContext.disableVertexAttribArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disableVertexAttribArray(int index) => _blink.BlinkWebGL2RenderingContext.instance.disableVertexAttribArray_Callback_1_(unwrap_jso(this), index);
+  
+  @DomName('WebGL2RenderingContext.drawArrays')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGL2RenderingContext.instance.drawArrays_Callback_3_(unwrap_jso(this), mode, first, count);
+  
+  @DomName('WebGL2RenderingContext.drawElements')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGL2RenderingContext.instance.drawElements_Callback_4_(unwrap_jso(this), mode, count, type, offset);
+  
+  @DomName('WebGL2RenderingContext.enable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void enable(int cap) => _blink.BlinkWebGL2RenderingContext.instance.enable_Callback_1_(unwrap_jso(this), cap);
+  
+  @DomName('WebGL2RenderingContext.enableVertexAttribArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void enableVertexAttribArray(int index) => _blink.BlinkWebGL2RenderingContext.instance.enableVertexAttribArray_Callback_1_(unwrap_jso(this), index);
+  
+  @DomName('WebGL2RenderingContext.finish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void finish() => _blink.BlinkWebGL2RenderingContext.instance.finish_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.flush')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void flush() => _blink.BlinkWebGL2RenderingContext.instance.flush_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.framebufferRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.framebufferRenderbuffer_Callback_4_(unwrap_jso(this), target, attachment, renderbuffertarget, unwrap_jso(renderbuffer));
+  
+  @DomName('WebGL2RenderingContext.framebufferTexture2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGL2RenderingContext.instance.framebufferTexture2D_Callback_5_(unwrap_jso(this), target, attachment, textarget, unwrap_jso(texture), level);
+  
+  @DomName('WebGL2RenderingContext.frontFace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void frontFace(int mode) => _blink.BlinkWebGL2RenderingContext.instance.frontFace_Callback_1_(unwrap_jso(this), mode);
+  
+  @DomName('WebGL2RenderingContext.generateMipmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void generateMipmap(int target) => _blink.BlinkWebGL2RenderingContext.instance.generateMipmap_Callback_1_(unwrap_jso(this), target);
+  
+  @DomName('WebGL2RenderingContext.getActiveAttrib')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ActiveInfo getActiveAttrib(Program program, int index) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getActiveAttrib_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
+  
+  @DomName('WebGL2RenderingContext.getActiveUniform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ActiveInfo getActiveUniform(Program program, int index) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getActiveUniform_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
+  
+  @DomName('WebGL2RenderingContext.getAttachedShaders')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Shader> getAttachedShaders(Program program) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getAttachedShaders_Callback_1_(unwrap_jso(this), unwrap_jso(program)));
+  
+  @DomName('WebGL2RenderingContext.getAttribLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getAttribLocation(Program program, String name) => _blink.BlinkWebGL2RenderingContext.instance.getAttribLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name);
+  
+  @DomName('WebGL2RenderingContext.getBufferParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getBufferParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getBufferParameter_Callback_2_(unwrap_jso(this), target, pname));
+  
+  @DomName('WebGL2RenderingContext.getContextAttributes')
+  @DocsEditable()
+  @Experimental() // untriaged
+   getContextAttributes() => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getContextAttributes_Callback_0_(unwrap_jso(this))));
+  
+  @DomName('WebGL2RenderingContext.getError')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getError() => _blink.BlinkWebGL2RenderingContext.instance.getError_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.getExtension')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getExtension(String name) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getExtension_Callback_1_(unwrap_jso(this), name));
+  
+  @DomName('WebGL2RenderingContext.getFramebufferAttachmentParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getFramebufferAttachmentParameter_Callback_3_(unwrap_jso(this), target, attachment, pname));
+  
+  @DomName('WebGL2RenderingContext.getParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getParameter(int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getParameter_Callback_1_(unwrap_jso(this), pname));
+  
+  @DomName('WebGL2RenderingContext.getProgramInfoLog')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getProgramInfoLog(Program program) => _blink.BlinkWebGL2RenderingContext.instance.getProgramInfoLog_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  
+  @DomName('WebGL2RenderingContext.getProgramParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getProgramParameter(Program program, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getProgramParameter_Callback_2_(unwrap_jso(this), unwrap_jso(program), pname));
+  
+  @DomName('WebGL2RenderingContext.getRenderbufferParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getRenderbufferParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getRenderbufferParameter_Callback_2_(unwrap_jso(this), target, pname));
+  
+  @DomName('WebGL2RenderingContext.getShaderInfoLog')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.getShaderInfoLog_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  
+  @DomName('WebGL2RenderingContext.getShaderParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getShaderParameter(Shader shader, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getShaderParameter_Callback_2_(unwrap_jso(this), unwrap_jso(shader), pname));
+  
+  @DomName('WebGL2RenderingContext.getShaderPrecisionFormat')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getShaderPrecisionFormat_Callback_2_(unwrap_jso(this), shadertype, precisiontype));
+  
+  @DomName('WebGL2RenderingContext.getShaderSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getShaderSource(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.getShaderSource_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  
+  @DomName('WebGL2RenderingContext.getSupportedExtensions')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> getSupportedExtensions() => _blink.BlinkWebGL2RenderingContext.instance.getSupportedExtensions_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.getTexParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getTexParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getTexParameter_Callback_2_(unwrap_jso(this), target, pname));
+  
+  @DomName('WebGL2RenderingContext.getUniform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getUniform(Program program, UniformLocation location) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getUniform_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(location)));
+  
+  @DomName('WebGL2RenderingContext.getUniformLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  UniformLocation getUniformLocation(Program program, String name) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getUniformLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name));
+  
+  @DomName('WebGL2RenderingContext.getVertexAttrib')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getVertexAttrib(int index, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getVertexAttrib_Callback_2_(unwrap_jso(this), index, pname));
+  
+  @DomName('WebGL2RenderingContext.getVertexAttribOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGL2RenderingContext.instance.getVertexAttribOffset_Callback_2_(unwrap_jso(this), index, pname);
+  
+  @DomName('WebGL2RenderingContext.hint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void hint(int target, int mode) => _blink.BlinkWebGL2RenderingContext.instance.hint_Callback_2_(unwrap_jso(this), target, mode);
+  
+  @DomName('WebGL2RenderingContext.isBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isBuffer(Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.isBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  
+  @DomName('WebGL2RenderingContext.isContextLost')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isContextLost() => _blink.BlinkWebGL2RenderingContext.instance.isContextLost_Callback_0_(unwrap_jso(this));
+  
+  @DomName('WebGL2RenderingContext.isEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isEnabled(int cap) => _blink.BlinkWebGL2RenderingContext.instance.isEnabled_Callback_1_(unwrap_jso(this), cap);
+  
+  @DomName('WebGL2RenderingContext.isFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.isFramebuffer_Callback_1_(unwrap_jso(this), unwrap_jso(framebuffer));
+  
+  @DomName('WebGL2RenderingContext.isProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.isProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  
+  @DomName('WebGL2RenderingContext.isRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.isRenderbuffer_Callback_1_(unwrap_jso(this), unwrap_jso(renderbuffer));
+  
+  @DomName('WebGL2RenderingContext.isShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.isShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  
+  @DomName('WebGL2RenderingContext.isTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isTexture(Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.isTexture_Callback_1_(unwrap_jso(this), unwrap_jso(texture));
+  
+  @DomName('WebGL2RenderingContext.lineWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void lineWidth(num width) => _blink.BlinkWebGL2RenderingContext.instance.lineWidth_Callback_1_(unwrap_jso(this), width);
+  
+  @DomName('WebGL2RenderingContext.linkProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void linkProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.linkProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  
+  @DomName('WebGL2RenderingContext.pixelStorei')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void pixelStorei(int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.pixelStorei_Callback_2_(unwrap_jso(this), pname, param);
+  
+  @DomName('WebGL2RenderingContext.polygonOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void polygonOffset(num factor, num units) => _blink.BlinkWebGL2RenderingContext.instance.polygonOffset_Callback_2_(unwrap_jso(this), factor, units);
+  
+  @DomName('WebGL2RenderingContext.readPixels')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGL2RenderingContext.instance.readPixels_Callback_7_(unwrap_jso(this), x, y, width, height, format, type, unwrap_jso(pixels));
+  
+  @DomName('WebGL2RenderingContext.renderbufferStorage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.renderbufferStorage_Callback_4_(unwrap_jso(this), target, internalformat, width, height);
+  
+  @DomName('WebGL2RenderingContext.sampleCoverage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGL2RenderingContext.instance.sampleCoverage_Callback_2_(unwrap_jso(this), value, invert);
+  
+  @DomName('WebGL2RenderingContext.scissor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.scissor_Callback_4_(unwrap_jso(this), x, y, width, height);
+  
+  @DomName('WebGL2RenderingContext.shaderSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void shaderSource(Shader shader, String string) => _blink.BlinkWebGL2RenderingContext.instance.shaderSource_Callback_2_(unwrap_jso(this), unwrap_jso(shader), string);
+  
+  @DomName('WebGL2RenderingContext.stencilFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilFunc_Callback_3_(unwrap_jso(this), func, ref, mask);
+  
+  @DomName('WebGL2RenderingContext.stencilFuncSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilFuncSeparate_Callback_4_(unwrap_jso(this), face, func, ref, mask);
+  
+  @DomName('WebGL2RenderingContext.stencilMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilMask(int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilMask_Callback_1_(unwrap_jso(this), mask);
+  
+  @DomName('WebGL2RenderingContext.stencilMaskSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilMaskSeparate_Callback_2_(unwrap_jso(this), face, mask);
+  
+  @DomName('WebGL2RenderingContext.stencilOp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGL2RenderingContext.instance.stencilOp_Callback_3_(unwrap_jso(this), fail, zfail, zpass);
+  
+  @DomName('WebGL2RenderingContext.stencilOpSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGL2RenderingContext.instance.stencilOpSeparate_Callback_4_(unwrap_jso(this), face, fail, zfail, zpass);
+  
+  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, TypedData pixels]) {
+    if ((pixels is TypedData || pixels == null) && (type is int) && (format is int) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_9_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video), format, type, unwrap_jso(pixels));
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.texParameterf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGL2RenderingContext.instance.texParameterf_Callback_3_(unwrap_jso(this), target, pname, param);
+  
+  @DomName('WebGL2RenderingContext.texParameteri')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.texParameteri_Callback_3_(unwrap_jso(this), target, pname, param);
+  
+  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, TypedData pixels]) {
+    if ((pixels is TypedData || pixels == null) && (type is int) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_9_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video), type, unwrap_jso(pixels));
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.uniform1f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGL2RenderingContext.instance.uniform1f_Callback_2_(unwrap_jso(this), unwrap_jso(location), x);
+  
+  void uniform1fv(UniformLocation location, v) {
+    if ((v is Float32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<num>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.uniform1i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGL2RenderingContext.instance.uniform1i_Callback_2_(unwrap_jso(this), unwrap_jso(location), x);
+  
+  void uniform1iv(UniformLocation location, v) {
+    if ((v is Int32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<int>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.uniform2f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGL2RenderingContext.instance.uniform2f_Callback_3_(unwrap_jso(this), unwrap_jso(location), x, y);
+  
+  void uniform2fv(UniformLocation location, v) {
+    if ((v is Float32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<num>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.uniform2i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGL2RenderingContext.instance.uniform2i_Callback_3_(unwrap_jso(this), unwrap_jso(location), x, y);
+  
+  void uniform2iv(UniformLocation location, v) {
+    if ((v is Int32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<int>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.uniform3f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGL2RenderingContext.instance.uniform3f_Callback_4_(unwrap_jso(this), unwrap_jso(location), x, y, z);
+  
+  void uniform3fv(UniformLocation location, v) {
+    if ((v is Float32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<num>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.uniform3i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGL2RenderingContext.instance.uniform3i_Callback_4_(unwrap_jso(this), unwrap_jso(location), x, y, z);
+  
+  void uniform3iv(UniformLocation location, v) {
+    if ((v is Int32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<int>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.uniform4f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGL2RenderingContext.instance.uniform4f_Callback_5_(unwrap_jso(this), unwrap_jso(location), x, y, z, w);
+  
+  void uniform4fv(UniformLocation location, v) {
+    if ((v is Float32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<num>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.uniform4i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.uniform4i_Callback_5_(unwrap_jso(this), unwrap_jso(location), x, y, z, w);
+  
+  void uniform4iv(UniformLocation location, v) {
+    if ((v is Int32List) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    if ((v is List<int>) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix2fv(UniformLocation location, bool transpose, array) {
+    if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix3fv(UniformLocation location, bool transpose, array) {
+    if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void uniformMatrix4fv(UniformLocation location, bool transpose, array) {
+    if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.useProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void useProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.useProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  
+  @DomName('WebGL2RenderingContext.validateProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void validateProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.validateProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  
+  @DomName('WebGL2RenderingContext.vertexAttrib1f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1f_Callback_2_(unwrap_jso(this), indx, x);
+  
+  void vertexAttrib1fv(int indx, values) {
+    if ((values is Float32List) && (indx is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    if ((values is List<num>) && (indx is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.vertexAttrib2f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2f_Callback_3_(unwrap_jso(this), indx, x, y);
+  
+  void vertexAttrib2fv(int indx, values) {
+    if ((values is Float32List) && (indx is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    if ((values is List<num>) && (indx is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.vertexAttrib3f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3f_Callback_4_(unwrap_jso(this), indx, x, y, z);
+  
+  void vertexAttrib3fv(int indx, values) {
+    if ((values is Float32List) && (indx is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    if ((values is List<num>) && (indx is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.vertexAttrib4f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4f_Callback_5_(unwrap_jso(this), indx, x, y, z, w);
+  
+  void vertexAttrib4fv(int indx, values) {
+    if ((values is Float32List) && (indx is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    if ((values is List<num>) && (indx is int)) {
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGL2RenderingContext.vertexAttribPointer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribPointer_Callback_6_(unwrap_jso(this), indx, size, type, normalized, stride, offset);
+  
+  @DomName('WebGL2RenderingContext.viewport')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.viewport_Callback_4_(unwrap_jso(this), x, y, width, 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('WebGLSampler')
+@Experimental() // untriaged
+class Sampler extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory Sampler._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static Sampler internalCreateSampler() {
+    return new Sampler._internalWrap();
+  }
+
+  factory Sampler._internalWrap() {
+    return new Sampler.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  Sampler.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source 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 Shader extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
@@ -3655,6 +6721,36 @@
 
 
 @DocsEditable()
+@DomName('WebGLSync')
+@Experimental() // untriaged
+class Sync extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory Sync._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static Sync internalCreateSync() {
+    return new Sync._internalWrap();
+  }
+
+  factory Sync._internalWrap() {
+    return new Sync.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  Sync.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source 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 Texture extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
@@ -3684,6 +6780,36 @@
 
 
 @DocsEditable()
+@DomName('WebGLTransformFeedback')
+@Experimental() // untriaged
+class TransformFeedback extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory TransformFeedback._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static TransformFeedback internalCreateTransformFeedback() {
+    return new TransformFeedback._internalWrap();
+  }
+
+  factory TransformFeedback._internalWrap() {
+    return new TransformFeedback.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  TransformFeedback.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source 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 UniformLocation extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
@@ -3713,9 +6839,8 @@
 
 
 @DocsEditable()
-@DomName('WebGLVertexArrayObjectOES')
-// http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
-@Experimental() // experimental
+@DomName('WebGLVertexArrayObject')
+@Experimental() // untriaged
 class VertexArrayObject extends DartHtmlDomObject {
   // To suppress missing implicit constructor warnings.
   factory VertexArrayObject._() { throw new UnsupportedError("Not supported"); }
@@ -3744,6 +6869,67 @@
 
 
 @DocsEditable()
+@DomName('WebGLVertexArrayObjectOES')
+// http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
+@Experimental() // experimental
+class VertexArrayObjectOes extends DartHtmlDomObject {
+  // To suppress missing implicit constructor warnings.
+  factory VertexArrayObjectOes._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static VertexArrayObjectOes internalCreateVertexArrayObjectOes() {
+    return new VertexArrayObjectOes._internalWrap();
+  }
+
+  factory VertexArrayObjectOes._internalWrap() {
+    return new VertexArrayObjectOes.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  VertexArrayObjectOes.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('WebGL2RenderingContextBase')
+@Experimental() // untriaged
+class _WebGL2RenderingContextBase extends DartHtmlDomObject implements _WebGLRenderingContextBase {
+  // To suppress missing implicit constructor warnings.
+  factory _WebGL2RenderingContextBase._() { throw new UnsupportedError("Not supported"); }
+
+  @Deprecated("Internal Use Only")
+  static _WebGL2RenderingContextBase internalCreate_WebGL2RenderingContextBase() {
+    return new _WebGL2RenderingContextBase._internalWrap();
+  }
+
+  factory _WebGL2RenderingContextBase._internalWrap() {
+    return new _WebGL2RenderingContextBase.internal_();
+  }
+
+  @Deprecated("Internal Use Only")
+  _WebGL2RenderingContextBase.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('WebGLRenderingContextBase')
 @Experimental() // untriaged
 class _WebGLRenderingContextBase extends DartHtmlDomObject {
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index 433459d..7af7f45 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -15,7 +15,6 @@
 import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
-import 'dart:_js_helper' show convertDartClosureToJS, Creates, JSName, Native;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 // DO NOT EDIT - unless you are editing documentation as per:
@@ -23,6 +22,8 @@
 // Auto-generated dart:audio library.
 
 
+import 'dart:_js_helper' show convertDartClosureToJS, Creates, JSName, Native,
+    JavaScriptIndexingBehavior;
 
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -209,7 +210,7 @@
 // http://www.w3.org/TR/webdatabase/#sqlresultsetrowlist
 @Experimental() // deprecated
 @Native("SQLResultSetRowList")
-class SqlResultSetRowList extends Interceptor with ListMixin<Map>, ImmutableListMixin<Map> implements List<Map> {
+class SqlResultSetRowList extends Interceptor with ListMixin<Map>, ImmutableListMixin<Map> implements JavaScriptIndexingBehavior, List<Map> {
   // To suppress missing implicit constructor warnings.
   factory SqlResultSetRowList._() { throw new UnsupportedError("Not supported"); }
 
@@ -221,7 +222,7 @@
     if (JS("bool", "# >>> 0 !== # || # >= #", index,
         index, index, length))
       throw new RangeError.index(index, this);
-    return this.item(index);
+    return JS("Map", "#[#]", this, index);
   }
   void operator[]=(int index, Map value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -264,14 +265,7 @@
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
   @Creates('=Object')
-  Map item(int index) {
-    return convertNativeToDart_Dictionary(_item_1(index));
-  }
-  @JSName('item')
-  @DomName('SQLResultSetRowList.item')
-  @DocsEditable()
-  @Creates('=Object')
-  _item_1(index) native;
+  Object item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -292,5 +286,5 @@
 
   @DomName('SQLTransaction.executeSql')
   @DocsEditable()
-  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) native;
+  void executeSql(String sqlStatement, [List arguments, SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) native;
 }
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index c7e6c93..ee79e22 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -371,7 +371,7 @@
 
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
-  Map item(int index) => wrap_jso(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Object item(int index) => wrap_jso(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -407,8 +407,21 @@
   bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
   int get hashCode => unwrap_jso(this).hashCode;
 
-  @DomName('SQLTransaction.executeSql')
-  @DocsEditable()
-  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.BlinkSQLTransaction.instance.executeSql_Callback_4_(unwrap_jso(this), sqlStatement, unwrap_jso(arguments), unwrap_jso((transaction, resultSet) => callback(wrap_jso(transaction), wrap_jso(resultSet))), unwrap_jso((transaction, error) => errorCallback(wrap_jso(transaction), wrap_jso(error))));
-  
+  void executeSql(String sqlStatement, [List arguments, SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) {
+    if (errorCallback != null) {
+      _blink.BlinkSQLTransaction.instance.executeSql_Callback_4_(unwrap_jso(this), sqlStatement, arguments, unwrap_jso((transaction, resultSet) => callback(wrap_jso(transaction), wrap_jso(resultSet))), unwrap_jso((transaction, error) => errorCallback(wrap_jso(transaction), wrap_jso(error))));
+      return;
+    }
+    if (callback != null) {
+      _blink.BlinkSQLTransaction.instance.executeSql_Callback_3_(unwrap_jso(this), sqlStatement, arguments, unwrap_jso((transaction, resultSet) => callback(wrap_jso(transaction), wrap_jso(resultSet))));
+      return;
+    }
+    if (arguments != null) {
+      _blink.BlinkSQLTransaction.instance.executeSql_Callback_2_(unwrap_jso(this), sqlStatement, arguments);
+      return;
+    }
+    _blink.BlinkSQLTransaction.instance.executeSql_Callback_1_(unwrap_jso(this), sqlStatement);
+    return;
+  }
+
 }
diff --git a/tests/benchmark_smoke/benchmark_smoke.status b/tests/benchmark_smoke/benchmark_smoke.status
index 46f821f..188684a 100644
--- a/tests/benchmark_smoke/benchmark_smoke.status
+++ b/tests/benchmark_smoke/benchmark_smoke.status
@@ -8,3 +8,6 @@
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
+[ $compiler == dart2js && $cps_ir && $checked ]
+benchmark_smoke: Crash # `assert` not implemented
+
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 4ea29a4..7cc7d20 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -5,7 +5,9 @@
 [ $compiler == dart2analyzer ]
 
 WebPlatformTest/html/semantics/forms/the-textarea-element/textarea-type_t01: fail
+LayoutTests/fast/events/event-creation_t01: Skip # Roll 45 OverflowEvent removed
 LayoutTests/fast/forms/checkValidity-001_t01: fail
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: Skip # Roll 45 clipboardData changed
 Language/Expressions/Assignable_Expressions/syntax_t08: StaticWarning
 Language/Libraries_and_Scripts/Parts/compilation_t15: fail, pass # Issue 23595
 
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 8ee4e6d..71496c5 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -609,7 +609,6 @@
 LibTest/typed_data/Uint8ClampedList/map_A02_t01: Pass, Slow # Please triage this failure.
 
 [ $compiler == dart2js && $runtime == chrome ]
-
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
@@ -656,7 +655,6 @@
 LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost-restored_t01: Pass, Timeout # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
@@ -688,9 +686,11 @@
 LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css-generated-content/hit-test-generated-content_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/malformed-url_t01: Skip # Times out. Please triage this failure
@@ -759,6 +759,8 @@
 LayoutTests/fast/css/content-language-no-content_t01: RuntimeError # Issue 23506
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError # Issue https://github.com/dart-lang/co19/issues/46
+LayoutTests/fast/css/content/content-quotes-05_t01: RuntimeError # Issue https://github.com/dart-lang/co19/issues/46
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # co19 issue 14
@@ -809,6 +811,7 @@
 LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-nonascii_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # https://github.com/dart-lang/co19/issues/47
 LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-text-rendering_t01: RuntimeError # Please triage this failure
@@ -844,6 +847,7 @@
 LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # https://github.com/dart-lang/sdk/issues/25928
 LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Please triage this failure
@@ -954,6 +958,9 @@
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # https://github.com/dart-lang/co19/issues/49
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # https://github.com/dart-lang/co19/issues/49
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # https://github.com/dart-lang/co19/issues/49
 LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
@@ -1056,6 +1063,8 @@
 LayoutTests/fast/forms/textfield-focus-out_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/validationMessage_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/validity-property_t01: RuntimeError # Issue 25155
+LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError # https://github.com/dart-lang/co19/issues/48
+LayoutTests/fast/forms/ValidityState-tooLong-input_t01: RuntimeError # https://github.com/dart-lang/co19/issues/48
 LayoutTests/fast/forms/willvalidate_t01: RuntimeError # Issue 25155
 LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # Please triage this failure
@@ -1208,6 +1217,7 @@
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Issue 25928
 LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # Please triage this failure
@@ -1578,6 +1588,7 @@
 LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
@@ -1627,14 +1638,12 @@
 LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
@@ -1647,6 +1656,10 @@
 LayoutTests/fast/text/regional-indicator-symobls_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
 
+[ $compiler == dart2js && $runtime == chrome && $system == windows ]
+Language/Expressions/Bitwise_Expressions/method_invocation_super_t01: Pass, Slow # Issue 25940
+Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t04: Pass, Slow # Issue 25940
+
 [ $compiler == dart2js && $runtime == chrome && $system != linux ]
 LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Issue 24398
@@ -3159,6 +3172,11 @@
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/syntax/parsing/math-parse_t03: RuntimeError # Issue 22564
+Language/Classes/Getters/type_object_t02: RuntimeError, Slow # Issue 25940
+Language/Classes/Abstract_Instance_Members/override_no_named_parameters_t06: Pass, Slow # Issue 25940
+Language/Classes/Constructors/Factories/return_type_t03: Pass, Slow # Issue 25940
+Language/Classes/Constructors/Factories/return_wrong_type_t02: Pass, Slow # Issue 25940
+Language/Classes/Constructors/Factories/return_type_t05: Pass, Slow # Issue 25940
 
 [ $compiler == dart2js && $runtime == ff && $system != windows ]
 LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError # Please triage this failure
@@ -3855,6 +3873,7 @@
 LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # Issue 25941
 LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. Please triage this failure
@@ -9622,3 +9641,9 @@
 LibTest/core/Invocation/isGetter_A01_t01: RuntimeError # Please triage this failure.
 LibTest/core/Invocation/isSetter_A01_t02: RuntimeError # Please triage this failure.
 LibTest/core/Invocation/memberName_A01_t01: RuntimeError # Expect.equals(expected: <Symbol("bar=")>, actual: <Symbol("bar")>) fails.
+
+[ $compiler == dart2js && $cps_ir && $host_checked ]
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: Crash # CPS integrity violation After 'GVN' on function(main) Referenced out of scope: Instance of 'ReceiverCheck'
+
+[ $compiler == dart2js && $cps_ir && $checked ]
+*: Skip # `assert` not implemented, about 75% tests crash
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index eb9b059..76298ff 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -7,10 +7,14 @@
 
 [ $compiler == none && $runtime == dartium && $system == macos ]
 LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Skip # Depends on animation timing, commented as known to be flaky in test.  Will not fix.
+LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # 45 roll
 LayoutTests/fast/writing-mode/broken-ideographic-font_t01: Skip # Timing out on the bots. Please triage this failure.
 LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: Pass, RuntimeError # Issue 21605
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Issue 21605
 
+[ $compiler == none && $runtime == dartium && $checked  && $system == macos ]
+LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # 45 roll
+
 [ $compiler == none && $runtime == dartium && $system == windows ]
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Issue 21605
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure.
@@ -19,29 +23,31 @@
 LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError # co19-roll r761: Please triage this failure.
 
 [ $compiler == none && $runtime == dartium && ($system == windows || $system == linux) ]
-LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # 45 roll ArrayBuffer failure only on windows/linux.
+LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # 45 roll webgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
+
 
 [ $compiler == none && $runtime == dartium && $mode == debug ]
 WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: Skip # Issue 19495.
@@ -62,7 +68,7 @@
 LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-column-flex-items_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-flex-items_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError # co19-roll r786: Please triage this failure.
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: Skip # Timedout roll 45.
 LayoutTests/fast/css-intrinsic-dimensions/multicol_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-intrinsic-dimensions/tables_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -123,7 +129,7 @@
 LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/trivial-segments_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/trivial_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # https://github.com/dart-lang/co19/issues/21
+LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # Dartium 45 roll
 LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # co19-roll r722: Issue 18251
 WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -214,7 +220,6 @@
 LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/alpha_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: Skip # Times out. co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is behind a flag in Chrome
@@ -338,12 +343,10 @@
 LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: Pass, RuntimeError # Issue 22026
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: Pass, RuntimeError # Issue 22026
 LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Issue 25653
 LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: Pass, RuntimeError # Issue 22026
 LayoutTests/fast/canvas/webgl/webgl-specific_t01: Pass, RuntimeError # Issue 22026
 LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Issue 25653
-LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: Pass, RuntimeError # Issue 22026
 LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: Pass, RuntimeError # Issue 22026
 LayoutTests/fast/css-generated-content/bug91547_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/css-generated-content/hit-test-generated-content_t01: Skip # co19 issue 732.
@@ -394,35 +397,18 @@
 LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: Timeout # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/MarqueeLayoutTest_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/auto-min-size_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: Skip # co19 issue 732.
 LayoutTests/fast/css/computed-offset-with-zoom_t01: Skip # co19 issue 732.
-LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/content-language-multiple_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/content-language-no-content_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: Pass, RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -430,17 +416,10 @@
 LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/fontfaceset-events_t01: Pass, RuntimeError # Issue 23433
 LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/image-set-setting_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/important-js-override_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -449,32 +428,24 @@
 LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/nested-at-rules_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/parsing-text-rendering_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/pseudo-any_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/pseudo-valid-unapplied_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/string-quote-binary_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/style-element-process-crash_t01: Skip # Times out. co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -553,23 +524,19 @@
 LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/background-shorthand-csstext_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/css-cached-import-rule_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError # Test is incorrect.
-LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/dom/cssTarget-crash_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Bad test can't register HtmlElement.
 LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/dataset_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/empty-hash-and-search_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError # Chrome 39 roll. Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -579,8 +546,6 @@
 LayoutTests/fast/dom/option-properties_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/dom/shadow/form-in-shadow_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -589,9 +554,7 @@
 LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/dynamic/crash-generated-quote_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -599,9 +562,7 @@
 LayoutTests/fast/dynamic/insertAdjacentElement_t01: Skip # Timeout. co19-roll r786: Please triage this failure.
 LayoutTests/fast/dynamic/insertAdjacentHTML_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/encoding/css-charset-dom_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Timeout # Dartium 45 roll. Issue 25754
 LayoutTests/fast/events/clipboard-clearData_t01: Skip # Timeout. co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/clipboard-dataTransferItemList-remove_t01: RuntimeError # Issue 22532
@@ -619,7 +580,6 @@
 LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/nested-event-remove-node-crash_t01: Skip # Flaky timeout. co19-roll r786: Please triage this failure.
-LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/events/scoped/editing-commands_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
@@ -642,7 +602,6 @@
 LayoutTests/fast/filesystem/read-directory-many_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/filesystem/simple-readonly_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/forms/HTMLOptionElement_selected2_t01: Skip # Times out. co19-roll r801: Please triage this failure.
-LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/forms/autofocus-focus-only-once_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/forms/autofocus-opera-007_t01: Skip # Times out. co19-roll r801: Please triage this failure.
@@ -666,7 +625,6 @@
 LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/forms/input-hit-test-border_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Experimental feature not exposed in Chrome yet
-LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/forms/listbox-select-all_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # co19-roll r801: Please triage this failure.
@@ -692,7 +650,6 @@
 LayoutTests/fast/forms/textarea-scrollbar-height_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/forms/textarea-submit-crash_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/forms/textfield-focus-out_t01: Skip # Times out. co19-roll r801: Please triage this failure.
-LayoutTests/fast/forms/validationMessage_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/html/adjacent-html-context-element_t01:RuntimeError # co19 issue 11.
 LayoutTests/fast/html/hidden-attr_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # co19-roll r706.  Please triage this failure.
@@ -713,7 +670,6 @@
 LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/reattach-inlines-in-anonymous-blocks-with-out-of-flow-siblings_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/innerHTML/innerHTML-special-elements_t01: RuntimeError # co19 issue 11.
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/layers/zindex-hit-test_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
@@ -726,7 +682,7 @@
 LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/loadInProgress_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. co19-roll r801: Please triage this failure.
-LayoutTests/fast/loader/onload-policy-ignore-for-frame_t01: Timeout # Dartium 45 roll. Issue 25754
+LayoutTests/fast/loader/onload-policy-ignore-for-frame_t01: Timeout # Dartium 45 roll
 LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # co19-roll r801: Please triage this failure.
@@ -743,7 +699,6 @@
 LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/break-properties_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/column-width-zero_t01: Pass, RuntimeError # co19 issue 11.
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Dartium 45 roll. Issue 25754
 LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/fixed-column-percent-logical-height-orthogonal-writing-mode_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
@@ -803,13 +758,8 @@
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor-vertical-lr_t01: RuntimeError, Pass # Spurious intermittent pass # co19 issue 11.
 LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor_t01: RuntimeError, Pass # Spurious intermittent pass # co19 issue 11.
 LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Dartium 45 roll. Issue 25754
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError, Pass # Spurious intermittent pass. # co19 issue 11.
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: Timeout # Dartium 45 roll. Issue 25754
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError, Pass # Spurious intermittent pass # co19 issue 11.
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: Timeout # Dartium 45 roll. Issue 25754
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError, Pass, Timeout # Spurious intermittent pass. # co19 issue 11.
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError, Pass, Timeout # co19-roll r801: Please triage this failure.
 LayoutTests/fast/replaced/preferred-widths_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError # co19 issue 11.
 LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # co19-roll r801: Please triage this failure.
@@ -1244,7 +1194,7 @@
 WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # co19-roll r738: Please triage this failure.
-WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Dartium 45 roll. Issue 25754
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Dartium 45 roll
 WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.  Pass on macos.
 WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -1313,11 +1263,8 @@
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Dartium 45 roll. Issue 25754
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-005_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-006_t01: RuntimeError # Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Dartium 45 roll. Issue 25754
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Dartium 45 roll. Issue 25754
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -1344,10 +1291,61 @@
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # Dartium 45 roll. Issue 25754
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: Skip # Times out flakily. co19-roll r761: Please triage this failure.
 WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Skip # Times out flakily. co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/aspect-ratio-inheritance_t01: Skip # 45 Roll No longer supported.
+LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: Skip # 45 Roll No longer supported.
+LayoutTests/fast/css/auto-min-size_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/background-position-serialize_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/content-language-multiple_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/content-language-no-content_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: Skip # 45 Roll failure.
+LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/image-set-setting_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/important-js-override_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/MarqueeLayoutTest_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/nested-at-rules_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/parsing-text-rendering_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/pseudo-valid-unapplied_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/string-quote-binary_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # 45 Roll issue dart-lang/co19/issues/25
+LayoutTests/fast/dom/background-shorthand-csstext_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/dom/css-selectorText_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError #  45 Roll co19 issue https://github.com/dart-lang/co19/issues/36
+LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/26
+LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/27
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+LayoutTests/fast/encoding/css-charset-dom_t01: Skip #  45 Roll No longer supported see issue https://github.com/dart-lang/co19/issues/35
+LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: Skip #  45 Roll No longer supported.
+LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # 45 roll issue
+LayoutTests/fast/forms/validationMessage_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/28
+LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/29
+LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/34
+LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/30
+LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux but failed on mac bots.
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/31
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/32
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/33
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 0fc268d..57ac699 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -52,7 +52,6 @@
 Language/Libraries_and_Scripts/Imports/invalid_uri_t02: Fail
 Language/Libraries_and_Scripts/Exports/invalid_uri_t02: Fail
 Language/Libraries_and_Scripts/Parts/syntax_t06: Fail
-LibTest/math/MutableRectangle/MutableRectangle.fromPoints_A01_t01: Pass, RuntimeError # co19-roll r607: Please triage this failure
 
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $mode == debug ]
 LibTest/core/List/List_class_A01_t02: Pass, Slow
@@ -60,9 +59,6 @@
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && ($arch != x64 && $arch != simarm64 && $arch != arm64) ]
 LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
 
-[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $arch == mips ]
-LibTest/core/double/toInt_A01_t01: Fail
-
 [ ($compiler == none || $compiler == precompiler) && ($runtime == vm || $runtime == dart_precompiled) && ($arch == mips || $arch == arm64) ]
 # These tests take too much memory (300 MB) for our 1 GB test machine.
 # co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
@@ -70,10 +66,6 @@
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # co19 issue 673
 LibTest/collection/ListBase/ListBase_class_A01_t02: Skip # co19 issue 673
 
-[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $arch == mips && $mode == debug ]
-LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # Issue 17440
-LibTest/isolate/Isolate/spawn_A01_t04: Crash, Pass # Issue 17440
-
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && ($arch == simarm || $arch == simarmv6 || $arch == simarmv5te || $arch == simmips || $arch == simarm64) ]
 LibTest/core/Uri/Uri_A06_t03: Skip  # Timeout
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip  # Timeout
@@ -99,52 +91,57 @@
 
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) ]
 # co19 update Sep 29, 2015 (3ed795ea02e022ef19c77cf1b6095b7c8f5584d0)
-Language/Classes/Getters/type_object_t01: RuntimeError # Please triage this failure
-Language/Classes/Getters/type_object_t02: RuntimeError # Please triage this failure
-Language/Classes/Setters/syntax_t04: RuntimeError # Please triage this failure
-Language/Classes/Setters/type_object_t01: RuntimeError # Please triage this failure
-Language/Classes/Setters/type_object_t02: RuntimeError # Please triage this failure
-Language/Classes/Static_Methods/type_object_t01: RuntimeError # Please triage this failure
-Language/Classes/Static_Methods/type_object_t02: RuntimeError # Please triage this failure
-Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t01: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t02: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t03: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t04: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t05: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t06: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t01: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t02: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t03: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t04: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t05: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t06: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t07: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t08: MissingCompileTimeError # Please triage this failure
-Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t01: CompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/Imports/namespace_changes_t10: RuntimeError # Please triage this failure
-Language/Libraries_and_Scripts/Parts/compilation_t09: MissingCompileTimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t04: RuntimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t05: RuntimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t09: RuntimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t10: RuntimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t14: RuntimeError # Please triage this failure
-Language/Libraries_and_Scripts/URIs/syntax_t15: RuntimeError # Please triage this failure
-Language/Mixins/Mixin_Application/error_t01: MissingCompileTimeError # Please triage this failure
-Language/Mixins/Mixin_Application/error_t02: MissingCompileTimeError # Please triage this failure
-Language/Mixins/declaring_constructor_t01: MissingCompileTimeError # Please triage this failure
-Language/Mixins/not_object_superclass_t01: MissingCompileTimeError # Please triage this failure
-Language/Mixins/reference_to_super_t01: MissingCompileTimeError # Please triage this failure
+Language/Classes/Getters/type_object_t01: RuntimeError # Issue 23721
+Language/Classes/Getters/type_object_t02: RuntimeError # Issue 23721
+Language/Classes/Setters/syntax_t04: RuntimeError # co19 issue 38
+Language/Classes/Setters/type_object_t01: RuntimeError # Issue 23721
+Language/Classes/Setters/type_object_t02: RuntimeError # Issue 23721
+Language/Classes/Static_Methods/type_object_t01: RuntimeError # Issue 23721
+Language/Classes/Static_Methods/type_object_t02: RuntimeError # Issue 23721
+Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t01: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t02: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t03: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t04: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t05: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/General_Closurization/class_object_member_t06: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t01: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t02: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t03: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t04: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t05: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t06: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t07: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t08: MissingCompileTimeError # Issue 24472
+Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t01: CompileTimeError # co19 issue 41
+Language/Libraries_and_Scripts/Imports/namespace_changes_t10: RuntimeError # co19 issue 39
+Language/Libraries_and_Scripts/Parts/compilation_t09: MissingCompileTimeError # co19 issue 40
+Language/Libraries_and_Scripts/URIs/syntax_t04: RuntimeError # co19 issue 42
+Language/Libraries_and_Scripts/URIs/syntax_t05: RuntimeError # co19 issue 42
+Language/Libraries_and_Scripts/URIs/syntax_t09: RuntimeError # co19 issue 42
+Language/Libraries_and_Scripts/URIs/syntax_t10: RuntimeError # co19 issue 42
+Language/Libraries_and_Scripts/URIs/syntax_t14: RuntimeError # co19 issue 42
+Language/Libraries_and_Scripts/URIs/syntax_t15: RuntimeError # co19 issue 42
+Language/Mixins/Mixin_Application/error_t01: MissingCompileTimeError # co19 issue 43
+Language/Mixins/Mixin_Application/error_t02: MissingCompileTimeError # co19 issue 43
+Language/Mixins/declaring_constructor_t01: MissingCompileTimeError # co19 issue 43
+Language/Mixins/not_object_superclass_t01: MissingCompileTimeError # co19 issue 43 and 44
+Language/Mixins/reference_to_super_t01: MissingCompileTimeError # co19 issue 43 and 44
 
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $checked ]
-Language/Errors_and_Warnings/static_warning_t01: RuntimeError # Please triage this failure
-Language/Errors_and_Warnings/static_warning_t02: RuntimeError # Please triage this failure
-Language/Errors_and_Warnings/static_warning_t03: RuntimeError # Please triage this failure
-Language/Errors_and_Warnings/static_warning_t04: RuntimeError # Please triage this failure
-Language/Errors_and_Warnings/static_warning_t05: RuntimeError # Please triage this failure
-Language/Errors_and_Warnings/static_warning_t06: RuntimeError # Please triage this failure
+Language/Errors_and_Warnings/static_warning_t01: RuntimeError # co19 issue 45
+Language/Errors_and_Warnings/static_warning_t02: RuntimeError # co19 issue 45
+Language/Errors_and_Warnings/static_warning_t03: RuntimeError # co19 issue 45
+Language/Errors_and_Warnings/static_warning_t04: RuntimeError # co19 issue 45
+Language/Errors_and_Warnings/static_warning_t05: RuntimeError # co19 issue 45
+Language/Errors_and_Warnings/static_warning_t06: RuntimeError # co19 issue 45
+
+[ $noopt || $compiler == precompiler || $mode == product ]
+Language/Metadata/*: SkipByDesign # Uses dart:mirrors
+
+[ $runtime == dart_precompiled || $runtime == dart_product ]
+LibTest/isolate/Isolate/spawnUri*: Skip # Isolate.spawnUri
 
 [ $noopt || $compiler == precompiler ]
-Language/Metadata/*: SkipByDesign # Uses dart:mirrors
 LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Timeout
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Pass, Timeout
 LibTest/core/Map/Map_class_A01_t04: Pass, Timeout
@@ -152,16 +149,6 @@
 Language/Mixins/Mixin_Application/error_t01: Pass
 Language/Mixins/Mixin_Application/error_t02: Pass
 Language/Mixins/declaring_constructor_t01: Pass
-Language/Expressions/Property_Extraction/Named_Constructor_Extraction/deferred_type_t01: Pass
-
-[ $runtime == dart_precompiled ]
-LibTest/isolate/Isolate/spawnUri*: RuntimeError # Isolate.spawnUri
-Language/Expressions/Constants/identifier_denotes_a_constant_t05: Crash # Issue 25892
-Language/Expressions/Constants/static_method_t01: Crash # Issue 25892
-
-[ $runtime == dart_product ]
-LibTest/isolate/Isolate/spawnUri*: Skip # Isolate.spawnUri
-Language/Metadata/*: SkipByDesign # Uses dart:mirrors
 
 [ $runtime == vm && $mode == product ]
 LibTest/typed_data/Float32List/runtimeType_A01_t01: Fail,OK  # Expects exact type name.
diff --git a/tests/compiler/dart2js/analyze_api_test.dart b/tests/compiler/dart2js/analyze_api_test.dart
index d4f2f9f..908ae11 100644
--- a/tests/compiler/dart2js/analyze_api_test.dart
+++ b/tests/compiler/dart2js/analyze_api_test.dart
@@ -6,8 +6,8 @@
 
 import 'package:sdk_library_metadata/libraries.dart';
 import 'analyze_helper.dart';
-import "package:async_helper/async_helper.dart";
-
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
 /**
  * Map of white-listed warnings and errors.
  *
@@ -17,8 +17,7 @@
  * Use an identifiable suffix of the file uri as key. Use a fixed substring of
  * the error/warning message in the list of white-listings for each file.
  */
-// TODO(johnniwinther): Support canonical URIs as keys and message kinds as
-// values.
+// TODO(johnniwinther): Support canonical URIs as keys.
 const Map<String, List<String>> WHITE_LIST = const {
 };
 
diff --git a/tests/compiler/dart2js/analyze_test_test.dart b/tests/compiler/dart2js/analyze_test_test.dart
index f2565ac..5e28cf0 100644
--- a/tests/compiler/dart2js/analyze_test_test.dart
+++ b/tests/compiler/dart2js/analyze_test_test.dart
@@ -24,8 +24,7 @@
  * Use an identifiable suffix of the file uri as key. Use a fixed substring of
  * the error/warning message in the list of white-listings for each file.
  */
-// TODO(johnniwinther): Support canonical URIs as keys and message kinds as
-// values.
+// TODO(johnniwinther): Support canonical URIs as keys.
 const Map<String, List/*<String|MessageKind>*/> WHITE_LIST = const {
   // Several tests import mirrors; any of these might trigger the warning.
   ".dart": const [
diff --git a/tests/compiler/dart2js/class_set_test.dart b/tests/compiler/dart2js/class_set_test.dart
index 71fbd97..1d3b04f 100644
--- a/tests/compiler/dart2js/class_set_test.dart
+++ b/tests/compiler/dart2js/class_set_test.dart
@@ -411,7 +411,7 @@
     visited = <ClassElement>[];
     classSet.forEachSubclass((ClassElement cls) {
       visited.add(cls);
-      return ForEach.CONTINUE;
+      return IterationStep.CONTINUE;
     }, ClassHierarchyNode.ALL);
 
     Expect.listEquals(expected, visited,
@@ -444,7 +444,7 @@
     visited = <ClassElement>[];
     classSet.forEachSubtype((ClassElement cls) {
       visited.add(cls);
-      return ForEach.CONTINUE;
+      return IterationStep.CONTINUE;
     }, ClassHierarchyNode.ALL);
 
     Expect.listEquals(expected, visited,
@@ -478,14 +478,14 @@
     ClassSet classSet = world.getClassSet(cls);
     List<ClassElement> visited = <ClassElement>[];
 
-    ForEach visit(ClassElement cls) {
+    IterationStep visit(ClassElement cls) {
       visited.add(cls);
       if (cls == stop) {
-        return ForEach.STOP;
+        return IterationStep.STOP;
       } else if (skipSubclasses.contains(cls)) {
-        return ForEach.SKIP_SUBCLASSES;
+        return IterationStep.SKIP_SUBCLASSES;
       }
-      return ForEach.CONTINUE;
+      return IterationStep.CONTINUE;
     }
 
     if (forEachSubtype) {
diff --git a/tests/compiler/dart2js/cps_ir/expected/constructor_9.js b/tests/compiler/dart2js/cps_ir/expected/constructor_9.js
index 05928b3..6240573 100644
--- a/tests/compiler/dart2js/cps_ir/expected/constructor_9.js
+++ b/tests/compiler/dart2js/cps_ir/expected/constructor_9.js
@@ -9,7 +9,15 @@
 // }
 
 function($T) {
-  var v0 = H.setRuntimeTypeInfo(new V.C(), [$T]);
-  v0.C$0();
-  return v0;
+  var line = H.S(H.createRuntimeType(H.runtimeTypeToString($T)));
+  if (typeof dartPrint == "function")
+    dartPrint(line);
+  else if (typeof console == "object" && typeof console.log != "undefined")
+    console.log(line);
+  else if (!(typeof window == "object")) {
+    if (!(typeof print == "function"))
+      throw "Unable to print message: " + String(line);
+    print(line);
+  }
+  return H.setRuntimeTypeInfo(new V.C(), [$T]);
 }
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 888e95f..69b7f3d 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -49,8 +49,8 @@
 
 # Source information is not correct due to inlining.
 js_backend_cps_ir_source_information_test: Fail
-sourcemaps/source_mapping_operators_test: Fail, Slow # Issue 25304 for checked mode, was: Pass, Slow
-sourcemaps/source_mapping_invokes_test: Fail, Slow # Issue 25304 for checked mode, was: Pass, Slow
+sourcemaps/source_mapping_operators_test: Pass, Slow
+sourcemaps/source_mapping_invokes_test: Pass, Slow
 
 check_elements_invariants_test: Slow, Pass, Timeout # Slow due to inlining in the CPS backend
 
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index ad46907..c413241 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -57,7 +57,6 @@
 ]);
 
 Future<Compiler> check(MessageTemplate template, Compiler cachedCompiler) {
-  Expect.isNotNull(template.howToFix);
   Expect.isFalse(template.examples.isEmpty);
 
   return Future.forEach(template.examples, (example) {
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 3396e53..a69ce72 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -858,7 +858,7 @@
       DiagnosticCollector collector = compiler.diagnosticCollector;
       Expect.equals(1, collector.warnings.length,
                     'Unexpected warnings: ${collector.warnings}');
-      Expect.equals(MessageKind.MEMBER_NOT_FOUND,
+      Expect.equals(MessageKind.UNDEFINED_GETTER,
                     collector.warnings.first.message.kind);
       Expect.equals(0, collector.errors.length,
                     'Unexpected errors: ${collector.errors}');
@@ -1265,7 +1265,7 @@
           mname = () => null;
         }
       }
-      ''', [MessageKind.SETTER_NOT_FOUND]);
+      ''', [MessageKind.UNDEFINED_SETTER]);
   checkWarningOn('''
       main() { new B().bar(); }
       class B {
@@ -1274,7 +1274,7 @@
           this.mname = () => null;
         }
       }
-      ''', [MessageKind.SETTER_NOT_FOUND]);
+      ''', [MessageKind.UNDEFINED_SETTER]);
 
   // Can't override super methods
   checkWarningOn('''
@@ -1289,7 +1289,7 @@
       }
       ''', [MessageKind.ASSIGNING_METHOD_IN_SUPER,
             // TODO(johnniwinther): Avoid duplicate warnings.
-            MessageKind.SETTER_NOT_FOUND]);
+            MessageKind.UNDEFINED_SETTER]);
 
   // But index operators should be OK
   checkWarningOn('''
@@ -1321,22 +1321,22 @@
         final x = 1;
         x = 2;
       }
-      ''', [MessageKind.CANNOT_RESOLVE_SETTER]);
+      ''', [MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER]);
   checkWarningOn('''
       main() {
         const x = 1;
         x = 2;
       }
-      ''', [MessageKind.CANNOT_RESOLVE_SETTER]);
+      ''', [MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER]);
   checkWarningOn('''
       final x = 1;
       main() { x = 3; }
-      ''', [MessageKind.CANNOT_RESOLVE_SETTER]);
+      ''', [MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER]);
 
   checkWarningOn('''
       const x = 1;
       main() { x = 3; }
-      ''', [MessageKind.CANNOT_RESOLVE_SETTER]);
+      ''', [MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER]);
 
   // Detect assignments to final fields:
   checkWarningOn('''
@@ -1345,7 +1345,7 @@
         final x = 1;
         m() { x = 2; }
       }
-      ''', [MessageKind.SETTER_NOT_FOUND]);
+      ''', [MessageKind.UNDEFINED_SETTER]);
 
   // ... even if 'this' is explicit:
   checkWarningOn('''
@@ -1354,7 +1354,7 @@
         final x = 1;
         m() { this.x = 2; }
       }
-      ''', [MessageKind.SETTER_NOT_FOUND]);
+      ''', [MessageKind.UNDEFINED_SETTER]);
 
   // ... and in super class:
   checkWarningOn('''
@@ -1367,7 +1367,7 @@
       }
       ''', [MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
             // TODO(johnniwinther): Avoid duplicate warnings.
-            MessageKind.SETTER_NOT_FOUND]);
+            MessageKind.UNDEFINED_SETTER]);
 
   // But non-final fields are OK:
   checkWarningOn('''
@@ -1389,9 +1389,9 @@
       class B extends A {
         m() { super.x = 2; }
       }
-      ''', [MessageKind.SETTER_NOT_FOUND_IN_SUPER,
+      ''', [MessageKind.UNDEFINED_SUPER_SETTER,
             // TODO(johnniwinther): Avoid duplicate warnings.
-            MessageKind.SETTER_NOT_FOUND]);
+            MessageKind.UNDEFINED_SETTER]);
 }
 
 /// Helper to test that [script] produces all the given [warnings].
diff --git a/tests/compiler/dart2js/sourcemaps/diff.dart b/tests/compiler/dart2js/sourcemaps/diff.dart
index 6fb4468..4fd31c1 100644
--- a/tests/compiler/dart2js/sourcemaps/diff.dart
+++ b/tests/compiler/dart2js/sourcemaps/diff.dart
@@ -9,6 +9,7 @@
 import 'html_parts.dart';
 import 'output_structure.dart';
 import 'sourcemap_helper.dart';
+import 'sourcemap_html_helper.dart';
 
 enum DiffKind {
   UNMATCHED,
@@ -16,26 +17,97 @@
   IDENTICAL,
 }
 
+/// Id for an output column.
+class DiffColumn {
+  final String type;
+  final int index;
+
+  const DiffColumn(this.type, [this.index]);
+
+  int get hashCode => type.hashCode * 19 + index.hashCode * 23;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! DiffColumn) return false;
+    return type == other.type && index == other.index;
+  }
+
+  String toString() => '$type${index != null ? index : ''}';
+}
+
+/// A block of code in an output column.
+abstract class DiffColumnBlock {
+  void printHtmlOn(StringBuffer htmlBuffer, HtmlPrintContext context);
+}
+
+/// A block consisting of pure HTML parts.
+class PartsColumnBlock extends DiffColumnBlock {
+  final List<HtmlPart> parts;
+
+  PartsColumnBlock(this.parts);
+
+  void printHtmlOn(StringBuffer htmlBuffer, HtmlPrintContext context) {
+    if (parts.isNotEmpty) {
+      for (HtmlPart part in parts) {
+        part.printHtmlOn(htmlBuffer, context);
+      }
+    }
+  }
+}
+
+/// A block consisting of line-per-line JavaScript and source mapped Dart code.
+class CodeLinesColumnBlock extends DiffColumnBlock {
+  final List<CodeLine> jsCodeLines;
+  final Map<CodeLine, List<CodeLine>> jsToDartMap;
+
+  CodeLinesColumnBlock(this.jsCodeLines, this.jsToDartMap);
+
+  void printHtmlOn(StringBuffer htmlBuffer, HtmlPrintContext context) {
+    if (jsCodeLines.isNotEmpty) {
+      htmlBuffer.write('<table style="width:100%">');
+      for (CodeLine codeLine in jsCodeLines) {
+        htmlBuffer.write('<tr><td class="${ClassNames.innerCell}">');
+        codeLine.printHtmlOn(htmlBuffer, context);
+        htmlBuffer.write(
+            '</td><td '
+            'class="${ClassNames.innerCell} ${ClassNames.sourceMapped}">');
+        List<CodeLine> lines = jsToDartMap[codeLine];
+        if (lines != null) {
+          for (CodeLine line in lines) {
+            line.printHtmlOn(htmlBuffer,
+                context.from(includeAnnotation: (a) {
+                  CodeLineAnnotation annotation = a.data;
+                  return annotation.annotationType.isSourceMapped;
+                }));
+          }
+        }
+        htmlBuffer.write('</td></tr>');
+      }
+      htmlBuffer.write('</table>');
+    }
+  }
+}
+
 /// A list of columns that should align in output.
 class DiffBlock {
   final DiffKind kind;
-  List<List<HtmlPart>> columns = <List<HtmlPart>>[];
+  Map<DiffColumn, DiffColumnBlock> _columns = <DiffColumn, DiffColumnBlock>{};
 
   DiffBlock(this.kind);
 
-  void addColumn(int index, List<HtmlPart> lines) {
-    if (index >= columns.length) {
-      columns.length = index + 1;
-    }
-    columns[index] = lines;
+  void addColumnBlock(DiffColumn column, DiffColumnBlock block) {
+    _columns[column] = block;
   }
 
-  List<HtmlPart> getColumn(int index) {
-    List<HtmlPart> lines;
-    if (index < columns.length) {
-      lines = columns[index];
+  Iterable<DiffColumn> get columns => _columns.keys;
+
+  void printHtmlOn(DiffColumn column,
+                   StringBuffer htmlBuffer,
+                   HtmlPrintContext context) {
+    DiffColumnBlock block = _columns[column];
+    if (block != null) {
+      block.printHtmlOn(htmlBuffer, context);
     }
-    return lines != null ? lines : const <HtmlPart>[];
   }
 }
 
@@ -176,13 +248,47 @@
       : this.structures = structures,
         this.inputLines = structures.map((s) => s.lines).toList();
 
-  CodeSource codeSourceFromEntities(Iterable<OutputEntity> entities) {
+  /// Compute [CodeSource]s defined by [entities].
+  Iterable<CodeSource> codeSourceFromEntities(Iterable<OutputEntity> entities) {
+    Set<CodeSource> sources = new Set<CodeSource>();
     for (OutputEntity entity in entities) {
       if (entity.codeSource != null) {
-        return entity.codeSource;
+        sources.add(entity.codeSource);
       }
     }
-    return null;
+    return sources;
+  }
+
+  /// Create a block with the code from [codeSources]. The [CodeSource]s in
+  /// [mainSources] are tagged as original code sources, the rest as inlined
+  /// code sources.
+  DiffColumnBlock codeLinesFromCodeSources(
+      Iterable<CodeSource> mainSources,
+      Iterable<CodeSource> codeSources) {
+    List<HtmlPart> parts = <HtmlPart>[];
+    for (CodeSource codeSource in codeSources) {
+      //parts.addAll(codeLinesFromCodeSource(codeSource));
+      String className =
+          mainSources.contains(codeSource)
+              ? ClassNames.originalDart : ClassNames.inlinedDart;
+      parts.add(
+          new TagPart('div',
+              properties: {'class': className},
+              content: codeLinesFromCodeSource(codeSource)));
+    }
+    return new PartsColumnBlock(parts);
+  }
+
+  /// Adds all [CodeSource]s used in [dartCodeLines] to [codeSourceSet].
+  void collectCodeSources(Set<CodeSource> codeSourceSet,
+                          Map<CodeLine, List<CodeLine>> dartCodeLines) {
+    for (List<CodeLine> codeLines in dartCodeLines.values) {
+      for (CodeLine dartCodeLine in codeLines) {
+        if (dartCodeLine.lineAnnotation != null) {
+          codeSourceSet.add(dartCodeLine.lineAnnotation);
+        }
+      }
+    }
   }
 
   /// Checks that lines are added in sequence without gaps or duplicates.
@@ -210,13 +316,30 @@
   /// Creates a block containing the code lines in [range] from input number
   /// [index]. If [codeSource] is provided, the block will contain a
   /// corresponding Dart code column.
-  void handleSkew(int index, Interval range, [CodeSource codeSource]) {
+  void handleSkew(
+      int index,
+      Interval range,
+      [Iterable<CodeSource> mainCodeSources = const <CodeSource>[]]) {
+    if (range.isEmpty) return;
+
+    Set<CodeSource> codeSources = new Set<CodeSource>();
+    codeSources.addAll(mainCodeSources);
+
     DiffBlock block = new DiffBlock(DiffKind.UNMATCHED);
     checkLineInvariant(index, range);
-    block.addColumn(index, inputLines[index].sublist(range.from, range.to));
-    if (codeSource != null) {
-      block.addColumn(2,
-          codeLinesFromCodeSource(sourceFileManager, codeSource));
+    List<CodeLine> jsCodeLines =
+        inputLines[index].sublist(range.from, range.to);
+    Map<CodeLine, List<CodeLine>> dartCodeLines =
+        dartCodeLinesFromJsCodeLines(jsCodeLines);
+    block.addColumnBlock(
+        new DiffColumn('js', index),
+        new CodeLinesColumnBlock(jsCodeLines, dartCodeLines));
+    collectCodeSources(codeSources, dartCodeLines);
+
+    if (codeSources.isNotEmpty) {
+      block.addColumnBlock(
+          const DiffColumn('dart'),
+          codeLinesFromCodeSources(mainCodeSources, codeSources));
     }
     blocks.add(block);
   }
@@ -224,21 +347,38 @@
   /// Create a block containing the code lines in [ranges] from the
   /// corresponding JavaScript inputs. If [codeSource] is provided, the block
   /// will contain a corresponding Dart code column.
-  void addLines(DiffKind kind, List<Interval> ranges, [CodeSource codeSource]) {
+  void addLines(
+      DiffKind kind,
+      List<Interval> ranges,
+      [Iterable<CodeSource> mainCodeSources = const <CodeSource>[]]) {
+    if (ranges.every((range) => range.isEmpty)) return;
+
+    Set<CodeSource> codeSources = new Set<CodeSource>();
+    codeSources.addAll(mainCodeSources);
+
     DiffBlock block = new DiffBlock(kind);
     for (int i = 0; i < ranges.length; i++) {
       checkLineInvariant(i, ranges[i]);
-      block.addColumn(i, inputLines[i].sublist(ranges[i].from, ranges[i].to));
+      List<CodeLine> jsCodeLines =
+          inputLines[i].sublist(ranges[i].from, ranges[i].to);
+      Map<CodeLine, List<CodeLine>> dartCodeLines =
+              dartCodeLinesFromJsCodeLines(jsCodeLines);
+      block.addColumnBlock(
+          new DiffColumn('js', i),
+          new CodeLinesColumnBlock(jsCodeLines, dartCodeLines));
+      collectCodeSources(codeSources, dartCodeLines);
     }
-    if (codeSource != null) {
-      block.addColumn(2,
-          codeLinesFromCodeSource(sourceFileManager, codeSource));
+    if (codeSources.isNotEmpty) {
+      block.addColumnBlock(const DiffColumn('dart'),
+          codeLinesFromCodeSources(mainCodeSources, codeSources));
     }
     blocks.add(block);
   }
 
   /// Merge the code lines in [range1] and [range2] of the corresponding input.
   void addRaw(Interval range1, Interval range2) {
+    if (range1.isEmpty && range2.isEmpty) return;
+
     match(a, b) => a.code == b.code;
 
     List<Interval> currentMatchedIntervals;
@@ -413,32 +553,250 @@
 
     return blocks;
   }
+
+  /// Creates html lines for code lines in [codeSource]. The [sourceFileManager]
+  /// is used to read that text from the source URIs.
+  List<HtmlPart> codeLinesFromCodeSource(CodeSource codeSource) {
+    List<HtmlPart> lines = <HtmlPart>[];
+    SourceFile sourceFile = sourceFileManager.getSourceFile(codeSource.uri);
+    String elementName = codeSource.name;
+    HtmlLine line = new HtmlLine();
+    line.htmlParts.add(new ConstHtmlPart('<span class="comment">'));
+    line.htmlParts.add(new HtmlText(
+        '${elementName}: ${sourceFile.filename}'));
+    line.htmlParts.add(new ConstHtmlPart('</span>'));
+    lines.add(line);
+    if (codeSource.begin != null) {
+      int startLine = sourceFile.getLine(codeSource.begin);
+      int endLine = sourceFile.getLine(codeSource.end) + 1;
+      for (CodeLine codeLine in convertAnnotatedCodeToCodeLines(
+          sourceFile.slowText(),
+          const <Annotation>[],
+          startLine: startLine,
+          endLine: endLine)) {
+        codeLine.lineAnnotation = codeSource;
+        lines.add(codeLine);
+      }
+    }
+    return lines;
+  }
+
+  /// Creates a map from JavaScript [CodeLine]s in [jsCodeLines] to the Dart
+  /// [CodeLine]s references in the source information.
+  Map<CodeLine, List<CodeLine>> dartCodeLinesFromJsCodeLines(
+      List<CodeLine> jsCodeLines) {
+    Map<CodeLine, Interval> codeLineInterval = <CodeLine, Interval>{};
+    Map<CodeLine, List<CodeLine>> jsToDartMap = <CodeLine, List<CodeLine>>{};
+    List<Annotation> annotations = <Annotation>[];
+    Uri currentUri;
+    Interval interval;
+
+    Map<Uri, Set<CodeSource>> codeSourceMap = <Uri, Set<CodeSource>>{};
+
+    for (CodeLine jsCodeLine in jsCodeLines) {
+      for (Annotation annotation in jsCodeLine.annotations) {
+        CodeLineAnnotation codeLineAnnotation = annotation.data;
+        for (CodeSource codeSource in codeLineAnnotation.codeSources) {
+          codeSourceMap.putIfAbsent(codeSource.uri,
+              () => new Set<CodeSource>()).add(codeSource);
+        }
+      }
+    }
+
+    void flush() {
+      if (currentUri == null) return;
+
+      Set<CodeSource> codeSources = codeSourceMap[currentUri];
+      SourceFile sourceFile = sourceFileManager.getSourceFile(currentUri);
+      List<CodeLine> annotatedDartCodeLines =
+          convertAnnotatedCodeToCodeLines(
+              sourceFile.slowText(),
+              annotations,
+              startLine: interval.from,
+              endLine: interval.to,
+              uri: currentUri);
+      if (codeSources != null) {
+        CodeSource currentCodeSource;
+        Interval currentLineInterval;
+        for (CodeLine dartCodeLine in annotatedDartCodeLines) {
+          if (currentCodeSource == null ||
+              !currentLineInterval.contains(dartCodeLine.lineNo)) {
+            currentCodeSource = null;
+            for (CodeSource codeSource in codeSources) {
+              Interval interval = new Interval(
+                  sourceFile.getLine(codeSource.begin),
+                  sourceFile.getLine(codeSource.end) + 1);
+              if (interval.contains(dartCodeLine.lineNo)) {
+                currentCodeSource = codeSource;
+                currentLineInterval = interval;
+                break;
+              }
+            }
+          }
+          if (currentCodeSource != null) {
+            dartCodeLine.lineAnnotation = currentCodeSource;
+          }
+        }
+      }
+
+      int index = 0;
+      for (CodeLine jsCodeLine in codeLineInterval.keys) {
+        List<CodeLine> dartCodeLines =
+            jsToDartMap.putIfAbsent(jsCodeLine, () => <CodeLine>[]);
+        if (dartCodeLines.isEmpty && index < annotatedDartCodeLines.length) {
+          dartCodeLines.add(annotatedDartCodeLines[index++]);
+        }
+      }
+      while (index < annotatedDartCodeLines.length) {
+        jsToDartMap[codeLineInterval.keys.last].add(
+            annotatedDartCodeLines[index++]);
+      }
+
+      currentUri = null;
+    }
+
+    void restart(CodeLine codeLine, CodeLocation codeLocation, int line) {
+      flush();
+
+      currentUri = codeLocation.uri;
+      interval = new Interval(line, line + 1);
+      annotations = <Annotation>[];
+      codeLineInterval.clear();
+      codeLineInterval[codeLine] = interval;
+    }
+
+    for (CodeLine jsCodeLine in jsCodeLines) {
+      for (Annotation annotation in jsCodeLine.annotations) {
+        CodeLineAnnotation codeLineAnnotation = annotation.data;
+
+        for (CodeLocation location in codeLineAnnotation.codeLocations) {
+          SourceFile sourceFile = sourceFileManager.getSourceFile(location.uri);
+          int line = sourceFile.getLine(location.offset);
+          if (currentUri != location.uri) {
+            restart(jsCodeLine, location, line);
+          } else if (interval.inWindow(line, windowSize: 2)) {
+            interval = interval.include(line);
+            codeLineInterval[jsCodeLine] = interval;
+          } else {
+            restart(jsCodeLine, location, line);
+          }
+
+          annotations.add(new Annotation(
+              codeLineAnnotation.annotationType,
+              location.offset,
+              'id=${codeLineAnnotation.annotationId}',
+              data: codeLineAnnotation));
+        }
+      }
+    }
+    flush();
+    return jsToDartMap;
+  }
 }
 
-/// Creates html lines for code lines in [codeSource]. [sourceFileManager] is
-/// used to read that text from the source URIs.
-List<HtmlPart> codeLinesFromCodeSource(
-    SourceFileManager sourceFileManager,
-    CodeSource codeSource) {
-  List<HtmlPart> lines = <HtmlPart>[];
-  SourceFile sourceFile = sourceFileManager.getSourceFile(codeSource.uri);
-  String elementName = codeSource.name;
-  HtmlLine line = new HtmlLine();
-  line.htmlParts.add(new ConstHtmlPart('<span class="comment">'));
-  line.htmlParts.add(new HtmlText(
-      '${elementName}: ${sourceFile.filename}'));
-  line.htmlParts.add(new ConstHtmlPart('</span>'));
-  lines.add(line);
-  if (codeSource.begin != null) {
-    int startLine = sourceFile.getLine(codeSource.begin);
-    int endLine = sourceFile.getLine(codeSource.end);
-    for (int lineNo = startLine; lineNo <= endLine; lineNo++) {
-      String text = sourceFile.getLineText(lineNo);
-      CodeLine codeLine = new CodeLine(lineNo, sourceFile.getOffset(lineNo, 0));
-      codeLine.codeBuffer.write(text);
-      codeLine.htmlParts.add(new HtmlText(text));
-      lines.add(codeLine);
-    }
+const DiffColumn column_js0 = const DiffColumn('js', 0);
+const DiffColumn column_js1 = const DiffColumn('js', 1);
+const DiffColumn column_dart = const DiffColumn('dart');
+
+class ClassNames {
+  static String column(DiffColumn column) => 'column_${column}';
+  static String identical(bool alternate) =>
+      'identical${alternate ? '1' : '2'}';
+  static String corresponding(bool alternate) =>
+      'corresponding${alternate ? '1' : '2'}';
+
+  static const String buttons = 'buttons';
+  static const String comment = 'comment';
+  static const String header = 'header';
+  static const String headerTable = 'header_table';
+  static const String headerColumn = 'header_column';
+  static const String legend = 'legend';
+  static const String table = 'table';
+
+  static const String cell = 'cell';
+  static const String innerCell = 'inner_cell';
+
+  static const String originalDart = 'main_dart';
+  static const String inlinedDart = 'inlined_dart';
+
+  static const String line = 'line';
+  static const String lineNumber = 'line_number';
+  static String colored(int index) => 'colored${index}';
+
+  static const String withSourceInfo = 'with_source_info';
+  static const String withoutSourceInfo = 'without_source_info';
+  static const String additionalSourceInfo = 'additional_source_info';
+  static const String unusedSourceInfo = 'unused_source_info';
+
+  static const String sourceMapped = 'source_mapped';
+  static const String sourceMapping = 'source_mapping';
+  static String sourceMappingIndex(int index) => 'source_mapping${index}';
+
+  static const String markers = 'markers';
+  static const String marker = 'marker';
+}
+
+class AnnotationType {
+  static const WITH_SOURCE_INFO =
+      const AnnotationType(0, ClassNames.withSourceInfo, true);
+  static const WITHOUT_SOURCE_INFO =
+      const AnnotationType(1, ClassNames.withoutSourceInfo, false);
+  static const ADDITIONAL_SOURCE_INFO =
+      const AnnotationType(2, ClassNames.additionalSourceInfo, true);
+  static const UNUSED_SOURCE_INFO =
+      const AnnotationType(3, ClassNames.unusedSourceInfo, false);
+
+  final int index;
+  final String className;
+  final bool isSourceMapped;
+
+  const AnnotationType(this.index, this.className, this.isSourceMapped);
+
+  static const List<AnnotationType> values = const <AnnotationType>[
+    WITH_SOURCE_INFO,
+    WITHOUT_SOURCE_INFO,
+    ADDITIONAL_SOURCE_INFO,
+    UNUSED_SOURCE_INFO];
+}
+
+class CodeLineAnnotation {
+  final int annotationId;
+  final AnnotationType annotationType;
+  final List<CodeLocation> codeLocations;
+  final List<CodeSource> codeSources;
+  final String stepInfo;
+  int sourceMappingIndex;
+
+  CodeLineAnnotation(
+      {this.annotationId,
+       this.annotationType,
+       this.codeLocations,
+       this.codeSources,
+       this.stepInfo,
+       this.sourceMappingIndex});
+
+  Map toJson(JsonStrategy strategy) {
+    return {
+      'annotationId': annotationId,
+      'annotationType': annotationType.index,
+      'codeLocations': codeLocations.map((l) => l.toJson(strategy)).toList(),
+      'codeSources': codeSources.map((c) => c.toJson()).toList(),
+      'stepInfo': stepInfo,
+      'sourceMappingIndex': sourceMappingIndex,
+    };
   }
-  return lines;
+
+  static fromJson(Map json, JsonStrategy strategy) {
+    return new CodeLineAnnotation(
+        annotationId: json['id'],
+        annotationType: AnnotationType.values[json['annotationType']],
+        codeLocations: json['codeLocations']
+            .map((j) => CodeLocation.fromJson(j, strategy))
+            .toList(),
+        codeSources: json['codeSources']
+            .map((j) => CodeSource.fromJson(j))
+            .toList(),
+        stepInfo: json['stepInfo'],
+        sourceMappingIndex: json['sourceMappingIndex']);
+  }
 }
diff --git a/tests/compiler/dart2js/sourcemaps/diff_view.dart b/tests/compiler/dart2js/sourcemaps/diff_view.dart
index c58a21e..1c1090a 100644
--- a/tests/compiler/dart2js/sourcemaps/diff_view.dart
+++ b/tests/compiler/dart2js/sourcemaps/diff_view.dart
@@ -8,6 +8,7 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:compiler/src/common.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/diagnostics/invariant.dart';
 import 'package:compiler/src/elements/elements.dart';
@@ -25,11 +26,6 @@
 import 'sourcemap_html_helper.dart';
 import 'trace_graph.dart';
 
-const String WITH_SOURCE_INFO_STYLE = 'border: solid 1px #FF8080;';
-const String WITHOUT_SOURCE_INFO_STYLE = 'background-color: #8080FF;';
-const String ADDITIONAL_SOURCE_INFO_STYLE = 'border: solid 1px #80FF80;';
-const String UNUSED_SOURCE_INFO_STYLE = 'border: solid 1px #8080FF;';
-
 main(List<String> args) async {
   DEBUG_MODE = true;
   String out = 'out.js.diff_view.html';
@@ -39,14 +35,14 @@
   Map<int, String> loadFrom = {};
   Map<int, String> saveTo = {};
   int argGroup = 0;
-  bool addAnnotations = true;
+  bool showAnnotations = true;
   for (String arg in args) {
     if (arg == '--') {
       currentOptions = [];
       optionSegments.add(currentOptions);
       argGroup++;
     } else if (arg == '-h') {
-      addAnnotations = false;
+      showAnnotations = false;
       print('Hiding annotations');
     } else if (arg == '-l') {
       loadFrom[argGroup] = 'out.js.diff$argGroup.json';
@@ -71,8 +67,9 @@
   if (optionSegments.length == 1) {
     // Use default options; comparing SSA and CPS output using the new
     // source information strategy.
-    options.add([USE_NEW_SOURCE_INFO]..addAll(commonArguments));
-    options.add([USE_NEW_SOURCE_INFO, Flags.useCpsIr]..addAll(commonArguments));
+    options.add([Flags.useNewSourceInfo]..addAll(commonArguments));
+    options.add(
+        [Flags.useNewSourceInfo, Flags.useCpsIr]..addAll(commonArguments));
   } else if (optionSegments.length == 2) {
     // Use alternative options for the second output column.
     options.add(commonArguments);
@@ -92,7 +89,7 @@
     } else {
       print('Compiling ${options[i].join(' ')} $filename');
       CodeLinesResult result = await computeCodeLines(
-          options[i], filename, addAnnotations: addAnnotations);
+          options[i], filename);
       OutputStructure structure = OutputStructure.parse(result.codeLines);
       computeEntityCodeSources(result, structure);
       output = new AnnotatedOutput(
@@ -112,7 +109,9 @@
       sourceFileManager);
 
   outputDiffView(
-      out, outputs, blocks, addAnnotations: addAnnotations);
+      out, outputs, blocks,
+      showMarkers: showAnnotations,
+      showSourceMapped: showAnnotations);
 }
 
 /// Attaches [CodeSource]s to the entities in [structure] using the
@@ -127,6 +126,44 @@
   });
 }
 
+class CodeLineAnnotationJsonStrategy implements JsonStrategy {
+  const CodeLineAnnotationJsonStrategy();
+
+  Map encodeAnnotation(Annotation annotation) {
+    CodeLineAnnotation data = annotation.data;
+    return {
+      'id': annotation.id,
+      'codeOffset': annotation.codeOffset,
+      'title': annotation.title,
+      'data': data.toJson(this),
+    };
+  }
+
+  Annotation decodeAnnotation(Map json) {
+    return new Annotation(
+        json['id'],
+        json['codeOffset'],
+        json['title'],
+        data: CodeLineAnnotation.fromJson(json['data'], this));
+  }
+
+  @override
+  decodeLineAnnotation(json) {
+    if (json != null) {
+      return CodeSource.fromJson(json);
+    }
+    return null;
+  }
+
+  @override
+  encodeLineAnnotation(CodeSource lineAnnotation) {
+    if (lineAnnotation != null) {
+      return lineAnnotation.toJson();
+    }
+    return null;
+  }
+}
+
 /// The structured output of a compilation.
 class AnnotatedOutput {
   final String filename;
@@ -142,7 +179,7 @@
     return {
       'filename': filename,
       'options': options,
-      'structure': structure.toJson(),
+      'structure': structure.toJson(const CodeLineAnnotationJsonStrategy()),
       'coverage': coverage,
     };
   }
@@ -150,7 +187,8 @@
   static AnnotatedOutput fromJson(Map json) {
     String filename = json['filename'];
     List<String> options = json['options'];
-    OutputStructure structure = OutputStructure.fromJson(json['structure']);
+    OutputStructure structure = OutputStructure.fromJson(
+        json['structure'], const CodeLineAnnotationJsonStrategy());
     String coverage = json['coverage'];
     return new AnnotatedOutput(filename, options, structure, coverage);
   }
@@ -175,7 +213,8 @@
     String out,
     List<AnnotatedOutput> outputs,
     List<DiffBlock> blocks,
-    {bool addAnnotations: true}) {
+    {bool showMarkers: true,
+     bool showSourceMapped: true}) {
   assert(outputs[0].filename == outputs[1].filename);
   bool usePre = true;
 
@@ -185,16 +224,16 @@
 <head>
 <title>Diff for ${outputs[0].filename}</title>
 <style>
-.lineNumber {
+.${ClassNames.lineNumber} {
   font-size: smaller;
   color: #888;
 }
-.comment {
+.${ClassNames.comment} {
   font-size: smaller;
   color: #888;
   font-family: initial;
 }
-.header {
+.${ClassNames.header} {
   position: fixed;
   width: 100%;
   background-color: #FFFFFF;
@@ -203,31 +242,39 @@
   height: 42px;
   z-index: 1000;
 }
-.header-table {
+.${ClassNames.headerTable} {
   width: 100%;
   background-color: #400000;
   color: #FFFFFF;
   border-spacing: 0px;
 }
-.header-column {
-  width: 34%;
+.${ClassNames.headerColumn} {
 }
-.legend {
+.${ClassNames.legend} {
   padding: 2px;
 }
-.table {
+.${ClassNames.buttons} {
+  position: fixed;
+  right: 0px;
+  top: 0px;
+  width: 220px;
+  background-color: #FFFFFF;
+  border: 1px solid #C0C0C0;
+  z-index: 2000;
+}
+.${ClassNames.table} {
   position: absolute;
   left: 0px;
   top: 42px;
   width: 100%;
   border-spacing: 0px;
 }
-.cell {
-  max-width: 500px;
+.${ClassNames.cell}, 
+.${ClassNames.innerCell}, 
+.${ClassNames.originalDart}, 
+.${ClassNames.inlinedDart} {
   overflow-y: hidden;
   vertical-align: top;
-  border-top: 1px solid #F0F0F0;
-  border-left: 1px solid #F0F0F0;
 ''');
   if (usePre) {
     sb.write('''
@@ -245,89 +292,191 @@
   font-family: monospace;
   padding: 0px;
 }
-.corresponding1 {
+.${ClassNames.cell} {
+  border-top: 1px solid #F0F0F0;
+  border-left: 1px solid #C0C0C0;
+}
+.${ClassNames.innerCell} {
+  /*border-top: 1px solid #F8F8F8;*/
+  width: 50%;
+  max-width: 250px;
+}
+.${ClassNames.corresponding(false)} {
   background-color: #FFFFE0;
 }
-.corresponding2 {
+.${ClassNames.corresponding(true)} {
   background-color: #EFEFD0;
 }
-.identical1 {
+.${ClassNames.identical(false)} {
   background-color: #E0F0E0;
 }
-.identical2 {
+.${ClassNames.identical(true)} {
   background-color: #C0E0C0;
 }
-.line {
+.${ClassNames.line} {
   padding-left: 7em;
   text-indent: -7em;
   margin: 0px;
 }
-.column0 {
+.${ClassNames.column(column_js0)} {
+  max-width: 500px;
+  width: 500px;
 }
-.column1 {
+.${ClassNames.column(column_js1)} {
+  max-width: 500px;
+  width: 500px;
 }
-.column2 {
+.${ClassNames.column(column_dart)} {
+  max-width: 300px;
+  width: 300px;
+}
+.${ClassNames.colored(0)} {
+  color: #FF0000;
+}
+.${ClassNames.colored(1)} {
+  color: #C0C000;
+}
+.${ClassNames.colored(2)} {
+  color: #008000;
+}
+.${ClassNames.colored(3)} {
+  color: #00C0C0;
+}
+.${ClassNames.withSourceInfo} {
+  border: solid 1px #FF8080;
+}
+.${ClassNames.withoutSourceInfo} {
+  background-color: #8080FF;
+}
+.${ClassNames.additionalSourceInfo} {
+  border: solid 1px #80FF80;
+}
+.${ClassNames.unusedSourceInfo} {
+  border: solid 1px #8080FF;
+}
+.${ClassNames.originalDart} {
+}
+.${ClassNames.inlinedDart} {
+}
+''');
+  for (int i = 0; i < HUE_COUNT; i++) {
+    sb.write('''
+.${ClassNames.sourceMappingIndex(i)} {
+  background-color: ${toColorCss(i)};
+}
+''');
+  }
+  sb.write('''
+.${ClassNames.sourceMapped} {
+  ${showSourceMapped ? '' : 'display: none;'}
+}
+.${ClassNames.sourceMapping} {
+  ${showSourceMapped ? '' : 'border: 0px;'}
+  ${showSourceMapped ? '' : 'background-color: transparent;'}
+}
+.${ClassNames.markers} {
+  ${showMarkers ? '' : 'display: none;'}
+}
+.${ClassNames.marker} {
+  ${showMarkers ? '' : 'border: 0px;'}
+  ${showMarkers ? '' : 'background-color: transparent;'}
 }
 </style>
+<script>
+function isChecked(name) {
+  var box = document.getElementById('box-' + name);
+  return box.checked;
+}
+function toggleDisplay(name) {
+  var checked = isChecked(name);
+  var styleSheet = document.styleSheets[0];
+  for (var index = 0; index < styleSheet.cssRules.length; index++) {
+    var cssRule = styleSheet.cssRules[index];
+    if (cssRule.selectorText == '.' + name) {
+      if (checked) {
+        cssRule.style.removeProperty('display');
+      } else {
+        cssRule.style.display = 'none';
+      }
+    }
+  }
+  return checked;
+}
+function toggle${ClassNames.sourceMapped}() {
+  var checked = toggleDisplay('${ClassNames.sourceMapped}');
+  toggleAnnotations(checked, '${ClassNames.sourceMapping}');
+}
+function toggle${ClassNames.markers}() {
+  var checked = toggleDisplay('${ClassNames.markers}');
+  toggleAnnotations(checked, '${ClassNames.marker}');
+}
+function toggleAnnotations(show, name) {
+  var styleSheet = document.styleSheets[0];
+  for (var index = 0; index < styleSheet.cssRules.length; index++) {
+    var cssRule = styleSheet.cssRules[index];
+    if (cssRule.selectorText == '.' + name) {
+      if (show) {
+        cssRule.style.removeProperty('border');
+        cssRule.style.removeProperty('background-color');
+      } else {
+        cssRule.style.border = '0px';
+        cssRule.style.backgroundColor = 'transparent';
+      }
+    }
+  }
+} 
+</script>
 </head>
 <body>''');
 
   sb.write('''
-<div class="header">
-<table class="header-table"><tr>
-<td class="header-column">[${outputs[0].options.join(',')}]</td>
-<td class="header-column">[${outputs[1].options.join(',')}]</td>
-<td class="header-column">Dart code</td>
-</tr></table>
-<div class="legend">
-  <span class="identical1">&nbsp;&nbsp;&nbsp;</span> 
-  <span class="identical2">&nbsp;&nbsp;&nbsp;</span>
+<div class="${ClassNames.header}">
+<div class="${ClassNames.legend}">
+  <span class="${ClassNames.identical(false)}">&nbsp;&nbsp;&nbsp;</span> 
+  <span class="${ClassNames.identical(true)}">&nbsp;&nbsp;&nbsp;</span>
   identical blocks
-  <span class="corresponding1">&nbsp;&nbsp;&nbsp;</span>
-  <span class="corresponding2">&nbsp;&nbsp;&nbsp;</span> 
+  <span class="${ClassNames.corresponding(false)}">&nbsp;&nbsp;&nbsp;</span>
+  <span class="${ClassNames.corresponding(true)}">&nbsp;&nbsp;&nbsp;</span> 
   corresponding blocks
 ''');
 
-  if (addAnnotations) {
-    sb.write('''
-  <span style="$WITH_SOURCE_INFO_STYLE">&nbsp;&nbsp;&nbsp;</span>
+  sb.write('''
+  <span class="${ClassNames.markers}">
+  <span class="${ClassNames.withSourceInfo}">&nbsp;&nbsp;&nbsp;</span>
   <span title="'offset with source information' means that source information 
 is available for an offset which is expected to have a source location 
 attached. This offset has source information as intended.">
   offset with source information</span>
-  <span style="$WITHOUT_SOURCE_INFO_STYLE">&nbsp;&nbsp;&nbsp;</span>
+  <span class="${ClassNames.withoutSourceInfo}">&nbsp;&nbsp;&nbsp;</span>
   <span title="'offset without source information' means that _no_ source 
 information is available for an offset which was expected to have a source 
 location attached. Source information must be found for this offset.">
   offset without source information</span>
-  <span style="$ADDITIONAL_SOURCE_INFO_STYLE">&nbsp;&nbsp;&nbsp;</span>
+  <span class="${ClassNames.additionalSourceInfo}">&nbsp;&nbsp;&nbsp;</span>
   <span title="'offset with unneeded source information' means that a source 
 location was attached to an offset which was _not_ expected to have a source
 location attached. The source location should be removed from this offset.">
   offset with unneeded source information</span>
-  <span style="$UNUSED_SOURCE_INFO_STYLE">&nbsp;&nbsp;&nbsp;</span>
+  <span class="${ClassNames.unusedSourceInfo}">&nbsp;&nbsp;&nbsp;</span>
   <span title="'offset with unused source information' means that source 
 information is available for an offset which is _not_ expected to have a source
 location attached. This source information _could_ be used by a parent AST node
 offset that is an 'offset without source information'."> 
   offset with unused source information</span>
+  </span>
+  <span class="${ClassNames.sourceMapped}">
 ''');
+  for (int i = 0; i < HUE_COUNT; i++) {
+    sb.write('''
+<span class="${ClassNames.sourceMappingIndex(i)}">&nbsp;&nbsp;</span>''');
   }
-
   sb.write('''
-</div></div>
-<table class="table">
+  <span title="JavaScript offsets and their corresponding Dart Code offset 
+as mapped through source-maps.">
+  mapped source locations</span>
+  </span>
 ''');
 
-  void addCell(String content) {
-    sb.write('''
-<td class="cell"><pre>
-''');
-    sb.write(content);
-    sb.write('''
-</pre></td>
-''');
-  }
 
   /// Marker to alternate output colors.
   bool alternating = false;
@@ -338,39 +487,73 @@
     if (outputs[i].codeLines.isNotEmpty) {
       lineNoWidth = '${outputs[i].codeLines.last.lineNo + 1}'.length;
     }
-    printContexts.add(new HtmlPrintContext(lineNoWidth: lineNoWidth));
+    printContexts.add(new HtmlPrintContext(
+        lineNoWidth: lineNoWidth,
+        getAnnotationData: getAnnotationData,
+        getLineData: getLineData));
   }
 
+  Set<DiffColumn> allColumns = new Set<DiffColumn>();
+  for (DiffBlock block in blocks) {
+    allColumns.addAll(block.columns);
+  }
+
+  List<DiffColumn> columns = [column_js0, column_js1, column_dart]
+      .where((c) => allColumns.contains(c)).toList();
+
+  sb.write('''
+</div>
+<table class="${ClassNames.headerTable}"><tr>''');
+  for (DiffColumn column in columns) {
+    sb.write('''
+<td class="${ClassNames.headerColumn} ${ClassNames.column(column)}">''');
+    if (column.type == 'js') {
+      sb.write('''[${outputs[column.index].options.join(',')}]''');
+    } else {
+      sb.write('''Dart code''');
+    }
+    sb.write('''</td>''');
+  }
+
+  sb.write('''
+</tr></table>
+</div>
+<table class="${ClassNames.table}">
+''');
+
   for (DiffBlock block in blocks) {
     String className;
     switch (block.kind) {
       case DiffKind.UNMATCHED:
-        className = 'cell';
+        className = '${ClassNames.cell}';
         break;
       case DiffKind.MATCHING:
-        className = 'cell corresponding${alternating ? '1' : '2'}';
+        className =
+            '${ClassNames.cell} ${ClassNames.corresponding(alternating)}';
         alternating = !alternating;
         break;
       case DiffKind.IDENTICAL:
-        className = 'cell identical${alternating ? '1' : '2'}';
+        className =
+            '${ClassNames.cell} ${ClassNames.identical(alternating)}';
         alternating = !alternating;
         break;
     }
     sb.write('<tr>');
-    for (int index = 0; index < 3; index++) {
-      sb.write('''<td class="$className column$index">''');
-      List<HtmlPart> lines = block.getColumn(index);
-      if (lines.isNotEmpty) {
-        for (HtmlPart line in lines) {
-          sb.write('<p class="line">');
-          if (index < printContexts.length) {
-            line.printHtmlOn(sb, printContexts[index]);
-          } else {
-            line.printHtmlOn(sb, new HtmlPrintContext());
-          }
-          sb.write('</p>');
-        }
+    for (DiffColumn column in columns) {
+      sb.write('''<td class="$className ${ClassNames.column(column)}">''');
+      HtmlPrintContext context = new HtmlPrintContext(
+          lineNoWidth: 4,
+          includeAnnotation: (Annotation annotation) {
+            CodeLineAnnotation data = annotation.data;
+            return data.annotationType == AnnotationType.WITH_SOURCE_INFO ||
+                   data.annotationType == AnnotationType.ADDITIONAL_SOURCE_INFO;
+          },
+          getAnnotationData: getAnnotationData,
+          getLineData: getLineData);
+      if (column.type == 'js') {
+        context = printContexts[column.index];
       }
+      block.printHtmlOn(column, sb, context);
       sb.write('''</td>''');
     }
     sb.write('</tr>');
@@ -378,11 +561,51 @@
 
   sb.write('''</tr><tr>''');
 
-  addCell(outputs[0].coverage);
-  addCell(outputs[1].coverage);
+  for (DiffColumn column in columns) {
+    sb.write('''
+<td class="${ClassNames.cell} ${ClassNames.column(column)}"><pre>''');
+    if (column.type == 'js') {
+      sb.write(outputs[column.index].coverage);
+    }
+    sb.write('''</td>''');
+  }
 
   sb.write('''
 </table>
+<div class="${ClassNames.buttons}">
+<input type="checkbox" id="box-${ClassNames.column(column_js0)}" 
+  onclick="javascript:toggleDisplay('${ClassNames.column(column_js0)}')" 
+  checked>
+Left JavaScript code<br/>
+
+<input type="checkbox" id="box-${ClassNames.column(column_js1)}" 
+  onclick="javascript:toggleDisplay('${ClassNames.column(column_js1)}')" 
+  checked>
+Right JavaScript code<br/>
+
+<input type="checkbox" id="box-${ClassNames.column(column_dart)}" 
+  onclick="javascript:toggleDisplay('${ClassNames.column(column_dart)}')" 
+  checked>
+<span title="Show column with Dart code corresponding to the block.">
+Dart code</span><br/>
+
+<input type="checkbox" id="box-${ClassNames.inlinedDart}" 
+  onclick="javascript:toggleDisplay('${ClassNames.inlinedDart}')" checked>
+<span title="Show Dart code inlined into the block.">
+Inlined Dart code</span><br/>
+
+<input type="checkbox" id="box-${ClassNames.markers}" 
+  onclick="javascript:toggle${ClassNames.markers}()" 
+  ${showMarkers ? 'checked' : ''}>
+<span title="Show markers for JavaScript offsets with source information.">
+Source information markers</span><br/>
+
+<input type="checkbox" id="box-${ClassNames.sourceMapped}" 
+  onclick="javascript:toggle${ClassNames.sourceMapped}()" 
+  ${showSourceMapped ? 'checked' : ''}>
+<span title="Show line-per-line mappings of JavaScript to Dart code.">
+Source mapped Dart code</span><br/>
+</div>
 </body>
 </html>
 ''');
@@ -396,95 +619,259 @@
   final Coverage coverage;
   final Map<int, Element> elementMap;
   final SourceFileManager sourceFileManager;
+  final CodeSources codeSources;
 
-  CodeLinesResult(this.codeLines, this.coverage,
-      this.elementMap, this.sourceFileManager);
+  CodeLinesResult(
+      this.codeLines,
+      this.coverage,
+      this.elementMap,
+      this.sourceFileManager,
+      this.codeSources);
+}
+
+class CodeSources {
+  Map<Element, CodeSource> codeSourceMap = <Element, CodeSource>{};
+  Map<Uri, Map<Interval, CodeSource>> uriCodeSourceMap =
+      <Uri, Map<Interval, CodeSource>>{};
+
+  CodeSources(
+    SourceMapProcessor processor,
+    SourceMaps sourceMaps) {
+
+    CodeSource computeCodeSource(Element element) {
+      return codeSourceMap.putIfAbsent(element, () {
+        CodeSource codeSource = codeSourceFromElement(element);
+        if (codeSource.begin != null) {
+          Interval interval = new Interval(codeSource.begin, codeSource.end);
+          Map<Interval, CodeSource> intervals =
+              uriCodeSourceMap[codeSource.uri];
+          if (intervals == null) {
+            intervals = <Interval, CodeSource>{};
+            uriCodeSourceMap[codeSource.uri] = intervals;
+          } else {
+            for (Interval existingInterval in intervals.keys.toList()) {
+              if (existingInterval.contains(interval.from)) {
+                CodeSource existingCodeSource = intervals[existingInterval];
+                intervals.remove(existingInterval);
+                if (existingInterval.from < interval.from) {
+                  Interval preInterval = new Interval(
+                      existingInterval.from, interval.from);
+                  intervals[preInterval] = existingCodeSource;
+                }
+                if (interval.to < existingInterval.to) {
+                  Interval postInterval = new Interval(
+                      interval.to, existingInterval.to);
+                  intervals[postInterval] = existingCodeSource;
+                }
+              }
+            }
+          }
+          intervals[interval] = codeSource;
+        }
+        if (element is ClassElement) {
+          element.forEachLocalMember((Element member) {
+            codeSource.members.add(computeCodeSource(member));
+          });
+          element.implementation.forEachLocalMember((Element member) {
+            codeSource.members.add(computeCodeSource(member));
+          });
+        } else if (element is MemberElement) {
+          element.nestedClosures.forEach((Element closure) {
+            codeSource.members.add(computeCodeSource(closure));
+          });
+        }
+        return codeSource;
+      });
+    }
+
+    for (LibraryElement library in
+             sourceMaps.compiler.libraryLoader.libraries) {
+      library.forEachLocalMember(computeCodeSource);
+      library.implementation.forEachLocalMember(computeCodeSource);
+    }
+
+    uriCodeSourceMap.forEach((Uri uri, Map<Interval, CodeSource> intervals) {
+      List<Interval> sortedKeys = intervals.keys.toList()..sort(
+          (i1, i2) => i1.from.compareTo(i2.from));
+      Map<Interval, CodeSource> sortedintervals = <Interval, CodeSource>{};
+      sortedKeys.forEach((Interval interval) {
+        sortedintervals[interval] = intervals[interval];
+      });
+      uriCodeSourceMap[uri] = sortedintervals;
+    });
+  }
+
+  CodeSource sourceLocationToCodeSource(SourceLocation sourceLocation) {
+    Map<Interval, CodeSource> intervals =
+        uriCodeSourceMap[sourceLocation.sourceUri];
+    if (intervals == null) {
+      print('No code source for $sourceLocation(${sourceLocation.offset})');
+      print(' -- no intervals for ${sourceLocation.sourceUri}');
+      return null;
+    }
+    for (Interval interval in intervals.keys) {
+      if (interval.contains(sourceLocation.offset)) {
+        return intervals[interval];
+      }
+    }
+    print('No code source for $sourceLocation(${sourceLocation.offset})');
+    intervals.forEach((k, v) => print(' $k: ${v.name}'));
+    return null;
+  }
 }
 
 /// Compute [CodeLine]s and [Coverage] for [filename] using the given [options].
 Future<CodeLinesResult> computeCodeLines(
     List<String> options,
-    String filename,
-    {bool addAnnotations: true}) async {
+    String filename) async {
   SourceMapProcessor processor = new SourceMapProcessor(filename);
   SourceMaps sourceMaps =
       await processor.process(options, perElement: true, forMain: true);
 
-  const int WITH_SOURCE_INFO = 0;
-  const int WITHOUT_SOURCE_INFO = 1;
-  const int ADDITIONAL_SOURCE_INFO = 2;
-  const int UNUSED_SOURCE_INFO = 3;
+  CodeSources codeSources = new CodeSources(processor, sourceMaps);
 
   SourceMapInfo info = sourceMaps.mainSourceMapInfo;
 
+  int nextAnnotationId = 0;
   List<CodeLine> codeLines;
   Coverage coverage = new Coverage();
-  List<Annotation> annotations = <Annotation>[];
+  Map<int, List<CodeLineAnnotation>> codeLineAnnotationMap =
+      <int, List<CodeLineAnnotation>>{};
 
-  void addAnnotation(int id, int offset, String title) {
-    annotations.add(new Annotation(id, offset, title));
+  /// Create a [CodeLineAnnotation] for [codeOffset].
+  void addCodeLineAnnotation(
+      {AnnotationType annotationType,
+       int codeOffset,
+       List<SourceLocation> locations: const <SourceLocation>[],
+       String stepInfo}) {
+    if (annotationType == AnnotationType.WITHOUT_SOURCE_INFO ||
+        annotationType == AnnotationType.UNUSED_SOURCE_INFO) {
+      locations = [];
+    }
+    List<CodeLocation> codeLocations = locations
+        .map((l) => new CodeLocation(l.sourceUri, l.sourceName, l.offset))
+        .toList();
+    List<CodeSource> codeSourceList = locations
+        .map(codeSources.sourceLocationToCodeSource)
+        .where((c) => c != null)
+        .toList();
+    CodeLineAnnotation data = new CodeLineAnnotation(
+        annotationId: nextAnnotationId++,
+        annotationType: annotationType,
+        codeLocations: codeLocations,
+        codeSources: codeSourceList,
+        stepInfo: stepInfo);
+    codeLineAnnotationMap.putIfAbsent(
+        codeOffset, () => <CodeLineAnnotation>[]).add(data);
   }
 
   String code = info.code;
   TraceGraph graph = createTraceGraph(info, coverage);
-  if (addAnnotations) {
-    Set<js.Node> mappedNodes = new Set<js.Node>();
 
-    void addSourceLocations(
-        int kind, int offset, List<SourceLocation> locations, String prefix) {
+  Set<js.Node> mappedNodes = new Set<js.Node>();
 
-      addAnnotation(kind, offset,
-          '${prefix}${locations
-              .where((l) => l != null)
-              .map((l) => l.shortText)
-              .join('\n')}');
-    }
-
-    bool addSourceLocationsForNode(int kind, js.Node node, String prefix) {
-      Map<int, List<SourceLocation>> locations = info.nodeMap[node];
-      if (locations == null || locations.isEmpty) {
-        return false;
-      }
-      locations.forEach(
-          (int offset, List<SourceLocation> locations) {
-        addSourceLocations(kind, offset, locations,
-            '${prefix}\n${truncate(nodeToString(node), 80)}\n');
-      });
-      mappedNodes.add(node);
-      return true;
-    }
-
-
-    for (TraceStep step in graph.steps) {
-      String title = '${step.id}:${step.kind}:${step.offset}';
-      if (!addSourceLocationsForNode(WITH_SOURCE_INFO, step.node, title)) {
-        int offset;
-        if (options.contains(USE_NEW_SOURCE_INFO)) {
-          offset = step.offset.subexpressionOffset;
-        } else {
-          offset = info.jsCodePositions[step.node].startPosition;
-        }
-        if (offset != null) {
-          addAnnotation(WITHOUT_SOURCE_INFO, offset, title);
-        }
-      }
-    }
-    for (js.Node node in info.nodeMap.nodes) {
-      if (!mappedNodes.contains(node)) {
-        addSourceLocationsForNode(ADDITIONAL_SOURCE_INFO, node, '');
-      }
-    }
-    SourceLocationCollector collector = new SourceLocationCollector();
-    info.node.accept(collector);
-    collector.sourceLocations.forEach(
-        (js.Node node, List<SourceLocation> locations) {
-      if (!mappedNodes.contains(node)) {
-        int offset = info.jsCodePositions[node].startPosition;
-        addSourceLocations(UNUSED_SOURCE_INFO, offset, locations, '');
-      }
-    });
+  /// Add an annotation for [codeOffset] pointing to [locations].
+  void addSourceLocations(
+      {AnnotationType annotationType,
+       int codeOffset,
+       List<SourceLocation> locations,
+       String stepInfo}) {
+    locations = locations.where((l) => l != null).toList();
+    addCodeLineAnnotation(
+        annotationType: annotationType,
+        codeOffset: codeOffset,
+        stepInfo: stepInfo,
+        locations: locations);
   }
 
+  /// Add annotations for all mappings created for [node].
+  bool addSourceLocationsForNode(
+      {AnnotationType annotationType,
+       js.Node node,
+       String stepInfo}) {
+    Map<int, List<SourceLocation>> locations = info.nodeMap[node];
+    if (locations == null || locations.isEmpty) {
+      return false;
+    }
+    locations.forEach((int offset, List<SourceLocation> locations) {
+      addSourceLocations(
+          annotationType: annotationType,
+          codeOffset: offset,
+          locations: locations,
+          stepInfo: stepInfo);
+    });
+    mappedNodes.add(node);
+    return true;
+  }
+
+  // Add annotations based on trace steps.
+  for (TraceStep step in graph.steps) {
+    String stepInfo = '${step.id}:${step.kind}:${step.offset}';
+    bool added = addSourceLocationsForNode(
+        annotationType: AnnotationType.WITH_SOURCE_INFO,
+        node: step.node,
+        stepInfo: stepInfo);
+    if (!added) {
+      int offset;
+      if (options.contains(Flags.useNewSourceInfo)) {
+        offset = step.offset.subexpressionOffset;
+      } else {
+        offset = info.jsCodePositions[step.node].startPosition;
+      }
+      if (offset != null) {
+        addCodeLineAnnotation(
+            annotationType: AnnotationType.WITHOUT_SOURCE_INFO,
+            codeOffset: offset,
+            stepInfo: stepInfo);
+      }
+    }
+  }
+
+  // Add additional annotations for mappings created for particular nodes.
+  for (js.Node node in info.nodeMap.nodes) {
+    if (!mappedNodes.contains(node)) {
+      addSourceLocationsForNode(
+          annotationType: AnnotationType.ADDITIONAL_SOURCE_INFO,
+          node: node);
+    }
+  }
+
+  // Add annotations for unused source information associated with nodes.
+  SourceLocationCollector collector = new SourceLocationCollector();
+  info.node.accept(collector);
+  collector.sourceLocations.forEach(
+      (js.Node node, List<SourceLocation> locations) {
+    if (!mappedNodes.contains(node)) {
+      int offset = info.jsCodePositions[node].startPosition;
+      addSourceLocations(
+        annotationType: AnnotationType.UNUSED_SOURCE_INFO,
+        codeOffset: offset,
+        locations: locations);
+    }
+  });
+
+  // Assign consecutive ids to source mappings.
+  int nextSourceMappedLocationIndex = 0;
+  List<Annotation> annotations = <Annotation>[];
+  for (int codeOffset in codeLineAnnotationMap.keys.toList()..sort()) {
+    bool hasSourceMappedLocation = false;
+    for (CodeLineAnnotation data in codeLineAnnotationMap[codeOffset]) {
+      if (data.annotationType.isSourceMapped) {
+        data.sourceMappingIndex = nextSourceMappedLocationIndex;
+        hasSourceMappedLocation = true;
+      }
+      annotations.add(new Annotation(
+          data.annotationType.index,
+          codeOffset,
+          'id=${data.annotationId}',
+          data: data));
+    }
+    if (hasSourceMappedLocation) {
+      nextSourceMappedLocationIndex++;
+    }
+  }
+
+  // Associate JavaScript offsets with [Element]s.
   StringSourceFile sourceFile = new StringSourceFile.fromName(filename, code);
   Map<int, Element> elementMap = <int, Element>{};
   sourceMaps.elementSourceMapInfos.forEach(
@@ -493,33 +880,11 @@
     elementMap[sourceFile.getLine(position.startPosition)] = element;
   });
 
-  codeLines = convertAnnotatedCodeToCodeLines(
-      code,
-      annotations,
-      colorScheme: new CustomColorScheme(
-        single: (int id) {
-          if (id == WITH_SOURCE_INFO) {
-            return WITH_SOURCE_INFO_STYLE;
-          } else if (id == ADDITIONAL_SOURCE_INFO) {
-            return ADDITIONAL_SOURCE_INFO_STYLE;
-          } else if (id == UNUSED_SOURCE_INFO) {
-            return UNUSED_SOURCE_INFO_STYLE;
-          }
-          return WITHOUT_SOURCE_INFO_STYLE;
-        },
-        multi: (List ids) {
-          if (ids.contains(WITH_SOURCE_INFO)) {
-            return WITH_SOURCE_INFO_STYLE;
-          } else if (ids.contains(ADDITIONAL_SOURCE_INFO)) {
-            return ADDITIONAL_SOURCE_INFO_STYLE;
-          } else if (ids.contains(UNUSED_SOURCE_INFO)) {
-            return UNUSED_SOURCE_INFO_STYLE;
-          }
-          return WITHOUT_SOURCE_INFO_STYLE;
-        }
-      ));
-  return new CodeLinesResult(codeLines, coverage, elementMap,
-      sourceMaps.sourceFileManager);
+  codeLines = convertAnnotatedCodeToCodeLines(code, annotations);
+  return new CodeLinesResult(
+      codeLines, coverage, elementMap,
+      sourceMaps.sourceFileManager,
+      codeSources);
 }
 
 /// Visitor that computes a map from [js.Node]s to all attached source
@@ -565,4 +930,70 @@
     }
   }
   return new CodeSource(kind, uri, name, begin, end);
-}
\ No newline at end of file
+}
+
+/// Create [LineData] that colors line numbers according to the [CodeSource]s
+/// origin if available.
+LineData getLineData(CodeSource lineAnnotation) {
+  if (lineAnnotation != null) {
+    return new LineData(
+        lineClass: ClassNames.line,
+        lineNumberClass:
+          '${ClassNames.lineNumber} '
+          '${ClassNames.colored(lineAnnotation.hashCode % 4)}');
+  }
+  return new LineData(
+      lineClass: ClassNames.line,
+      lineNumberClass: ClassNames.lineNumber);
+}
+
+AnnotationData getAnnotationData(Iterable<Annotation> annotations,
+                                 {bool forSpan}) {
+  for (Annotation annotation in annotations) {
+    CodeLineAnnotation data = annotation.data;
+    if (data.annotationType.isSourceMapped) {
+      if (forSpan) {
+        int index = data.sourceMappingIndex;
+        return new AnnotationData(
+            tag: 'span',
+            properties: {
+              'class':
+                '${ClassNames.sourceMapping} '
+                '${ClassNames.sourceMappingIndex(index % HUE_COUNT)}',
+              'title': 'index=$index',
+            });
+      } else {
+        return new AnnotationData(
+            tag: 'span',
+            properties: {
+              'title': annotation.title,
+              'class': '${ClassNames.marker} '
+                       '${data.annotationType.className}'});
+      }
+    }
+  }
+  if (forSpan) return null;
+  for (Annotation annotation in annotations) {
+    CodeLineAnnotation data = annotation.data;
+    if (data.annotationType == AnnotationType.UNUSED_SOURCE_INFO) {
+      return new AnnotationData(
+          tag: 'span',
+          properties: {
+            'title': annotation.title,
+            'class': '${ClassNames.marker} '
+                     '${data.annotationType.className}'});
+    }
+  }
+  for (Annotation annotation in annotations) {
+    CodeLineAnnotation data = annotation.data;
+    if (data.annotationType == AnnotationType.WITHOUT_SOURCE_INFO) {
+      return new AnnotationData(
+          tag: 'span',
+          properties: {
+            'title': annotation.title,
+            'class': '${ClassNames.marker} '
+                     '${data.annotationType.className}'});
+    }
+  }
+  return null;
+}
diff --git a/tests/compiler/dart2js/sourcemaps/html_parts.dart b/tests/compiler/dart2js/sourcemaps/html_parts.dart
index 6ddf95e..4d06f98 100644
--- a/tests/compiler/dart2js/sourcemaps/html_parts.dart
+++ b/tests/compiler/dart2js/sourcemaps/html_parts.dart
@@ -6,13 +6,130 @@
 
 import 'sourcemap_html_helper.dart';
 
+class Annotation {
+  final id;
+  final int codeOffset;
+  final String title;
+  final data;
+
+  Annotation(this.id, this.codeOffset, this.title, {this.data});
+}
+
+typedef bool AnnotationFilter(Annotation annotation);
+typedef AnnotationData AnnotationDataFunction(
+    Iterable<Annotation> annotations,
+    {bool forSpan});
+typedef LineData LineDataFunction(lineAnnotation);
+
+bool includeAllAnnotation(Annotation annotation) => true;
+
+class LineData {
+  final String lineClass;
+  final String lineNumberClass;
+
+  const LineData({
+    this.lineClass: 'line',
+    this.lineNumberClass: 'lineNumber'});
+}
+
+class AnnotationData {
+  final String tag;
+  final Map<String, String> properties;
+
+  const AnnotationData({
+    this.tag: 'a',
+    this.properties: const <String, String>{}});
+
+  int get hashCode => tag.hashCode * 13 + properties.hashCode * 19;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! AnnotationData) return false;
+    return tag == other.tag &&
+           properties.length == other.properties.length &&
+           properties.keys.every((k) => properties[k] == other.properties[k]);
+  }
+}
+
+AnnotationDataFunction createAnnotationDataFunction(
+    {CssColorScheme colorScheme: const SingleColorScheme(),
+     ElementScheme elementScheme: const ElementScheme()}) {
+  return (Iterable<Annotation> annotations, {bool forSpan}) {
+    return getAnnotationDataFromSchemes(
+        annotations,
+        forSpan: forSpan,
+        colorScheme: colorScheme,
+        elementScheme: elementScheme);
+  };
+}
+
+LineData getDefaultLineData(data) => const LineData();
+
+AnnotationData getAnnotationDataFromSchemes(
+    Iterable<Annotation> annotations,
+    {bool forSpan,
+     CssColorScheme colorScheme: const SingleColorScheme(),
+     ElementScheme elementScheme: const ElementScheme()}) {
+  if (colorScheme.showLocationAsSpan != forSpan) return null;
+  Map<String, String> data = <String, String>{};
+  var id;
+  if (annotations.length == 1) {
+    Annotation annotation = annotations.single;
+    if (annotation != null) {
+      id = annotation.id;
+      data['style'] = colorScheme.singleLocationToCssColor(id);
+      data['title'] = annotation.title;
+    }
+  } else {
+    id = annotations.first.id;
+    List ids = [];
+    for (Annotation annotation in annotations) {
+      ids.add(annotation.id);
+    }
+    data['style'] = colorScheme.multiLocationToCssColor(ids);
+    data['title'] = annotations.map((l) => l.title).join(',');
+  }
+  if (id != null) {
+    Set ids = annotations.map((l) => l.id).toSet();
+    data['tag'] = 'a';
+    data['name'] = elementScheme.getName(id, ids);
+    data['href'] = elementScheme.getHref(id, ids);
+    data['onclick'] = elementScheme.onClick(id, ids);
+    data['onmouseover'] = elementScheme.onMouseOver(id, ids);
+    data['onmouseout'] = elementScheme.onMouseOut(id, ids);
+    return new AnnotationData(
+        properties: data);
+  }
+  return null;
+}
+
 class HtmlPrintContext {
   final int lineNoWidth;
   final bool usePre;
+  final AnnotationFilter includeAnnotation;
+  final AnnotationDataFunction getAnnotationData;
+  final LineDataFunction getLineData;
 
   HtmlPrintContext({
     this.lineNoWidth,
-    this.usePre: true});
+    this.usePre: true,
+    this.includeAnnotation: includeAllAnnotation,
+    this.getAnnotationData: getAnnotationDataFromSchemes,
+    this.getLineData: getDefaultLineData});
+
+  HtmlPrintContext from({
+      int lineNoWidth,
+      bool usePre,
+      AnnotationFilter includeAnnotation,
+      AnnotationDataFunction getAnnotationData,
+      LineDataFunction getLineData}) {
+    return new HtmlPrintContext(
+        lineNoWidth: lineNoWidth ?? this.lineNoWidth,
+        usePre: usePre ?? this.usePre,
+        includeAnnotation: includeAnnotation ?? this.includeAnnotation,
+        getAnnotationData: getAnnotationData ?? this.getAnnotationData,
+        getLineData: getLineData ?? this.getLineData);
+  }
 }
 
 enum HtmlPartKind {
@@ -21,31 +138,36 @@
   CONST,
   NEWLINE,
   TEXT,
-  ANCHOR,
+  TAG,
+  LINE_NUMBER,
 }
 
 abstract class HtmlPart {
-  void printHtmlOn(StringBuffer buffer, HtmlPrintContext context) {}
+  void printHtmlOn(StringBuffer buffer, HtmlPrintContext context);
 
-  toJson();
+  HtmlPartKind get kind;
 
-  static HtmlPart fromJson(json) {
+  toJson(JsonStrategy strategy);
+
+  static HtmlPart fromJson(json, JsonStrategy strategy) {
     if (json is String) {
       return new ConstHtmlPart(json);
     } else {
       switch (HtmlPartKind.values[json['kind']]) {
         case HtmlPartKind.LINE:
-          return HtmlLine.fromJson(json);
+          return HtmlLine.fromJson(json, strategy);
         case HtmlPartKind.CODE:
-          return CodeLine.fromJson(json);
+          return CodeLine.fromJson(json, strategy);
         case HtmlPartKind.CONST:
-          return ConstHtmlPart.fromJson(json);
+          return ConstHtmlPart.fromJson(json, strategy);
         case HtmlPartKind.NEWLINE:
           return const NewLine();
         case HtmlPartKind.TEXT:
-          return HtmlText.fromJson(json);
-        case HtmlPartKind.ANCHOR:
-          return AnchorHtmlPart.fromJson(json);
+          return HtmlText.fromJson(json, strategy);
+        case HtmlPartKind.TAG:
+          return TagPart.fromJson(json, strategy);
+        case HtmlPartKind.LINE_NUMBER:
+          return LineNumber.fromJson(json, strategy);
       }
     }
   }
@@ -56,16 +178,18 @@
 
   const ConstHtmlPart(this.html);
 
+  HtmlPartKind get kind => HtmlPartKind.CONST;
+
   @override
   void printHtmlOn(StringBuffer buffer, HtmlPrintContext context) {
     buffer.write(html);
   }
 
-  toJson() {
-    return {'kind': HtmlPartKind.CONST.index, 'html': html};
+  toJson(JsonStrategy strategy) {
+    return {'kind': kind.index, 'html': html};
   }
 
-  static ConstHtmlPart fromJson(Map json) {
+  static ConstHtmlPart fromJson(Map json, JsonStrategy strategy) {
     return new ConstHtmlPart(json['html']);
   }
 }
@@ -73,6 +197,8 @@
 class NewLine implements HtmlPart {
   const NewLine();
 
+  HtmlPartKind get kind => HtmlPartKind.NEWLINE;
+
   void printHtmlOn(StringBuffer buffer, HtmlPrintContext context) {
     if (context.usePre) {
       buffer.write('\n');
@@ -81,8 +207,8 @@
     }
   }
 
-  toJson() {
-    return {'kind': HtmlPartKind.NEWLINE.index};
+  toJson(JsonStrategy strategy) {
+    return {'kind': kind.index};
   }
 }
 
@@ -91,90 +217,70 @@
 
   const HtmlText(this.text);
 
+  HtmlPartKind get kind => HtmlPartKind.TEXT;
+
   void printHtmlOn(StringBuffer buffer, HtmlPrintContext context) {
     String escaped = escape(text);
     buffer.write(escaped);
   }
 
-  toJson() {
-    return {'kind': HtmlPartKind.TEXT.index, 'text': text};
+  toJson(JsonStrategy strategy) {
+    return {'kind': kind.index, 'text': text};
   }
 
-  static HtmlText fromJson(Map json) {
+  static HtmlText fromJson(Map json, JsonStrategy strategy) {
     return new HtmlText(json['text']);
   }
 }
 
-class AnchorHtmlPart implements HtmlPart {
-  final String color;
-  final String name;
-  final String href;
-  final String title;
-  final String onclick;
-  final String onmouseover;
-  final String onmouseout;
+class TagPart implements HtmlPart {
+  final String tag;
+  final Map<String, String> properties;
+  final List<HtmlPart> content;
 
-  AnchorHtmlPart({
-    this.color,
-    this.name,
-    this.href,
-    this.title,
-    this.onclick,
-    this.onmouseover,
-    this.onmouseout});
+  TagPart(
+    this.tag,
+    {this.properties: const <String, String>{},
+     this.content: const <HtmlPart>[]});
+
+  HtmlPartKind get kind => HtmlPartKind.TAG;
 
   @override
   void printHtmlOn(StringBuffer buffer, HtmlPrintContext context) {
-    buffer.write('<a');
-    if (href != null) {
-      buffer.write(' href="${href}"');
-    }
-    if (name != null) {
-      buffer.write(' name="${name}"');
-    }
-    if (title != null) {
-      buffer.write(' title="${escape(title)}"');
-    }
-    buffer.write(' style="${color}"');
-    if (onclick != null) {
-      buffer.write(' onclick="${onclick}"');
-    }
-    if (onmouseover != null) {
-      buffer.write(' onmouseover="${onmouseover}"');
-    }
-    if (onmouseout != null) {
-      buffer.write(' onmouseout="${onmouseout}"');
-    }
+    buffer.write('<$tag');
+    properties.forEach((String key, String value) {
+      if (value != null) {
+        buffer.write(' $key="${value}"');
+      }
+    });
     buffer.write('>');
+    for (HtmlPart child in content) {
+      child.printHtmlOn(buffer, context);
+    }
+    buffer.write('</$tag>');
   }
 
-  toJson() {
+  toJson(JsonStrategy strategy) {
     return {
-      'kind': HtmlPartKind.ANCHOR.index,
-      'color': color,
-      'name': name,
-      'href': href,
-      'title': title,
-      'onclick': onclick,
-      'onmouseover': onmouseover,
-      'onmouseout': onmouseout};
+      'kind': kind.index,
+      'tag': tag,
+      'properties': properties,
+      'content': content.map((p) => p.toJson(strategy)).toList()};
   }
 
-  static AnchorHtmlPart fromJson(Map json) {
-    return new AnchorHtmlPart(
-        color: json['color'],
-        name: json['name'],
-        href: json['href'],
-        title: json['title'],
-        onclick: json['onclick'],
-        onmouseover: json['onmouseover'],
-        onmouseout: json['onmouseout']);
+  static TagPart fromJson(Map json, JsonStrategy strategy) {
+    return new TagPart(
+        json['tag'],
+        properties: json['properties'],
+        content: json['content'].map(HtmlPart.fromJson).toList());
   }
 }
 
 class HtmlLine implements HtmlPart {
   final List<HtmlPart> htmlParts = <HtmlPart>[];
 
+  HtmlPartKind get kind => HtmlPartKind.LINE;
+
   @override
   void printHtmlOn(StringBuffer htmlBuffer, HtmlPrintContext context) {
     for (HtmlPart part in htmlParts) {
@@ -182,30 +288,148 @@
     }
   }
 
-  Map toJson() {
+  Map toJson(JsonStrategy strategy) {
     return {
-      'kind': HtmlPartKind.LINE.index,
-      'html': htmlParts.map((p) => p.toJson()).toList(),
+      'kind': kind.index,
+      'html': htmlParts.map((p) => p.toJson(strategy)).toList(),
     };
   }
 
-  static CodeLine fromJson(Map json) {
+  static HtmlLine fromJson(Map json, JsonStrategy strategy) {
     HtmlLine line = new HtmlLine();
-    json['html'].forEach((part) => line.htmlParts.add(HtmlPart.fromJson(part)));
+    json['html']
+        .forEach((part) => line.htmlParts
+        .add(HtmlPart.fromJson(part, strategy)));
     return line;
   }
 }
 
-class CodeLine extends HtmlLine {
+class CodePart {
+  final List<Annotation> annotations;
+  final String subsequentCode;
+
+  CodePart(this.annotations, this.subsequentCode);
+
+  void printHtmlOn(StringBuffer buffer, HtmlPrintContext context) {
+    Iterable<Annotation> included =
+        annotations.where(context.includeAnnotation);
+
+    List<HtmlPart> htmlParts = <HtmlPart>[];
+    if (included.isNotEmpty) {
+      AnnotationData annotationData =
+          context.getAnnotationData(included, forSpan: false);
+      AnnotationData annotationDataForSpan =
+          context.getAnnotationData(included, forSpan: true);
+
+      String head = subsequentCode;
+      String tail = '';
+      if (subsequentCode.length > 1) {
+        head = subsequentCode.substring(0, 1);
+        tail = subsequentCode.substring(1);
+      }
+
+      void addForSpan(AnnotationData data) {
+        htmlParts.add(new TagPart(
+            data.tag,
+            properties: data.properties,
+            content: [new HtmlText(subsequentCode)]));
+      }
+
+      if (annotationData != null &&
+          annotationDataForSpan != null) {
+        htmlParts.add(new TagPart(
+            annotationDataForSpan.tag,
+            properties: annotationDataForSpan.properties,
+            content: [
+              new TagPart(
+                  annotationData.tag,
+                  properties: annotationData.properties,
+                  content: [new HtmlText(head)]),
+              new HtmlText(tail)]));
+      } else if (annotationDataForSpan != null) {
+        htmlParts.add(new TagPart(
+            annotationDataForSpan.tag,
+            properties: annotationDataForSpan.properties,
+            content: [new HtmlText(subsequentCode)]));
+      } else if (annotationData != null) {
+        htmlParts.add(new TagPart(
+            annotationData.tag,
+            properties: annotationData.properties,
+            content: [new HtmlText(head)]));
+        htmlParts.add(new HtmlText(tail));
+      } else {
+        htmlParts.add(new HtmlText(subsequentCode));
+      }
+    } else {
+      htmlParts.add(new HtmlText(subsequentCode));
+    }
+
+    for (HtmlPart part in htmlParts) {
+      part.printHtmlOn(buffer, context);
+    }
+  }
+
+  Map toJson(JsonStrategy strategy) {
+    return {
+      'annotations':
+        annotations.map((a) => strategy.encodeAnnotation(a)).toList(),
+      'subsequentCode': subsequentCode,
+    };
+  }
+
+  static CodePart fromJson(Map json, JsonStrategy strategy) {
+    return new CodePart(
+        json['annotations'].map((j) => strategy.decodeAnnotation(j)).toList(),
+        json['subsequentCode']);
+  }
+}
+
+class LineNumber extends HtmlPart {
+  final int lineNo;
+  final lineAnnotation;
+
+  LineNumber(this.lineNo, this.lineAnnotation);
+
+  HtmlPartKind get kind => HtmlPartKind.LINE_NUMBER;
+
+  @override
+  toJson(JsonStrategy strategy) {
+    return {
+      'kind': kind.index,
+      'lineNo': lineNo,
+      'lineAnnotation': strategy.encodeLineAnnotation(lineAnnotation),
+    };
+  }
+
+  static LineNumber fromJson(Map json, JsonStrategy strategy) {
+    return new LineNumber(
+        json['lineNo'],
+        strategy.decodeLineAnnotation(json['lineAnnotation']));
+  }
+
+  @override
+  void printHtmlOn(StringBuffer buffer, HtmlPrintContext context) {
+    buffer.write(lineNumber(
+        lineNo,
+        width: context.lineNoWidth,
+        useNbsp: !context.usePre,
+        className: context.getLineData(lineAnnotation).lineNumberClass));
+  }
+}
+
+class CodeLine extends HtmlPart {
+  final Uri uri;
   final int lineNo;
   final int offset;
   final StringBuffer codeBuffer = new StringBuffer();
-  final List<HtmlPart> htmlParts = <HtmlPart>[];
-  // TODO(johnniwinther): Make annotations serializable.
+  final List<CodePart> codeParts = <CodePart>[];
   final List<Annotation> annotations = <Annotation>[];
+  var lineAnnotation;
   String _code;
 
-  CodeLine(this.lineNo, this.offset);
+  CodeLine(this.lineNo, this.offset, {this.uri});
+
+  HtmlPartKind get kind => HtmlPartKind.CODE;
 
   String get code {
     if (_code == null) {
@@ -216,28 +440,74 @@
 
   @override
   void printHtmlOn(StringBuffer htmlBuffer, HtmlPrintContext context) {
-    htmlBuffer.write(lineNumber(
-        lineNo, width: context.lineNoWidth, useNbsp: !context.usePre));
-    for (HtmlPart part in htmlParts) {
+    if (context.usePre) {
+      LineData lineData = context.getLineData(lineAnnotation);
+      htmlBuffer.write('<p class="${lineData.lineClass}">');
+    }
+    new LineNumber(lineNo, lineAnnotation).printHtmlOn(htmlBuffer, context);
+    for (CodePart part in codeParts) {
       part.printHtmlOn(htmlBuffer, context);
     }
+    const NewLine().printHtmlOn(htmlBuffer, context);
+    if (context.usePre) {
+      htmlBuffer.write('</p>');
+    }
   }
 
-  Map toJson() {
+  Map toJson(JsonStrategy strategy) {
     return {
-      'kind': HtmlPartKind.CODE.index,
+      'kind': kind.index,
       'lineNo': lineNo,
       'offset': offset,
       'code': code,
-      'html': htmlParts.map((p) => p.toJson()).toList(),
+      'parts': codeParts.map((p) => p.toJson(strategy)).toList(),
+      'annotations':
+        annotations.map((a) => strategy.encodeAnnotation(a)).toList(),
+      'lineAnnotation': lineAnnotation != null
+          ? strategy.encodeLineAnnotation(lineAnnotation) : null,
     };
   }
 
-  static CodeLine fromJson(Map json) {
-    CodeLine line = new CodeLine(json['lineNo'], json['offset']);
+  static CodeLine fromJson(Map json, JsonStrategy strategy) {
+    CodeLine line = new CodeLine(
+        json['lineNo'],
+        json['offset'],
+        uri: json['uri'] != null ? Uri.parse(json['uri']) : null);
     line.codeBuffer.write(json['code']);
-    json['html'].forEach((part) => line.htmlParts.add(HtmlPart.fromJson(part)));
+    json['parts']
+        .forEach((part) => line.codeParts
+        .add(CodePart.fromJson(part, strategy)));
+    json['annotations']
+        .forEach((a) => line.annotations
+        .add(strategy.decodeAnnotation(a)));
+    line.lineAnnotation = json['lineAnnotation'] != null
+        ? strategy.decodeLineAnnotation(json['lineAnnotation']) : null;
     return line;
   }
 }
 
+class JsonStrategy {
+  const JsonStrategy();
+
+  Map encodeAnnotation(Annotation annotation) {
+    return {
+      'id': annotation.id,
+      'codeOffset': annotation.codeOffset,
+      'title': annotation.title,
+      'data': annotation.data,
+    };
+  }
+
+  Annotation decodeAnnotation(Map json) {
+    return new Annotation(
+        json['id'],
+        json['codeOffset'],
+        json['title'],
+        data: json['data']);
+  }
+
+
+  encodeLineAnnotation(lineAnnotation) => lineAnnotation;
+
+  decodeLineAnnotation(json) => json;
+}
diff --git a/tests/compiler/dart2js/sourcemaps/js_tracer.dart b/tests/compiler/dart2js/sourcemaps/js_tracer.dart
index 4ea4e91..56d6f12 100644
--- a/tests/compiler/dart2js/sourcemaps/js_tracer.dart
+++ b/tests/compiler/dart2js/sourcemaps/js_tracer.dart
@@ -35,7 +35,10 @@
     SourcePositionKind sourcePositionKind = SourcePositionKind.START;
     List text = [node];
     switch (kind) {
-      case StepKind.FUN:
+      case StepKind.FUN_ENTRY:
+        text = ['<entry>'];
+        break;
+      case StepKind.FUN_EXIT:
         sourcePositionKind = SourcePositionKind.INNER;
         text = ['<exit>'];
         break;
diff --git a/tests/compiler/dart2js/sourcemaps/output_structure.dart b/tests/compiler/dart2js/sourcemaps/output_structure.dart
index 4962ba9..b9bb841 100644
--- a/tests/compiler/dart2js/sourcemaps/output_structure.dart
+++ b/tests/compiler/dart2js/sourcemaps/output_structure.dart
@@ -4,8 +4,11 @@
 
 library sourcemap.output_structure;
 
+import 'dart:math' as Math;
 import 'html_parts.dart' show
-    CodeLine;
+    Annotation,
+    CodeLine,
+    JsonStrategy;
 
 // Constants used to identify the subsection of the JavaScript output. These
 // are specifically for the unminified full_emitter output.
@@ -54,7 +57,7 @@
 
   EntityKind get kind;
 
-  Map toJson();
+  Map toJson(JsonStrategy strategy);
 
   OutputEntity getEntityForLine(int line);
 }
@@ -233,21 +236,24 @@
   accept(OutputVisitor visitor, arg) => visitor.visitStructure(this, arg);
 
   @override
-  Map toJson() {
+  Map toJson(JsonStrategy strategy) {
     return {
-      'lines': lines.map((line) => line.toJson()).toList(),
+      'lines': lines.map((line) => line.toJson(strategy)).toList(),
       'headerEnd': headerEnd,
       'footerStart': footerStart,
-      'children': children.map((child) => child.toJson()).toList(),
+      'children': children.map((child) => child.toJson(strategy)).toList(),
     };
   }
 
-  static OutputStructure fromJson(Map json) {
-    List<CodeLine> lines = json['lines'].map(CodeLine.fromJson).toList();
+  static OutputStructure fromJson(Map json, JsonStrategy strategy) {
+    List<CodeLine> lines =
+        json['lines'].map((l) => CodeLine.fromJson(l, strategy)).toList();
     int headerEnd = json['headerEnd'];
     int footerStart = json['footerStart'];
     List<LibraryBlock> children =
-        json['children'].map(AbstractEntity.fromJson).toList();
+        json['children']
+            .map((j) => AbstractEntity.fromJson(j, strategy))
+            .toList();
     return new OutputStructure(lines, headerEnd, footerStart, children);
   }
 }
@@ -262,18 +268,18 @@
   Interval get interval => new Interval(from, to);
 
   @override
-  Map toJson() {
+  Map toJson(JsonStrategy strategy) {
     return {
       'kind': kind.index,
       'name': name,
       'from': from,
       'to': to,
-      'children': children.map((child) => child.toJson()).toList(),
+      'children': children.map((child) => child.toJson(strategy)).toList(),
       'codeSource': codeSource != null ? codeSource.toJson() : null,
     };
   }
 
-  static AbstractEntity fromJson(Map json) {
+  static AbstractEntity fromJson(Map json, JsonStrategy strategy) {
     EntityKind kind = EntityKind.values[json['kind']];
     String name = json['name'];
     int from = json['from'];
@@ -287,13 +293,15 @@
         LibraryBlock lib = new LibraryBlock(name, from)
           ..to = to
           ..codeSource = codeSource;
-        json['children'].forEach((child) => lib.children.add(fromJson(child)));
+        json['children']
+            .forEach((child) => lib.children.add(fromJson(child, strategy)));
         return lib;
       case EntityKind.CLASS:
         LibraryClass cls = new LibraryClass(name, from)
             ..to = to
             ..codeSource = codeSource;
-        json['children'].forEach((child) => cls.children.add(fromJson(child)));
+        json['children']
+            .forEach((child) => cls.children.add(fromJson(child, strategy)));
         return cls;
       case EntityKind.TOP_LEVEL_FUNCTION:
         return new TopLevelFunction(name, from)
@@ -320,7 +328,7 @@
             ..to = to
             ..codeSource = codeSource;
         json['children'].forEach(
-            (child) => statics.children.add(fromJson(child)));
+            (child) => statics.children.add(fromJson(child, strategy)));
         return statics;
       case EntityKind.STATIC_FUNCTION:
         return new StaticFunction(name, from)
@@ -334,7 +342,7 @@
 class LibraryBlock extends AbstractEntity {
   List<BasicEntity> children = <BasicEntity>[];
   int get headerEnd => from + 2;
-  int get footerStart => to - 1;
+  int get footerStart => to/* - 1*/;
 
   LibraryBlock(String name, int from) : super(name, from);
 
@@ -624,9 +632,21 @@
 
   int get length => to - from;
 
+  bool get isEmpty => from == to;
+
   bool contains(int value) {
     return from <= value && value < to;
   }
+
+  Interval include(int index) {
+    return new Interval(Math.min(from, index), Math.max(to, index + 1));
+  }
+
+  bool inWindow(int index, {int windowSize: 0}) {
+    return from - windowSize <= index && index < to + windowSize;
+  }
+
+  String toString() => '[$from,$to[';
 }
 
 enum CodeKind {
@@ -635,15 +655,63 @@
   MEMBER,
 }
 
+class CodeLocation {
+  final Uri uri;
+  final String name;
+  final int offset;
+
+  CodeLocation(this.uri, this.name, this.offset);
+
+  String toString() => '$uri:$name:$offset';
+
+  Map toJson(JsonStrategy strategy) {
+    return {
+      'uri': uri.toString(),
+      'name': name,
+      'offset': offset,
+    };
+  }
+
+  static CodeLocation fromJson(Map json, JsonStrategy strategy) {
+    if (json == null) return null;
+    return new CodeLocation(
+        Uri.parse(json['uri']),
+        json['name'],
+        json['offset']);
+  }
+}
+
+/// A named entity in source code. This is used to serialize [Element]
+/// references without serializing the [Element] itself.
 class CodeSource {
   final CodeKind kind;
   final Uri uri;
   final String name;
   final int begin;
   final int end;
+  final List<CodeSource> members = <CodeSource>[];
 
   CodeSource(this.kind, this.uri, this.name, this.begin, this.end);
 
+  int get hashCode {
+    return
+        kind.hashCode * 13 +
+        uri.hashCode * 17 +
+        name.hashCode * 19 +
+        begin.hashCode * 23;
+  }
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! CodeSource) return false;
+    return
+        kind == other.kind &&
+        uri == other.uri &&
+        name == other.name &&
+        begin == other.begin;
+
+  }
+
   String toString() => '${toJson()}';
 
   Map toJson() {
@@ -653,16 +721,19 @@
       'name': name,
       'begin': begin,
       'end': end,
+      'members': members.map((c) => c.toJson()).toList(),
     };
   }
 
   static CodeSource fromJson(Map json) {
     if (json == null) return null;
-    return new CodeSource(
+    CodeSource codeSource = new CodeSource(
         CodeKind.values[json['kind']],
         Uri.parse(json['uri']),
         json['name'],
         json['begin'],
         json['end']);
+    json['members'].forEach((m) => codeSource.members.add(fromJson(m)));
+    return codeSource;
   }
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart
index 20359e4..ce4d362 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart
@@ -2,8 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'source_mapping_tester.dart' as tester;
+import 'source_mapping_tester.dart';
+import 'sourcemap_helper.dart';
+import 'package:compiler/src/io/position_information.dart';
 
 void main() {
-  tester.main(['invokes']);
+  test(['invokes'], whiteListFunction: (String config, String file) {
+    if (config == 'cps') {
+      return (CodePoint codePoint) {
+        // Temporarily allow missing code points on expression statements.
+        return codePoint.kind == StepKind.EXPRESSION_STATEMENT;
+      };
+    }
+    return emptyWhiteList;
+  });
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart
index 908ef87..3aaacce 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart
@@ -2,8 +2,31 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'source_mapping_tester.dart' as tester;
+import 'source_mapping_tester.dart';
+import 'sourcemap_helper.dart';
+import 'package:compiler/src/io/position_information.dart';
 
 void main() {
-  tester.main(['operators']);
+  test(['operators'], whiteListFunction: (String config, String file) {
+    bool allowGtOptimization(CodePoint codePoint) {
+      // Allow missing code points for bailout optimization.
+      return codePoint.jsCode.contains(r'.$gt()'); // # Issue 25304
+    }
+
+    if (config == 'cps') {
+      return (CodePoint codePoint) {
+        // Temporarily allow missing code points on expression statements.
+        if (codePoint.kind == StepKind.EXPRESSION_STATEMENT ||
+            codePoint.kind == StepKind.IF_CONDITION) {
+          return true;
+        }
+        if (codePoint.jsCode.contains(r'H.iae(')) {
+          // Allow missing code points for bailout calls.
+          return true;
+        }
+        return allowGtOptimization(codePoint);
+      };
+    }
+    return allowGtOptimization;
+  });
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_tester.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_tester.dart
index d935150..6134d20 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_tester.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_tester.dart
@@ -10,7 +10,23 @@
 import 'package:js_ast/js_ast.dart';
 import 'sourcemap_helper.dart';
 
+typedef CodePointWhiteListFunction WhiteListFunction(
+    String configuration, String file);
+
+typedef bool CodePointWhiteListFunction(CodePoint codePoint);
+
+CodePointWhiteListFunction emptyWhiteListFunction(String config, String file) {
+  return emptyWhiteList;
+}
+
+bool emptyWhiteList(CodePoint codePoint) => false;
+
 main(List<String> arguments) {
+  test(arguments);
+}
+
+void test(List<String> arguments,
+          {WhiteListFunction whiteListFunction: emptyWhiteListFunction}) {
   Set<String> configurations = new Set<String>();
   Set<String> files = new Set<String>();
   for (String argument in arguments) {
@@ -33,10 +49,12 @@
       List<String> options = TEST_CONFIGURATIONS[config];
       for (String file in files) {
         String filename = TEST_FILES[file];
-        TestResult result = await runTests(config, filename, options);
+        TestResult result = await runTests(
+            config, filename, options);
         if (result.missingCodePointsMap.isNotEmpty) {
-          result.printMissingCodePoints();
-          errorsFound = true;
+          errorsFound = result.printMissingCodePoints(
+              whiteListFunction(config, file));
+          true;
         }
         if (result.multipleNodesMap.isNotEmpty) {
           result.printMultipleNodes();
@@ -158,14 +176,22 @@
 
   TestResult(this.config, this.file, this.processor);
 
-  void printMissingCodePoints() {
+  bool printMissingCodePoints(
+      [CodePointWhiteListFunction codePointWhiteList = emptyWhiteList]) {
+    bool allWhiteListed = true;
     missingCodePointsMap.forEach((info, missingCodePoints) {
       print("Missing code points for ${info.element} in '$file' "
             "in config '$config':");
       for (CodePoint codePoint in missingCodePoints) {
-        print("  $codePoint");
+        if (codePointWhiteList(codePoint)) {
+          print("  $codePoint (white-listed)");
+        } else {
+          print("  $codePoint");
+          allWhiteListed = false;
+        }
       }
     });
+    return !allWhiteListed;
   }
 
   void printMultipleNodes() {
diff --git a/tests/compiler/dart2js/sourcemaps/sourcemap_helper.dart b/tests/compiler/dart2js/sourcemaps/sourcemap_helper.dart
index 019e8be..cb78cd4 100644
--- a/tests/compiler/dart2js/sourcemaps/sourcemap_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/sourcemap_helper.dart
@@ -8,6 +8,7 @@
 import 'dart:io';
 import 'package:compiler/compiler_new.dart';
 import 'package:compiler/src/apiimpl.dart' as api;
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/null_compiler_output.dart' show NullSink;
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/helpers/helpers.dart';
@@ -271,7 +272,6 @@
   }
 }
 
-const String USE_NEW_SOURCE_INFO =  '--use-new-source-info';
 const String DISABLE_INLINING = '--disable-inlining';
 
 /// Processor that computes [SourceMapInfo] for the JavaScript compiled for a
@@ -312,9 +312,8 @@
     OutputProvider outputProvider = outputToFile
         ? new CloningOutputProvider(targetUri, sourceMapFileUri)
         : new OutputProvider();
-    if (options.contains(USE_NEW_SOURCE_INFO)) {
+    if (options.contains(Flags.useNewSourceInfo)) {
       if (verbose) print('Using the new source information system.');
-      useNewSourceInfo = true;
     }
     api.CompilerImpl compiler = await compilerFor(
         outputProvider: outputProvider,
@@ -388,17 +387,22 @@
     }
 
     return new SourceMaps(
-        sourceFileManager, mainSourceMapInfo, elementSourceMapInfos);
+        compiler,
+        sourceFileManager,
+        mainSourceMapInfo,
+        elementSourceMapInfos);
   }
 }
 
 class SourceMaps {
+  final api.CompilerImpl compiler;
   final SourceFileManager sourceFileManager;
   // TODO(johnniwinther): Supported multiple output units.
   final SourceMapInfo mainSourceMapInfo;
   final Map<Element, SourceMapInfo> elementSourceMapInfos;
 
   SourceMaps(
+      this.compiler,
       this.sourceFileManager,
       this.mainSourceMapInfo,
           this.elementSourceMapInfos);
@@ -506,10 +510,10 @@
   /// Called when [node] defines a step of the given [kind] at the given
   /// [offset] when the generated JavaScript code.
   void onStep(js.Node node, Offset offset, StepKind kind) {
-    register('$kind', node);
+    register(kind, node);
   }
 
-  void register(String kind, js.Node node, {bool expectInfo: true}) {
+  void register(StepKind kind, js.Node node, {bool expectInfo: true}) {
 
     String dartCodeFromSourceLocation(SourceLocation sourceLocation) {
       SourceFile sourceFile =
@@ -556,7 +560,7 @@
 
 /// A JavaScript code point and its mapped dart source location.
 class CodePoint {
-  final String kind;
+  final StepKind kind;
   final String jsCode;
   final SourceLocation sourceLocation;
   final String dartCode;
diff --git a/tests/compiler/dart2js/sourcemaps/sourcemap_html_helper.dart b/tests/compiler/dart2js/sourcemaps/sourcemap_html_helper.dart
index 3ca926b..a3b10a8 100644
--- a/tests/compiler/dart2js/sourcemaps/sourcemap_html_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/sourcemap_html_helper.dart
@@ -27,10 +27,11 @@
   return input;
 }
 
+const int HUE_COUNT = 24;
+
 /// Returns the [index]th color for visualization.
 HSV toColor(int index) {
-  int hueCount = 24;
-  double h = 360.0 * (index % hueCount) / hueCount;
+  double h = 360.0 * (index % HUE_COUNT) / HUE_COUNT;
   double v = 1.0;
   double s = 0.5;
   return new HSV(h, s, v);
@@ -52,13 +53,19 @@
 
 /// Return the html for the [index] line number. If [width] is provided, shorter
 /// line numbers will be prefixed with spaces to match the width.
-String lineNumber(int index, {int width, bool useNbsp: false}) {
+String lineNumber(int index,
+                  {int width,
+                   bool useNbsp: false,
+                   String className}) {
+  if (className == null) {
+    className = 'lineNumber';
+  }
   String text = '${index + 1}';
   String padding = useNbsp ? '&nbsp;' : ' ';
   if (width != null && text.length < width) {
     text = (padding * (width - text.length)) + text;
   }
-  return '<span class="lineNumber">$text$padding</span>';
+  return '<span class="$className">$text$padding</span>';
 }
 
 /// Return the html escaped [text].
@@ -221,14 +228,6 @@
   }
 }
 
-class Annotation {
-  final id;
-  final int codeOffset;
-  final String title;
-
-  Annotation(this.id, this.codeOffset, this.title);
-}
-
 class ElementScheme {
   const ElementScheme();
 
@@ -280,14 +279,16 @@
   StringBuffer htmlBuffer = new StringBuffer();
   List<CodeLine> lines = convertAnnotatedCodeToCodeLines(
       code, annotations,
-      colorScheme: colorScheme,
-      elementScheme: elementScheme,
       windowSize: windowSize);
   int lineNoWidth;
   if (lines.isNotEmpty) {
     lineNoWidth = '${lines.last.lineNo + 1}'.length;
   }
-  HtmlPrintContext context = new HtmlPrintContext(lineNoWidth: lineNoWidth);
+  HtmlPrintContext context = new HtmlPrintContext(
+      lineNoWidth: lineNoWidth,
+      getAnnotationData: createAnnotationDataFunction(
+          colorScheme: colorScheme,
+          elementScheme: elementScheme));
   for (CodeLine line in lines) {
     line.printHtmlOn(htmlBuffer, context);
   }
@@ -297,34 +298,42 @@
 List<CodeLine> convertAnnotatedCodeToCodeLines(
     String code,
     Iterable<Annotation> annotations,
-    {CssColorScheme colorScheme: const SingleColorScheme(),
-     ElementScheme elementScheme: const ElementScheme(),
-     int windowSize}) {
+    {int startLine,
+     int endLine,
+     int windowSize,
+     Uri uri}) {
 
   List<CodeLine> lines = <CodeLine>[];
   CodeLine currentLine;
+  final List<Annotation> currentAnnotations = <Annotation>[];
   int offset = 0;
   int lineIndex = 0;
   int firstLine;
   int lastLine;
-  bool pendingSourceLocationsEnd = false;
 
-  void write(String code, HtmlPart html) {
+  void addCode(String code) {
     if (currentLine != null) {
       currentLine.codeBuffer.write(code);
-      currentLine.htmlParts.add(html);
+      currentLine.codeParts.add(
+          new CodePart(currentAnnotations.toList(), code));
+      currentAnnotations.clear();
     }
   }
 
-  void startLine(int currentOffset) {
-    lines.add(currentLine = new CodeLine(lines.length, currentOffset));
+  void addAnnotations(List<Annotation> annotations) {
+    currentAnnotations.addAll(annotations);
+    currentLine.annotations.addAll(annotations);
+  }
+
+  void beginLine(int currentOffset) {
+    lines.add(currentLine =
+        new CodeLine(lines.length, currentOffset, uri: uri));
   }
 
   void endCurrentLocation() {
-    if (pendingSourceLocationsEnd) {
-      write('', const ConstHtmlPart('</a>'));
+    if (currentAnnotations.isNotEmpty) {
+      addCode('');
     }
-    pendingSourceLocationsEnd = false;
   }
 
   void addSubstring(int until, {bool isFirst: false, bool isLast: false}) {
@@ -339,26 +348,15 @@
     }
     int localOffset = 0;
     if (isFirst) {
-      startLine(offset + localOffset);
+      beginLine(offset + localOffset);
     }
     for (String line in substring.split('\n')) {
       if (!first) {
         endCurrentLocation();
-        write('', const NewLine());
         lineIndex++;
-        startLine(offset + localOffset);
+        beginLine(offset + localOffset);
       }
-      if (pendingSourceLocationsEnd && !colorScheme.showLocationAsSpan) {
-        if (line.isNotEmpty) {
-          String before = line.substring(0, 1);
-          write(before, new HtmlText(before));
-          endCurrentLocation();
-          String after = line.substring(1);
-          write(after, new HtmlText(after));
-        }
-      } else {
-        write(line, new HtmlText(line));
-      }
+      addCode(line);
       first = false;
       localOffset += line.length + 1;
     }
@@ -370,44 +368,7 @@
 
   void insertAnnotations(List<Annotation> annotations) {
     endCurrentLocation();
-
-    String color;
-    var id;
-    String title;
-    if (annotations.length == 1) {
-      Annotation annotation = annotations.single;
-      if (annotation != null) {
-        id = annotation.id;
-        color = colorScheme.singleLocationToCssColor(id);
-        title = annotation.title;
-      }
-    } else {
-      id = annotations.first.id;
-      List ids = [];
-      for (Annotation annotation in annotations) {
-        ids.add(annotation.id);
-      }
-      color = colorScheme.multiLocationToCssColor(ids);
-      title = annotations.map((l) => l.title).join(',');
-    }
-    if (id != null) {
-      Set ids = annotations.map((l) => l.id).toSet();
-      String name = elementScheme.getName(id, ids);
-      String href = elementScheme.getHref(id, ids);
-      String onclick = elementScheme.onClick(id, ids);
-      String onmouseover = elementScheme.onMouseOver(id, ids);
-      String onmouseout = elementScheme.onMouseOut(id, ids);
-      write('', new AnchorHtmlPart(
-          color: color,
-          name: name,
-          href: href,
-          title: title,
-          onclick: onclick,
-          onmouseover: onmouseover,
-          onmouseout: onmouseout));
-      pendingSourceLocationsEnd = true;
-    }
-    currentLine.annotations.addAll(annotations);
+    addAnnotations(annotations);
     if (annotations.last == null) {
       endCurrentLocation();
     }
@@ -430,8 +391,8 @@
   addSubstring(code.length, isFirst: first, isLast: true);
   endCurrentLocation();
 
-  int start = 0;
-  int end = lines.length - 1;
+  int start = startLine ?? 0;
+  int end = endLine ?? lines.length - 1;
   if (windowSize != null) {
     start = Math.max(firstLine - windowSize, start);
     end = Math.min(lastLine + windowSize, end);
diff --git a/tests/compiler/dart2js/sourcemaps/sourcemap_html_templates.dart b/tests/compiler/dart2js/sourcemaps/sourcemap_html_templates.dart
index 29adff1..6d0bcb2 100644
--- a/tests/compiler/dart2js/sourcemaps/sourcemap_html_templates.dart
+++ b/tests/compiler/dart2js/sourcemaps/sourcemap_html_templates.dart
@@ -165,6 +165,9 @@
 h3 {
   cursor: pointer;
 }
+.line {
+  margin: 0px;
+}
 .lineNumber {
   font-size: smaller;
   color: #888;
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 9406ea9..1d3e26d 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -29,7 +29,7 @@
 import 'parser_helper.dart';
 
 final MessageKind NOT_ASSIGNABLE = MessageKind.NOT_ASSIGNABLE;
-final MessageKind MEMBER_NOT_FOUND = MessageKind.MEMBER_NOT_FOUND;
+final MessageKind UNDEFINED_GETTER = MessageKind.UNDEFINED_GETTER;
 
 main() {
   List tests = [testSimpleTypes,
@@ -126,7 +126,7 @@
 //        "for (String s in strings) {} }");
 //  check("{ List<int> ints = [1,2,3]; for (String s in ints) {} }",
 //        NOT_ASSIGNABLE);
-//  check("for (String s in true) {}", MessageKind.METHOD_NOT_FOUND);
+//  check("for (String s in true) {}", MessageKind.UNDEFINED_METHOD);
 }
 
 
@@ -214,13 +214,13 @@
 
   analyzeIn(compiler, method, """{ 
       for (var e in new HasNoIterator()) {} 
-  }""", warnings: MessageKind.MEMBER_NOT_FOUND);
+  }""", warnings: MessageKind.UNDEFINED_GETTER);
   analyzeIn(compiler, method, """{ 
       for (String e in new HasNoIterator()) {} 
-  }""", warnings: MessageKind.MEMBER_NOT_FOUND);
+  }""", warnings: MessageKind.UNDEFINED_GETTER);
   analyzeIn(compiler, method, """{ 
       for (int e in new HasNoIterator()) {} 
-  }""", warnings: MessageKind.MEMBER_NOT_FOUND);
+  }""", warnings: MessageKind.UNDEFINED_GETTER);
 
   analyzeIn(compiler, method, """{ 
       for (var e in new HasCustomIntIterator()) {} 
@@ -234,13 +234,13 @@
 
   analyzeIn(compiler, method, """{ 
       for (var e in new HasCustomNoCurrentIterator()) {} 
-  }""", hints: MessageKind.MEMBER_NOT_FOUND);
+  }""", hints: MessageKind.UNDEFINED_GETTER);
   analyzeIn(compiler, method, """{ 
       for (String e in new HasCustomNoCurrentIterator()) {} 
-  }""", hints: MessageKind.MEMBER_NOT_FOUND);
+  }""", hints: MessageKind.UNDEFINED_GETTER);
   analyzeIn(compiler, method, """{ 
       for (int e in new HasCustomNoCurrentIterator()) {} 
-  }""", hints: MessageKind.MEMBER_NOT_FOUND);
+  }""", hints: MessageKind.UNDEFINED_GETTER);
 
   analyzeIn(compiler, method, """{ 
       var localDyn; 
@@ -573,22 +573,22 @@
     check("{ var i = 1 ${op} 2; }");
     check("{ var i = 1; i ${op}= 2; }");
     check("{ int i; var j = (i = true) ${op} 2; }",
-          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+          warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
     check("{ int i; var j = 1 ${op} (i = true); }",
           warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
   }
   for (final op in ['-', '~']) {
     check("{ var i = ${op}1; }");
     check("{ int i; var j = ${op}(i = true); }",
-          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+          warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
   }
   for (final op in ['++', '--']) {
     check("{ int i = 1; int j = i${op}; }");
     check("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE);
     check("{ bool b = true; bool j = b${op}; }",
-          warnings: MessageKind.OPERATOR_NOT_FOUND);
+          warnings: MessageKind.UNDEFINED_OPERATOR);
     check("{ bool b = true; int j = ${op}b; }",
-          warnings: MessageKind.OPERATOR_NOT_FOUND);
+          warnings: MessageKind.UNDEFINED_OPERATOR);
   }
   for (final op in ['||', '&&']) {
     check("{ bool b = (true ${op} false); }");
@@ -600,7 +600,7 @@
     check("{ bool b = 1 ${op} 2; }");
     check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
     check("{ int i; bool b = (i = true) ${op} 2; }",
-          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+          warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
     check("{ int i; bool b = 1 ${op} (i = true); }",
           warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
   }
@@ -1005,9 +1005,9 @@
     check(c, "(e)();");
     check(c, "(e)(1);");
     check(c, "(e)('string');");
-    check(c, "(foo)();", MEMBER_NOT_FOUND);
-    check(c, "(foo)(1);", MEMBER_NOT_FOUND);
-    check(c, "(foo)('string');", MEMBER_NOT_FOUND);
+    check(c, "(foo)();", UNDEFINED_GETTER);
+    check(c, "(foo)(1);", UNDEFINED_GETTER);
+    check(c, "(foo)('string');", UNDEFINED_GETTER);
 
     // Invocations on function expressions.
     check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT);
@@ -1028,11 +1028,11 @@
     check(c, "int k = staticMethod('string');");
     check(c, "String k = staticMethod('string');",
           NOT_ASSIGNABLE);
-    check(d, "staticMethod();", MessageKind.METHOD_NOT_FOUND);
-    check(d, "staticMethod(1);", MessageKind.METHOD_NOT_FOUND);
-    check(d, "staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
-    check(d, "int k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
-    check(d, "String k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
+    check(d, "staticMethod();", MessageKind.UNDEFINED_METHOD);
+    check(d, "staticMethod(1);", MessageKind.UNDEFINED_METHOD);
+    check(d, "staticMethod('string');", MessageKind.UNDEFINED_METHOD);
+    check(d, "int k = staticMethod('string');", MessageKind.UNDEFINED_METHOD);
+    check(d, "String k = staticMethod('string');", MessageKind.UNDEFINED_METHOD);
 
     // Invocation on dynamic variable.
     check(c, "e.foo();");
@@ -1040,12 +1040,12 @@
     check(c, "e.foo('string');");
 
     // Invocation on unresolved variable.
-    check(c, "foo();", MessageKind.METHOD_NOT_FOUND);
-    check(c, "foo(1);", MessageKind.METHOD_NOT_FOUND);
-    check(c, "foo('string');", MessageKind.METHOD_NOT_FOUND);
-    check(c, "foo(a: 'string');", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo();", MessageKind.UNDEFINED_METHOD);
+    check(c, "foo(1);", MessageKind.UNDEFINED_METHOD);
+    check(c, "foo('string');", MessageKind.UNDEFINED_METHOD);
+    check(c, "foo(a: 'string');", MessageKind.UNDEFINED_METHOD);
     check(c, "foo(a: localMethod(1));",
-          [MessageKind.METHOD_NOT_FOUND, NOT_ASSIGNABLE]);
+          [MessageKind.UNDEFINED_METHOD, NOT_ASSIGNABLE]);
   });
 }
 
@@ -1526,13 +1526,13 @@
   analyzeIn(compiler, method, "{ int type = T; }", warnings: NOT_ASSIGNABLE);
 
   analyzeIn(compiler, method, "{ String typeName = T.toString(); }");
-  analyzeIn(compiler, method, "{ T.foo; }", warnings: MEMBER_NOT_FOUND);
+  analyzeIn(compiler, method, "{ T.foo; }", warnings: UNDEFINED_GETTER);
   analyzeIn(compiler, method, "{ T.foo = 0; }",
-      warnings: MessageKind.SETTER_NOT_FOUND);
+      warnings: MessageKind.UNDEFINED_SETTER);
   analyzeIn(compiler, method, "{ T.foo(); }",
-      warnings: MessageKind.METHOD_NOT_FOUND);
+      warnings: MessageKind.UNDEFINED_METHOD);
   analyzeIn(compiler, method, "{ T + 1; }",
-      warnings: MessageKind.OPERATOR_NOT_FOUND);
+      warnings: MessageKind.UNDEFINED_OPERATOR);
 }
 
 void testTypeVariableLookup1(MockCompiler compiler) {
@@ -1566,10 +1566,10 @@
   test('s.getter');
 
   test('t.toString');
-  test('t.field', MEMBER_NOT_FOUND);
-  test('t.method(1)', MessageKind.METHOD_NOT_FOUND);
-  test('t + t', MessageKind.OPERATOR_NOT_FOUND);
-  test('t.getter', MEMBER_NOT_FOUND);
+  test('t.field', UNDEFINED_GETTER);
+  test('t.method(1)', MessageKind.UNDEFINED_METHOD);
+  test('t + t', MessageKind.UNDEFINED_OPERATOR);
+  test('t.getter', UNDEFINED_GETTER);
 
   test('s.field = "hest"', NOT_ASSIGNABLE);
   test('s.method("hest")', NOT_ASSIGNABLE);
@@ -1623,10 +1623,10 @@
   }
 
   test('s.toString');
-  test('s.field', MEMBER_NOT_FOUND);
-  test('s.method(1)', MessageKind.METHOD_NOT_FOUND);
-  test('s + s', MessageKind.OPERATOR_NOT_FOUND);
-  test('s.getter', MEMBER_NOT_FOUND);
+  test('s.field', UNDEFINED_GETTER);
+  test('s.method(1)', MessageKind.UNDEFINED_METHOD);
+  test('s + s', MessageKind.UNDEFINED_OPERATOR);
+  test('s.getter', UNDEFINED_GETTER);
 }
 
 void testFunctionTypeLookup(MockCompiler compiler) {
@@ -1636,8 +1636,8 @@
 
   check('(int f(int)) => f.toString;');
   check('(int f(int)) => f.toString();');
-  check('(int f(int)) => f.foo;', warnings: MEMBER_NOT_FOUND);
-  check('(int f(int)) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
+  check('(int f(int)) => f.foo;', warnings: UNDEFINED_GETTER);
+  check('(int f(int)) => f.foo();', warnings: MessageKind.UNDEFINED_METHOD);
 }
 
 void testTypedefLookup(MockCompiler compiler) {
@@ -1648,8 +1648,8 @@
   compiler.parseScript("typedef int F(int);");
   check('(F f) => f.toString;');
   check('(F f) => f.toString();');
-  check('(F f) => f.foo;', warnings: MEMBER_NOT_FOUND);
-  check('(F f) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
+  check('(F f) => f.foo;', warnings: UNDEFINED_GETTER);
+  check('(F f) => f.foo();', warnings: MessageKind.UNDEFINED_METHOD);
 }
 
 void testTypeLiteral(MockCompiler compiler) {
@@ -1683,11 +1683,11 @@
 
   // Check static property access.
   check('m() => Class.field;');
-  check('m() => (Class).field;', warnings: MEMBER_NOT_FOUND);
+  check('m() => (Class).field;', warnings: UNDEFINED_GETTER);
 
   // Check static method access.
   check('m() => Class.method();');
-  check('m() => (Class).method();', warnings: MessageKind.METHOD_NOT_FOUND);
+  check('m() => (Class).method();', warnings: MessageKind.UNDEFINED_METHOD);
 
   // Check access in invocation.
   check('m() => Class();', warnings: MessageKind.NOT_CALLABLE);
@@ -1956,8 +1956,9 @@
   check("int v = c.overriddenField;");
   check("c.overriddenField = 0;");
   check("int v = c.getterField;");
-  check("c.getterField = 0;", MessageKind.SETTER_NOT_FOUND);
-  check("int v = c.setterField;", MessageKind.GETTER_NOT_FOUND);
+  check("c.getterField = 0;", MessageKind.UNDEFINED_SETTER);
+  check("int v = c.setterField;",
+      MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER);
   check("c.setterField = 0;");
 
   check("int v = gc.overriddenField;");
@@ -1965,13 +1966,14 @@
   check("int v = gc.setterField;");
   check("gc.setterField = 0;");
   check("int v = gc.getterField;");
-  check("gc.getterField = 0;", MessageKind.SETTER_NOT_FOUND);
+  check("gc.getterField = 0;", MessageKind.UNDEFINED_SETTER);
 
   check("int v = sc.overriddenField;");
   check("sc.overriddenField = 0;");
   check("int v = sc.getterField;");
   check("sc.getterField = 0;");
-  check("int v = sc.setterField;", MessageKind.GETTER_NOT_FOUND);
+  check("int v = sc.setterField;",
+      MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER);
   check("sc.setterField = 0;");
 }
 
@@ -2012,7 +2014,7 @@
             if (a is C) {
               var x = a.c;
             }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
         infos: []);
 
@@ -2021,8 +2023,8 @@
             if (a is C) {
               var x = '${a.c}${a.c}';
             }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND,
-                   MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER,
+                   MessageKind.UNDEFINED_GETTER],
         hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
         infos: []);
 
@@ -2031,8 +2033,8 @@
             if (a is C) {
               var x = '${a.d}${a.d}'; // Type promotion wouldn't help.
             }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND,
-                   MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER,
+                   MessageKind.UNDEFINED_GETTER],
         hints: [],
         infos: []);
 
@@ -2041,7 +2043,7 @@
            if (d is E) { // Suggest E<int>.
              var x = d.e;
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
                              {'shownTypeSuggestion': 'E<int>'})],
         infos: []);
@@ -2051,7 +2053,7 @@
            if (d is F) { // Suggest F<int, dynamic>.
              var x = d.f;
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
                              {'shownTypeSuggestion': 'F<int, dynamic>'})],
         infos: []);
@@ -2061,7 +2063,7 @@
            if (d is G) { // Suggest G<int>.
              var x = d.f;
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
                              {'shownTypeSuggestion': 'G<int>'})],
         infos: []);
@@ -2071,7 +2073,7 @@
            if (f is G) { // Cannot suggest a more specific type.
              var x = f.g;
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [MessageKind.NOT_MORE_SPECIFIC],
         infos: []);
 
@@ -2080,7 +2082,7 @@
            if (d is E) {
              var x = d.f; // Type promotion wouldn't help.
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [],
         infos: []);
 
@@ -2090,7 +2092,7 @@
              a = null;
              var x = a.b;
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [MessageKind.POTENTIAL_MUTATION],
         infos: [MessageKind.POTENTIAL_MUTATION_HERE]);
 
@@ -2100,7 +2102,7 @@
              a = null;
              var x = a.c; // Type promotion wouldn't help.
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [],
         infos: []);
 
@@ -2110,7 +2112,7 @@
            if (a is B) {
              var x = a.b;
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE],
         infos: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE]);
 
@@ -2120,7 +2122,7 @@
            if (a is B) {
              var x = a.c; // Type promotion wouldn't help.
            }''',
-        warnings: [MessageKind.MEMBER_NOT_FOUND],
+        warnings: [MessageKind.UNDEFINED_GETTER],
         hints: [],
         infos: []);
 
@@ -2131,7 +2133,7 @@
              var y = a.b;
            }
            a = new A();''',
-      warnings: [MessageKind.MEMBER_NOT_FOUND],
+      warnings: [MessageKind.UNDEFINED_GETTER],
       hints: [MessageKind.ACCESSED_IN_CLOSURE],
       infos: [MessageKind.ACCESSED_IN_CLOSURE_HERE,
               MessageKind.POTENTIAL_MUTATION_HERE]);
@@ -2143,7 +2145,7 @@
              var y = a.c; // Type promotion wouldn't help.
            }
            a = new A();''',
-      warnings: [MessageKind.MEMBER_NOT_FOUND],
+      warnings: [MessageKind.UNDEFINED_GETTER],
       hints: [],
       infos: []);
 }
@@ -2197,7 +2199,7 @@
   check('new A().b..b;');
 
   check('new A().b..a;',
-        warnings: MEMBER_NOT_FOUND);
+        warnings: UNDEFINED_GETTER);
 
   check('B b = new A().b..c;');
 
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 1399e79..bde5681 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -69,3 +69,18 @@
 
 [ $compiler == dart2js && $cps_ir ]
 async_stacktrace_test/asyncStar: Crash # (foo()async*{try {tr...  cannot handle sync*/async* functions
+
+[ $compiler == dart2js && $cps_ir && $checked ]
+*: Skip # `assert` not implemented, 75% of the tests fail.
+
+[ $compiler == dart2js && $runtime == chrome && $system == windows ]
+class_test: Pass, Slow # Issue 25940
+consistent_codeUnitAt_error_test: Pass, Slow # Issue 25940
+closure_capture3_test: Pass, Slow # Issue 25940
+deferred_split_test: Pass, Slow # Issue 25940
+closure_capture5_test: Pass, Slow # Issue 25940
+conditional_test: Pass, Slow # Issue 25940
+constant_javascript_semantics2_test: Pass, Slow # Issue 25940
+
+[ $compiler == dart2js && $runtime == ff && $system == windows ]
+consistent_index_error_string_test: Pass, Slow # Issue 25940
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 3a172de..e08d601 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -25,3 +25,6 @@
 native_exception_test: RuntimeError # Issue 24421
 optimization_hints_test: RuntimeError # Please triage this failure.
 subclassing_constructor_2_test: RuntimeError # Please triage this failure.
+
+[ $compiler == dart2js && $cps_ir && $checked ]
+*: Skip # `assert` not implemented, 75% of the tests fail.
diff --git a/tests/corelib/big_integer_arith_vm_test.dart b/tests/corelib/big_integer_arith_vm_test.dart
index 49e6e0d..b9696b4 100644
--- a/tests/corelib/big_integer_arith_vm_test.dart
+++ b/tests/corelib/big_integer_arith_vm_test.dart
@@ -5,7 +5,7 @@
 // Testing Bigints with and without intrinsics.
 // VMOptions=
 // VMOptions=--no_intrinsify
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 library big_integer_test;
 import "package:expect/expect.dart";
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 52a0522..083fa8f 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -183,14 +183,20 @@
 
 [ $compiler == dart2js && $cps_ir && $host_checked ]
 regexp/pcre_test: Crash # Stack Overflow
+collection_removes_test: Crash # Issue 25911
+
+[ $compiler == dart2js && $host_checked ]
+package_resource_test: Crash # Issue 25911
 
 [ $noopt || $compiler == precompiler ]
 # Stacktraces in precompilation omit inlined frames.
 stacktrace_current_test: Pass, RuntimeError
 error_stack_trace1_test: Pass, RuntimeError
 
+[ $noopt || $compiler == precompiler || $mode == product ]
+apply3_test: SkipByDesign # Imports dart:mirrors
+
 [ $noopt || $compiler == precompiler ]
-apply3_test: CompileTimeError # Imports dart:mirrors
 regexp/stack-overflow_test: RuntimeError, OK # Smaller limit with irregex interpreter
 big_integer_huge_mul_vm_test: Pass, Timeout # --no_intrinsify
 big_integer_parsed_mul_div_vm_test: Pass, Timeout # --no_intrinsify
@@ -199,4 +205,3 @@
 [ $runtime == dart_product ]
 data_resource_test: Skip # Resolve URI not supported yet in product mode.
 package_resource_test: Skip # Resolve URI not supported yet in product mode.
-apply3_test: SkipByDesign # Imports dart:mirrors
diff --git a/tests/corelib/regress_r21715_test.dart b/tests/corelib/regress_r21715_test.dart
index cfbcef1..5a0ef73 100644
--- a/tests/corelib/regress_r21715_test.dart
+++ b/tests/corelib/regress_r21715_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--optimization_counter_threshold=5
+// VMOptions=--optimization_counter_threshold=5 --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/html/element_animate_test.dart b/tests/html/element_animate_test.dart
index 31becda..10477c9 100644
--- a/tests/html/element_animate_test.dart
+++ b/tests/html/element_animate_test.dart
@@ -14,7 +14,7 @@
 
   group('animate_supported', () {
     test('supported', () {
-      expect(AnimationPlayer.supported, true);
+      expect(Animation.supported, isTrue);
     });
   });
 
@@ -24,7 +24,7 @@
       var opacity = num.parse(body.getComputedStyle().opacity);
       body.animate([{"opacity": 100}, {"opacity": 0}], 100);
       var newOpacity = num.parse(body.getComputedStyle().opacity);
-      expect(newOpacity < opacity, isTrue);
+      expect(newOpacity == opacity, isTrue);
     });
   });
 
diff --git a/tests/html/html.status b/tests/html/html.status
index 1facc17..3398318 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -22,6 +22,7 @@
 worker_api_test: Fail # Issue 10223
 resource_http_test: Fail # Issue 24203
 js_function_getter_trust_types_test: Skip # dartium doesn't support trust types.
+websocket_test/supported: Skip # Dartium 45 roll timesout
 
 [ $compiler == none && $mode == debug && ($runtime == drt || $runtime == dartium ) ]
 datalistelement_test: Skip # Issue 20540
@@ -31,6 +32,9 @@
 wrapping_collections_test: SkipByDesign # Testing an issue that is only relevant to Dartium
 js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue #25759
 
+[ $compiler == dart2js && ($runtime == chrome || $runtime == drt || $runtime == dartium || $runtime == safari) ]
+websql_test/functional: RuntimeError, Slow # Issue 25927
+
 [ $compiler == dart2js && $checked ]
 js_function_getter_trust_types_test: Skip # --trust-type-annotations incompatible with --checked
 
@@ -44,6 +48,7 @@
 [ $compiler == dart2js && $browser ]
 custom/created_callback_test: Fail # Support for created constructor. Issue 14835
 fontface_loaded_test: Fail # Support for promises.
+js_typed_interop_side_cast_exp_test: RuntimeError # Issue 25937
 
 [ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie) ]
 custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
@@ -103,28 +108,18 @@
 
 [ $runtime == chrome ]
 touchevent_test/supported: Fail # Touch events are only supported on touch devices
-element_animate_test/simple_timing: RuntimeError # Please triage this failure
 element_types_test/supported_object: RuntimeError # Issue 25155
 element_types_test/supported_embed: RuntimeError # Issue 25155
 svgelement_test/PathElement: RuntimeError # Issue 25665
 
-[ $runtime == chrome && $cps_ir == false ]
-element_animate_test/omit_timing: RuntimeError # Also timing out on MacOS. Issue 23507
-element_animate_test/timing_dict: RuntimeError # Also timing out on MacOS. Issue 23507
-
 [ $runtime == chrome && $system == macos ]
 canvasrenderingcontext2d_test/drawImage_video_element: Skip # Times out. Please triage this failure.
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip # Times out. Please triage this failure.
-element_animate_test/omit_timing: Skip # Timing out on MacOS. Issue 23507
-element_animate_test/timing_dict: Skip # Timing out on MacOS. Issue 23507
 transition_event_test/functional: Skip # Times out. Issue 22167
 request_animation_frame_test: Skip # Times out. Issue 22167
 
 [$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid ]
 webgl_1_test: Pass, Fail # Issue 8219
-element_animate_test/omit_timing: RuntimeError # Dartium 45 roll. Issue 25786
-element_animate_test/simple_timing: RuntimeError # Dartium 45 roll. Issue 25786
-element_animate_test/timing_dict: RuntimeError # Dartium 45 roll. Issue 25786
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $system == windows ]
 websql_test: Skip # Issue 4941: stderr contains a backtrace.
@@ -445,3 +440,11 @@
 
 # These are raw dart:js tests that fail due to bugs in the CPS IR:
 js_test/Dart_functions: RuntimeError # Tree-shaking an escaping closure #25720
+
+[ $compiler == dart2js && $cps_ir && $host_checked ]
+js_typed_interop_default_arg_test/none: Crash # Issue 25911
+js_typed_interop_default_arg_test/default_value: Crash # Issue 25911
+js_typed_interop_default_arg_test/explicit_argument: Crash # Issue 25911
+
+[ $compiler == dart2js && $cps_ir && $checked ]
+*: Skip # `assert` not implemented
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 953be4d..3508c2c 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -139,7 +139,7 @@
 spawn_uri_fail_test: SkipByDesign  # Uses dart:io.
 scenarios/*: SkipByDesign  # Use automatic package resolution, spawnFunction and .dart URIs.
 
-[ $noopt || $compiler == precompiler || $runtime == dart_product ]
+[ $noopt || $compiler == precompiler || $mode == product ]
 # Imports dart:mirrors
 count_test: SkipByDesign
 cross_isolate_message_test: SkipByDesign
@@ -161,10 +161,6 @@
 static_function_test: SkipByDesign
 unresolved_ports_test: SkipByDesign
 
-[ $compiler == precompiler ]
-function_send_test: RuntimeError # Issue 25892
-message3_test/fun: RuntimeError # Issue 25892
-
 [ $runtime == dart_precompiled || $runtime == dart_product ]
 deferred_in_isolate_test: Skip # Isolate.spawnUri
 deferred_in_isolate2_test: Skip # Isolate.spawnUri
@@ -184,3 +180,6 @@
 [ $runtime == dart_product ]
 spawn_uri_missing_from_isolate_test: Skip # SpawnUri in product mode
 spawn_uri_missing_test: Skip # SpawnUri in product mode
+
+[ $compiler == dart2js && $cps_ir && $checked ]
+*: Skip # `assert` not implemented
diff --git a/tests/language/allocation_sinking_inlining_test.dart b/tests/language/allocation_sinking_inlining_test.dart
index 9ed27b6..e2ac626 100644
--- a/tests/language/allocation_sinking_inlining_test.dart
+++ b/tests/language/allocation_sinking_inlining_test.dart
@@ -2,7 +2,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 // Test allocation sinking with polymorphic inlining.
 
diff --git a/tests/language/arithmetic_canonicalization_test.dart b/tests/language/arithmetic_canonicalization_test.dart
index 04a9a12..23567ca 100644
--- a/tests/language/arithmetic_canonicalization_test.dart
+++ b/tests/language/arithmetic_canonicalization_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test canonicalization of simple arithmetic equivalences.
-// VMOptions=--optimization-counter-threshold=20 --no-use-osr
+// VMOptions=--optimization-counter-threshold=20 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/arithmetic_smi_overflow_test.dart b/tests/language/arithmetic_smi_overflow_test.dart
index a0abb27..1a4eec1 100644
--- a/tests/language/arithmetic_smi_overflow_test.dart
+++ b/tests/language/arithmetic_smi_overflow_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program to test arithmetic operations.
 
-// VMOptions=--optimization_counter_threshold=5
+// VMOptions=--optimization_counter_threshold=5 --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/arithmetic_test.dart b/tests/language/arithmetic_test.dart
index b660960..ec4ece9 100644
--- a/tests/language/arithmetic_test.dart
+++ b/tests/language/arithmetic_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program to test arithmetic operations.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 library arithmetic_test;
 import "package:expect/expect.dart";
@@ -423,24 +423,24 @@
     var b = -1;
     for (var i = 0; i < 10; i++) Expect.equals(0x40000000, div(a, b));
   }
-  
-  
+
+
   static int divMod(a, b) => a ~/ b + a % b;
-  
+
   static void testSmiDivModDeopt() {
     var a = -0x40000000;
     var b = -1;
     for (var i = 0; i < 10; i++) Expect.equals(0x40000000, divMod(a, b));
   }
-  
+
   static double sinCosSub(double a) => sin(a) - cos(a);
-  
+
   static double sinCosAddCos(double a)  => sin(a) * cos(a) + cos(a);
 
   static void testSinCos() {
     var e = sin(1.234) - cos(1.234);
     var f = sin(1.234) * cos(1.234) + cos(1.234);
-    
+
     for (var i = 0; i < 20; i++) {
       Expect.approxEquals(e, sinCosSub(1.234));
       Expect.approxEquals(f, sinCosAddCos(1.234));
@@ -456,7 +456,7 @@
       cos(i);
     }
   }
-    
+
   static mySqrt(var x) => sqrt(x);
 
   static testSqrtDeopt() {
diff --git a/tests/language/assert_assignable_type_test.dart b/tests/language/assert_assignable_type_test.dart
index 246f13e..1bde62b 100644
--- a/tests/language/assert_assignable_type_test.dart
+++ b/tests/language/assert_assignable_type_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program to test arithmetic operations.
-// VMOptions=--optimization-counter-threshold=10 --checked
+// VMOptions=--optimization-counter-threshold=10 --checked --no-background-compilation
 
 // This test crashes if we recompute type of AssertAssignableInstr based on its
 // output types. By doing that we would eliminate not only the unnecessary
diff --git a/tests/language/assign_op_test.dart b/tests/language/assign_op_test.dart
index 9a9ebe7..a531f31 100644
--- a/tests/language/assign_op_test.dart
+++ b/tests/language/assign_op_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing assign operators.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/async_control_structures_test.dart b/tests/language/async_control_structures_test.dart
index 23365f4..cd09a86 100644
--- a/tests/language/async_control_structures_test.dart
+++ b/tests/language/async_control_structures_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/await_exceptions_test.dart b/tests/language/await_exceptions_test.dart
index f1d39a1..c739024 100644
--- a/tests/language/await_exceptions_test.dart
+++ b/tests/language/await_exceptions_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--optimization-counter-threshold=5
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
diff --git a/tests/language/await_future_test.dart b/tests/language/await_future_test.dart
index b0151c5..2ec30fe8 100644
--- a/tests/language/await_future_test.dart
+++ b/tests/language/await_future_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--optimization-counter-threshold=5
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
diff --git a/tests/language/await_nonfuture_test.dart b/tests/language/await_nonfuture_test.dart
index 71f46f5..fbdc18c 100644
--- a/tests/language/await_nonfuture_test.dart
+++ b/tests/language/await_nonfuture_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--optimization-counter-threshold=5
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/await_test.dart b/tests/language/await_test.dart
index cb779d9..257d840 100644
--- a/tests/language/await_test.dart
+++ b/tests/language/await_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=---optimization-counter-threshold=10
+// VMOptions=---optimization-counter-threshold=10 --no-background-compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/bit_operations_test.dart b/tests/language/bit_operations_test.dart
index 2d46ba7..bbc17bd 100644
--- a/tests/language/bit_operations_test.dart
+++ b/tests/language/bit_operations_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing bitwise operations.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/bit_shift_test.dart b/tests/language/bit_shift_test.dart
index 8493936..e797ea3 100644
--- a/tests/language/bit_shift_test.dart
+++ b/tests/language/bit_shift_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/branch_canonicalization_test.dart b/tests/language/branch_canonicalization_test.dart
index bb49d6e..10ba232 100644
--- a/tests/language/branch_canonicalization_test.dart
+++ b/tests/language/branch_canonicalization_test.dart
@@ -4,7 +4,7 @@
 
 // Test that branch fusion correctly sets branch environment for comparisons
 // that require unboxing and does not fuse branches that can deoptimize.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/call_closurization_test.dart b/tests/language/call_closurization_test.dart
index 6c8dc71..0d17331 100644
--- a/tests/language/call_closurization_test.dart
+++ b/tests/language/call_closurization_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/call_test.dart b/tests/language/call_test.dart
index 59d2407..7c076af 100644
--- a/tests/language/call_test.dart
+++ b/tests/language/call_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/cha_deopt1_test.dart b/tests/language/cha_deopt1_test.dart
index fd860bf..a2c99f4 100644
--- a/tests/language/cha_deopt1_test.dart
+++ b/tests/language/cha_deopt1_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=100
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation
 
 // Test lazy deoptimization at field guards with deferred loading.
 
diff --git a/tests/language/cha_deopt2_test.dart b/tests/language/cha_deopt2_test.dart
index 5a4ed04..38274e0 100644
--- a/tests/language/cha_deopt2_test.dart
+++ b/tests/language/cha_deopt2_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=100
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation
 
 // Test lazy deoptimization at type checks with deferred loading.
 
diff --git a/tests/language/cha_deopt3_test.dart b/tests/language/cha_deopt3_test.dart
index 3dc61b9..6dc964e 100644
--- a/tests/language/cha_deopt3_test.dart
+++ b/tests/language/cha_deopt3_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=100
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation
 
 // Test lazy deoptimization at type checks with interface implementation.
 
diff --git a/tests/language/compound_assignment_operator_test.dart b/tests/language/compound_assignment_operator_test.dart
index e04da40..65bf4c391 100644
--- a/tests/language/compound_assignment_operator_test.dart
+++ b/tests/language/compound_assignment_operator_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Tests that lhs of a compound assignement is executed only once.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/const_test.dart b/tests/language/const_test.dart
index 65dc19d..9cdb07d 100644
--- a/tests/language/const_test.dart
+++ b/tests/language/const_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Check const classes.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/constant_propagation_phis_test.dart b/tests/language/constant_propagation_phis_test.dart
index e7e2d80..0ba7d72 100644
--- a/tests/language/constant_propagation_phis_test.dart
+++ b/tests/language/constant_propagation_phis_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/constant_string_interpolation_test.dart b/tests/language/constant_string_interpolation_test.dart
index 0a8a81c..bc30125 100644
--- a/tests/language/constant_string_interpolation_test.dart
+++ b/tests/language/constant_string_interpolation_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/deferred_inlined_test.dart b/tests/language/deferred_inlined_test.dart
index 4808a3f..bede596 100644
--- a/tests/language/deferred_inlined_test.dart
+++ b/tests/language/deferred_inlined_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Declares foo that returns 42.
 import "deferred_constraints_lib2.dart" deferred as lib;
diff --git a/tests/language/deferred_load_inval_code_test.dart b/tests/language/deferred_load_inval_code_test.dart
index 88a3159..41eacbb 100644
--- a/tests/language/deferred_load_inval_code_test.dart
+++ b/tests/language/deferred_load_inval_code_test.dart
@@ -3,7 +3,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--optimization-counter-threshold=100
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation
 
 import "deferred_load_inval_code_lib.dart" deferred as d;
 
diff --git a/tests/language/deferred_optimized_test.dart b/tests/language/deferred_optimized_test.dart
index ef3c2a0..bb62884 100644
--- a/tests/language/deferred_optimized_test.dart
+++ b/tests/language/deferred_optimized_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-inlining
+// VMOptions=--optimization-counter-threshold=10 --no-use-inlining --no-background-compilation
 
 // Declares foo that returns 42.
 import "deferred_constraints_lib2.dart" deferred as lib;
diff --git a/tests/language/deopt_inlined_function_lazy_test.dart b/tests/language/deopt_inlined_function_lazy_test.dart
index 8de6b8e..dcb48d2 100644
--- a/tests/language/deopt_inlined_function_lazy_test.dart
+++ b/tests/language/deopt_inlined_function_lazy_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test lazy deoptimization from within an inlined function.
-// VMOptions=--deoptimize_alot --optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--deoptimize_alot --optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/deopt_lazy_finalization_test.dart b/tests/language/deopt_lazy_finalization_test.dart
index a069634..1176eca 100644
--- a/tests/language/deopt_lazy_finalization_test.dart
+++ b/tests/language/deopt_lazy_finalization_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test deoptimziation caused by lazy finalization.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
@@ -29,7 +29,7 @@
 
 class A {
   foo() => 2;
-  
+
   loop() {
     var sum = 0;
     for (int i = 0; i < 10000; i++) {
diff --git a/tests/language/deopt_no_feedback_test.dart b/tests/language/deopt_no_feedback_test.dart
index 4ee16d0..8d42628 100644
--- a/tests/language/deopt_no_feedback_test.dart
+++ b/tests/language/deopt_no_feedback_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test deoptimization caused by running code that did not collect type
 // feedback before.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/deopt_smi_op_test.dart b/tests/language/deopt_smi_op_test.dart
index b990b49..150699d 100644
--- a/tests/language/deopt_smi_op_test.dart
+++ b/tests/language/deopt_smi_op_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/deoptimized_function_on_stack_test.dart b/tests/language/deoptimized_function_on_stack_test.dart
index 3ef5cb4..f64fedc 100644
--- a/tests/language/deoptimized_function_on_stack_test.dart
+++ b/tests/language/deoptimized_function_on_stack_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/div_with_power_of_two2_test.dart b/tests/language/div_with_power_of_two2_test.dart
index 03a83ca..f242fed 100644
--- a/tests/language/div_with_power_of_two2_test.dart
+++ b/tests/language/div_with_power_of_two2_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test division by power of two.
 // Test that results before and after optimization are the same.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/div_with_power_of_two_test.dart b/tests/language/div_with_power_of_two_test.dart
index a628563..fd88c4c 100644
--- a/tests/language/div_with_power_of_two_test.dart
+++ b/tests/language/div_with_power_of_two_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test division by power of two.
 // Test that results before and after optimization are the same.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/double_int_addition_test.dart b/tests/language/double_int_addition_test.dart
index d2f22e6..be190fa 100644
--- a/tests/language/double_int_addition_test.dart
+++ b/tests/language/double_int_addition_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/double_modulo_test.dart b/tests/language/double_modulo_test.dart
index d17bcc5..54e9fef 100644
--- a/tests/language/double_modulo_test.dart
+++ b/tests/language/double_modulo_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test optimization of modulo operator on Double.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/double_nan_comparison_test.dart b/tests/language/double_nan_comparison_test.dart
index 007e83d..c6e34701 100644
--- a/tests/language/double_nan_comparison_test.dart
+++ b/tests/language/double_nan_comparison_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Tests double comparisons with NaN in different contexts.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/equality_test.dart b/tests/language/equality_test.dart
index 208ed0c..ed6d227 100644
--- a/tests/language/equality_test.dart
+++ b/tests/language/equality_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/exception_in_increment_test.dart b/tests/language/exception_in_increment_test.dart
index a053708..0aa3b1e 100644
--- a/tests/language/exception_in_increment_test.dart
+++ b/tests/language/exception_in_increment_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test throws exception in the middle of the increment operation, the setter
 // part of the instance field increment never completes.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 main() {
   var a = new A();
diff --git a/tests/language/fast_method_extraction_test.dart b/tests/language/fast_method_extraction_test.dart
index b4dd4c9..3e3d8d9 100644
--- a/tests/language/fast_method_extraction_test.dart
+++ b/tests/language/fast_method_extraction_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test that fast method extraction returns correct closure.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/guess_cid_test.dart b/tests/language/guess_cid_test.dart
index 3759cb9..ea5629ad 100644
--- a/tests/language/guess_cid_test.dart
+++ b/tests/language/guess_cid_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program to test cid guessing optimizations.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
@@ -17,17 +17,17 @@
   Expect.equals(3, compareInt(3));
   Expect.equals(-2, compareInt(-2));
   Expect.equals(0, compareInt(-1));
-  
+
   Expect.equals(3, binOpInt(3, 3));
   Expect.equals(0, binOpInt(-2, -2));
-  
+
   Expect.equals(3.0, binOpDouble(3.0, 3.0));
   Expect.equals(0.0, binOpDouble(-2.0, -2.0));
-  
+
   Expect.equals(3.0, compareDouble(3.0));
   Expect.equals(-2.0, compareDouble(-2.0));
   Expect.equals(0.0, compareDouble(-1.0));
-  
+
   testOSR();
 }
 
diff --git a/tests/language/identical_test.dart b/tests/language/identical_test.dart
index 23be3ad..244f814 100644
--- a/tests/language/identical_test.dart
+++ b/tests/language/identical_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test efficient and correct implementation of !identical(a, b).
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/inline_add_constants_to_initial_env_test.dart b/tests/language/inline_add_constants_to_initial_env_test.dart
index 4417834..cd64f44 100644
--- a/tests/language/inline_add_constants_to_initial_env_test.dart
+++ b/tests/language/inline_add_constants_to_initial_env_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that SSA values are correctly numbered after inlining that adds
 // constants to original environment.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 h(x, y) => x == y;
 
diff --git a/tests/language/inline_closure_with_constant_arguments_test.dart b/tests/language/inline_closure_with_constant_arguments_test.dart
index 94bf524..87bf4eb 100644
--- a/tests/language/inline_closure_with_constant_arguments_test.dart
+++ b/tests/language/inline_closure_with_constant_arguments_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/inline_effect_context_test.dart b/tests/language/inline_effect_context_test.dart
index e10e493..0fc2afe 100644
--- a/tests/language/inline_effect_context_test.dart
+++ b/tests/language/inline_effect_context_test.dart
@@ -4,7 +4,7 @@
 // Test inlining of simple function with control flow in an effect context.
 // Optimize function foo with instance of A and inlined function bar. Call later
 // with instance of B and cause deoptimization.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/inline_getter_test.dart b/tests/language/inline_getter_test.dart
index ba83a23..41430d3 100644
--- a/tests/language/inline_getter_test.dart
+++ b/tests/language/inline_getter_test.dart
@@ -4,7 +4,7 @@
 // Test inlining of instance getters.
 // Three classes access always the same field. Optimize method foo and inline
 // getter for classes 'A' and 'B'. Call later via 'C' and cause deoptimization.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/inline_test_context_test.dart b/tests/language/inline_test_context_test.dart
index 89a3e74..2c8fe29 100644
--- a/tests/language/inline_test_context_test.dart
+++ b/tests/language/inline_test_context_test.dart
@@ -4,7 +4,7 @@
 // Test inlining of simple function with control flow in a test context.
 // Optimize function foo with instance of A and inlined function bar. Call later
 // with instance of B and cause deoptimization.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/inline_value_context_test.dart b/tests/language/inline_value_context_test.dart
index 5ffb694..5e8aee9 100644
--- a/tests/language/inline_value_context_test.dart
+++ b/tests/language/inline_value_context_test.dart
@@ -4,7 +4,7 @@
 // Test inlining of simple function with control flow in a value context.
 // Optimize function foo with instance of A and inlined function bar. Call later
 // with instance of B and cause deoptimization.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/instance_incr_deopt_test.dart b/tests/language/instance_incr_deopt_test.dart
index 04a02a1..eb864a5 100644
--- a/tests/language/instance_incr_deopt_test.dart
+++ b/tests/language/instance_incr_deopt_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/instanceof4_test.dart b/tests/language/instanceof4_test.dart
index 86282da..be5a068c 100644
--- a/tests/language/instanceof4_test.dart
+++ b/tests/language/instanceof4_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing the instanceof operation.
 // Regression test for issue 5216.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/instanceof_optimized_test.dart b/tests/language/instanceof_optimized_test.dart
index e3f5965..820504f 100644
--- a/tests/language/instanceof_optimized_test.dart
+++ b/tests/language/instanceof_optimized_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Testing optimized 'is' tests.
-// VMOptions=--optimization-counter-threshold=5 --no-use-osr
+// VMOptions=--optimization-counter-threshold=5 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/integer_division_by_zero_test.dart b/tests/language/integer_division_by_zero_test.dart
index 98aab8c..defb6cb 100644
--- a/tests/language/integer_division_by_zero_test.dart
+++ b/tests/language/integer_division_by_zero_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test integer division by zero.
 // Test that results before and after optimization are the same.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/issue7513_test.dart b/tests/language/issue7513_test.dart
index b7c0b31..3c1fe9f 100644
--- a/tests/language/issue7513_test.dart
+++ b/tests/language/issue7513_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/issue7525_test.dart b/tests/language/issue7525_test.dart
index eab03a2..c7fe377 100644
--- a/tests/language/issue7525_test.dart
+++ b/tests/language/issue7525_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/language.status b/tests/language/language.status
index 42bb58b..673b6b1 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -45,11 +45,6 @@
 async_star_cancel_while_paused_test: RuntimeError
 async_star_await_pauses_test: Skip # Times out. Issue 23996
 
-accessor_conflict_export2_test: RuntimeError # Issue 25625
-accessor_conflict_import2_test: RuntimeError # Issue 25625
-accessor_conflict_import_prefixed2_test: RuntimeError # Issue 25625
-accessor_conflict_import_prefixed_test: RuntimeError # Issue 25625
-
 [ ($compiler == none || $compiler == precompiler || $compiler == dart2app) && ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) ]
 
 class_keyword_test/02: MissingCompileTimeError # Issue 13627
@@ -96,12 +91,7 @@
 [ $compiler == none && $runtime == drt ]
 disassemble_test: Pass, Fail # Issue 18122
 
-[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $arch == mips && $checked ]
-generic_instanceof3_test: Pass, Crash # Issue 17440.
-
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $arch == mips && $mode == debug ]
-stack_overflow_test: Skip # Crashes. Issue 17440.
-stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
 large_class_declaration_test: SkipSlow # Times out. Issue 20352
 
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $arch == arm64 ]
@@ -129,7 +119,7 @@
 stacktrace_rethrow_nonerror_test: Pass, RuntimeError
 stacktrace_test: Pass, RuntimeError
 
-[ $noopt || $compiler == precompiler || $runtime == dart_product ]
+[ $noopt || $compiler == precompiler || $mode == product ]
 # Imports dart:mirrors
 const_evaluation_test: SkipByDesign
 deferred_constraints_constants_test: SkipByDesign
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 5e0c4af..d3dfe4e 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -517,3 +517,6 @@
 accessor_conflict_import_prefixed2_test: StaticWarning # Issue 25624
 accessor_conflict_import_prefixed_test: StaticWarning # Issue 25624
 accessor_conflict_import_test: StaticWarning # Issue 25624
+
+for_in3_test: StaticWarning, OK # Test should have warning by design.
+for_in_side_effects_test: StaticWarning, OK # Test uses custom class that does not implement Iterable in for-in.
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index a3327e4..1d68288 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -309,8 +309,14 @@
 regress_21795_test: Pass, RuntimeError # Due to inlining?
 
 [ $compiler == dart2js && $cps_ir && $host_checked ]
+accessor_conflict_export2_test: Crash # Duplicate export of 'x'
+accessor_conflict_export_test: Crash # Duplicate export of 'x'
 async_throw_in_catch_test/forceAwait: Crash # Issue 24485
 async_throw_in_catch_test/none: Crash # Issue 24485
 execute_finally9_test: Crash # Issue 24485
 regress_21795_test: Crash # Issue 24485
 regress_23537_test: Crash # Issue 24485
+try_finally_regress_25333_test: Crash # Issue 24485
+
+[ $compiler == dart2js && $cps_ir && $checked ]
+*: Skip # `assert` not implemented
diff --git a/tests/language/large_implicit_getter_test.dart b/tests/language/large_implicit_getter_test.dart
index 8dac849..cd76da4 100644
--- a/tests/language/large_implicit_getter_test.dart
+++ b/tests/language/large_implicit_getter_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing compilation of large implicit getters.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 List<List> panels = [
 [6853.940039224797,6050.837897021371]
diff --git a/tests/language/load_indexed_constant_test.dart b/tests/language/load_indexed_constant_test.dart
index cf45b18..57e4802 100644
--- a/tests/language/load_indexed_constant_test.dart
+++ b/tests/language/load_indexed_constant_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test constant propgation of load-indexed operations
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/many_generic_instanceof_test.dart b/tests/language/many_generic_instanceof_test.dart
index a37e84e..ffaccd7 100644
--- a/tests/language/many_generic_instanceof_test.dart
+++ b/tests/language/many_generic_instanceof_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 library GenericInstanceofTest.dart;
 import "package:expect/expect.dart";
diff --git a/tests/language/many_overridden_no_such_method_test.dart b/tests/language/many_overridden_no_such_method_test.dart
index a9eb62e..e5c32ce 100644
--- a/tests/language/many_overridden_no_such_method_test.dart
+++ b/tests/language/many_overridden_no_such_method_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 library OverriddenNoSuchMethodTest.dart;
 
diff --git a/tests/language/mega_load_test.dart b/tests/language/mega_load_test.dart
index e7fc237..19be6ab 100644
--- a/tests/language/mega_load_test.dart
+++ b/tests/language/mega_load_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test megamorphic, but single target field load.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/megamorphic_no_such_method_test.dart b/tests/language/megamorphic_no_such_method_test.dart
index 92e0826..603fba4 100644
--- a/tests/language/megamorphic_no_such_method_test.dart
+++ b/tests/language/megamorphic_no_such_method_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test program for correct optimizations related to types fo allocated lists.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/mint_arithmetic_test.dart b/tests/language/mint_arithmetic_test.dart
index f8bf705..c9575f4 100644
--- a/tests/language/mint_arithmetic_test.dart
+++ b/tests/language/mint_arithmetic_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/mint_compares_test.dart b/tests/language/mint_compares_test.dart
index c2afbaf..7f51ce2d 100644
--- a/tests/language/mint_compares_test.dart
+++ b/tests/language/mint_compares_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/modulo_test.dart b/tests/language/modulo_test.dart
index f14d3c5..f94d756 100644
--- a/tests/language/modulo_test.dart
+++ b/tests/language/modulo_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test optimization of modulo operator on Smi.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
@@ -15,7 +15,7 @@
     Expect.equals(i % 256, foo(i));
     Expect.equals(i % -256, boo(i));
     Expect.throws(() => hoo(i), (e) => e is IntegerDivisionByZeroException);
-    
+
     Expect.equals(i ~/ 254 + i % 254, fooTwo(i));
     Expect.equals(i ~/ -254 + i % -254, booTwo(i));
     Expect.throws(() => hooTwo(i), (e) => e is IntegerDivisionByZeroException);
@@ -26,7 +26,7 @@
     }
     Expect.equals((i ~/ 10) + (i % 10) + (i % 10), threeOp(i));
     Expect.equals((i ~/ 10) + (i ~/ 12) + (i % 10) + (i % 12), fourOp(i));
-    
+
     // Zero test is done outside the loop.
     if (i < 0) {
       Expect.equals(i % -i, foo2(i));
@@ -69,13 +69,13 @@
 fourOp(a) {
   var x0 = a ~/ 10;
   var x1 = a ~/ 12;
-  var y0 = a % 10; 
+  var y0 = a % 10;
   var y1 = a % 12;
   return x0 + x1 + y0 + y1;
 }
 
 foo2(i) {
-  // Make sure x has a range computed. 
+  // Make sure x has a range computed.
   var x = 0;
   if (i < 0) {
     x = -i;
@@ -87,7 +87,7 @@
 
 
 fooTwo2(i) {
-  // Make sure x has a range computed. 
+  // Make sure x has a range computed.
   var x = 0;
   if (i < 0) {
     x = -i;
diff --git a/tests/language/mul_recipr_test.dart b/tests/language/mul_recipr_test.dart
index da4d7a1..3c3534c 100644
--- a/tests/language/mul_recipr_test.dart
+++ b/tests/language/mul_recipr_test.dart
@@ -5,7 +5,7 @@
 // incorrect:
 // - (a * (1.0 / b))
 //
-// VMOptions=--optimization-counter-threshold=8 --no-use-osr
+// VMOptions=--optimization-counter-threshold=8 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/named_parameters_with_conversions_test.dart b/tests/language/named_parameters_with_conversions_test.dart
index a20b60d..213b8da 100644
--- a/tests/language/named_parameters_with_conversions_test.dart
+++ b/tests/language/named_parameters_with_conversions_test.dart
@@ -4,7 +4,7 @@
 //
 // Test named arguments work as expected regardless of whether the function or
 // method is called via function call syntax or method call syntax.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/nan_identical_test.dart b/tests/language/nan_identical_test.dart
index a567f80..5f171be 100644
--- a/tests/language/nan_identical_test.dart
+++ b/tests/language/nan_identical_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test a new statement by itself.
-// VMOptions=--optimization-counter-threshold=4
+// VMOptions=--optimization-counter-threshold=4 --no-background-compilation
 
 import 'dart:typed_data';
 
diff --git a/tests/language/no_such_method3_test.dart b/tests/language/no_such_method3_test.dart
index 1a69e42..ba0d0ca 100644
--- a/tests/language/no_such_method3_test.dart
+++ b/tests/language/no_such_method3_test.dart
@@ -4,7 +4,7 @@
 
 // Test that a static type inferrer takes [noSuchMethod] into account.
 
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/no_such_method_dispatcher_test.dart b/tests/language/no_such_method_dispatcher_test.dart
index ca115913..3aad16f 100644
--- a/tests/language/no_such_method_dispatcher_test.dart
+++ b/tests/language/no_such_method_dispatcher_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/null_test.dart b/tests/language/null_test.dart
index ecb2e00..4439bd5 100644
--- a/tests/language/null_test.dart
+++ b/tests/language/null_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Second dart test program.
 
-// VMOptions=--optimization-counter-threshold=5
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 
 import "dart:mirrors";
 import "package:expect/expect.dart";
diff --git a/tests/language/nullaware_opt_test.dart b/tests/language/nullaware_opt_test.dart
index e83757a..853284a 100644
--- a/tests/language/nullaware_opt_test.dart
+++ b/tests/language/nullaware_opt_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--optimization_counter_threshold=5
+// VMOptions=--optimization_counter_threshold=5 --no-background_compilation
 //
 // Basic null-aware operator test that invokes the optimizing compiler.
 
diff --git a/tests/language/number_identity2_test.dart b/tests/language/number_identity2_test.dart
index 655ac51..c4737f5 100644
--- a/tests/language/number_identity2_test.dart
+++ b/tests/language/number_identity2_test.dart
@@ -5,7 +5,7 @@
 //
 // Contains test that is failing on dart2js. Merge this test with
 // 'number_identity_test.dart' once fixed.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 import 'dart:typed_data';
diff --git a/tests/language/number_identity_test.dart b/tests/language/number_identity_test.dart
index fa072ea..6d41b4c 100644
--- a/tests/language/number_identity_test.dart
+++ b/tests/language/number_identity_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing params.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/optimize_redundant_array_load_test.dart b/tests/language/optimize_redundant_array_load_test.dart
index 14549d2..856b225 100644
--- a/tests/language/optimize_redundant_array_load_test.dart
+++ b/tests/language/optimize_redundant_array_load_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/optimized_constant_array_string_access_test.dart b/tests/language/optimized_constant_array_string_access_test.dart
index 22f3771..632e6bb 100644
--- a/tests/language/optimized_constant_array_string_access_test.dart
+++ b/tests/language/optimized_constant_array_string_access_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/optimized_hoisting_checked_mode_assert_test.dart b/tests/language/optimized_hoisting_checked_mode_assert_test.dart
index 81ff2e2..3399678 100644
--- a/tests/language/optimized_hoisting_checked_mode_assert_test.dart
+++ b/tests/language/optimized_hoisting_checked_mode_assert_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/optimized_isempty_test.dart b/tests/language/optimized_isempty_test.dart
index d223c8b..d32f932 100644
--- a/tests/language/optimized_isempty_test.dart
+++ b/tests/language/optimized_isempty_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 // Test optimization and polymorphic inlining of String.isEmpty.
 
diff --git a/tests/language/optimized_lists_test.dart b/tests/language/optimized_lists_test.dart
index d92fe3d..e55fa83 100644
--- a/tests/language/optimized_lists_test.dart
+++ b/tests/language/optimized_lists_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test program for correct optimizations related to types fo allocated lists.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/optimized_setter_test.dart b/tests/language/optimized_setter_test.dart
index e1c4f3d..2c81877 100644
--- a/tests/language/optimized_setter_test.dart
+++ b/tests/language/optimized_setter_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test various setter situations, testing special cases in optimizing compiler.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/optimized_string_charat_test.dart b/tests/language/optimized_string_charat_test.dart
index b7ca22f..176ecd4 100644
--- a/tests/language/optimized_string_charat_test.dart
+++ b/tests/language/optimized_string_charat_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/optimized_string_charcodeat_test.dart b/tests/language/optimized_string_charcodeat_test.dart
index 98f4397..1493db6 100644
--- a/tests/language/optimized_string_charcodeat_test.dart
+++ b/tests/language/optimized_string_charcodeat_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 // Test optimized CodeUnitAt and array access.
 
diff --git a/tests/language/osr_test.dart b/tests/language/osr_test.dart
index 6d31b85..e4afb7b 100644
--- a/tests/language/osr_test.dart
+++ b/tests/language/osr_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=5
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 // Test correct OSR (issue 16151).
 
 import "dart:collection";
@@ -9,18 +9,18 @@
 
 List create([int length]) {
   return new MyList(length);
-}  
+}
 
 main() {
-  test(create);  
+  test(create);
 }
 
 
 class MyList<E> extends ListBase<E> {
   List<E> _list;
-  
+
   MyList([int length]): _list = (length==null ? new List() : new List(length));
-  
+
   E operator [](int index) => _list[index];
 
   void operator []=(int index, E value) {
@@ -36,7 +36,7 @@
 
 
 test(List create([int length])) {
-  sort_A01_t02_test(create);  
+  sort_A01_t02_test(create);
 }
 
 //  From library co19 sort_A01_t02.
diff --git a/tests/language/range_analysis_test.dart b/tests/language/range_analysis_test.dart
index 8226a68..240073e 100644
--- a/tests/language/range_analysis_test.dart
+++ b/tests/language/range_analysis_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/regress_11800_test.dart b/tests/language/regress_11800_test.dart
index 14c8a6f..8b7217b 100644
--- a/tests/language/regress_11800_test.dart
+++ b/tests/language/regress_11800_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/smi_type_test.dart b/tests/language/smi_type_test.dart
index dddfdbe..2b5af74 100644
--- a/tests/language/smi_type_test.dart
+++ b/tests/language/smi_type_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=8
+// VMOptions=--optimization-counter-threshold=8 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/strict_equal_test.dart b/tests/language/strict_equal_test.dart
index be7ab0f..0fddafb 100644
--- a/tests/language/strict_equal_test.dart
+++ b/tests/language/strict_equal_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/string_charcode_test.dart b/tests/language/string_charcode_test.dart
index 8e3f883..d81f1ac 100644
--- a/tests/language/string_charcode_test.dart
+++ b/tests/language/string_charcode_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/string_intrinsics_test.dart b/tests/language/string_intrinsics_test.dart
index 8daf75c..c3e8cc7 100644
--- a/tests/language/string_intrinsics_test.dart
+++ b/tests/language/string_intrinsics_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Replace with shared test once interface issues clarified.
 // Test various String intrinsics
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/sync_generator1_test.dart b/tests/language/sync_generator1_test.dart
index 6c2b7d7..88e1fd4 100644
--- a/tests/language/sync_generator1_test.dart
+++ b/tests/language/sync_generator1_test.dart
@@ -4,7 +4,7 @@
 
 // Simple test program for sync* generator functions.
 
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/truncdiv_test.dart b/tests/language/truncdiv_test.dart
index 8a00c73..5bbcf10 100644
--- a/tests/language/truncdiv_test.dart
+++ b/tests/language/truncdiv_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test optimization of modulo operator on Smi.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
@@ -24,7 +24,7 @@
 foo(i, x) => i % x;
 
 foo2(i) {
-  // Make sure x has a range computed. 
+  // Make sure x has a range computed.
   var x = 0;
   if (i < 0) {
     x = -i;
diff --git a/tests/language/try_catch2_test.dart b/tests/language/try_catch2_test.dart
index 003255d..9ccc5c7 100644
--- a/tests/language/try_catch2_test.dart
+++ b/tests/language/try_catch2_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing try/catch statement without any exceptions
 // being thrown. (Nested try/catch blocks).
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch3_test.dart b/tests/language/try_catch3_test.dart
index 09cf98b..a022965 100644
--- a/tests/language/try_catch3_test.dart
+++ b/tests/language/try_catch3_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing try/catch statement without any exceptions
 // being thrown.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch4_test.dart b/tests/language/try_catch4_test.dart
index 9d39f11..14bba33 100644
--- a/tests/language/try_catch4_test.dart
+++ b/tests/language/try_catch4_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that our SSA graph does have the try body a predecessor of a
 // try/finally.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch5_test.dart b/tests/language/try_catch5_test.dart
index 5aa16e9..97dc857 100644
--- a/tests/language/try_catch5_test.dart
+++ b/tests/language/try_catch5_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that our SSA graph does have the try body a predecessor of a
 // try/finally.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_optimized1_test.dart b/tests/language/try_catch_optimized1_test.dart
index d1be3da..850506b 100644
--- a/tests/language/try_catch_optimized1_test.dart
+++ b/tests/language/try_catch_optimized1_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_optimized2_test.dart b/tests/language/try_catch_optimized2_test.dart
index aa7a9f3..a88ca8f 100644
--- a/tests/language/try_catch_optimized2_test.dart
+++ b/tests/language/try_catch_optimized2_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_optimized3_test.dart b/tests/language/try_catch_optimized3_test.dart
index e0e8437..d8bb851 100644
--- a/tests/language/try_catch_optimized3_test.dart
+++ b/tests/language/try_catch_optimized3_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_optimized4_test.dart b/tests/language/try_catch_optimized4_test.dart
index 7cad947..b3dd0dd 100644
--- a/tests/language/try_catch_optimized4_test.dart
+++ b/tests/language/try_catch_optimized4_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_osr_test.dart b/tests/language/try_catch_osr_test.dart
index 7533ba0..5348560 100644
--- a/tests/language/try_catch_osr_test.dart
+++ b/tests/language/try_catch_osr_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Test OSR in different places of a try-catch.
 
diff --git a/tests/language/try_catch_test.dart b/tests/language/try_catch_test.dart
index fb36300..dcf4cba 100644
--- a/tests/language/try_catch_test.dart
+++ b/tests/language/try_catch_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
@@ -172,7 +172,7 @@
       Expect.fail("unreachable");
     }
   }
-      
+
 
   static void testMain() {
     test1();
diff --git a/tests/language/type_propagation_assert_assignable_test.dart b/tests/language/type_propagation_assert_assignable_test.dart
index 352a5842..3a694c3 100644
--- a/tests/language/type_propagation_assert_assignable_test.dart
+++ b/tests/language/type_propagation_assert_assignable_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Check that type of the AssertAssignable is recomputed correctly.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/allocation_sinking_vm_test.dart b/tests/language/vm/allocation_sinking_vm_test.dart
index 55b5f35..bda372f 100644
--- a/tests/language/vm/allocation_sinking_vm_test.dart
+++ b/tests/language/vm/allocation_sinking_vm_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test allocation sinking optimization.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import 'dart:typed_data';
 import 'package:expect/expect.dart';
diff --git a/tests/language/vm/canonicalization_preserves_deopt_test.dart b/tests/language/vm/canonicalization_preserves_deopt_test.dart
index 76c97a6..d030bf1 100644
--- a/tests/language/vm/canonicalization_preserves_deopt_test.dart
+++ b/tests/language/vm/canonicalization_preserves_deopt_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10 --no-use-osr
+// VMOptions=--optimization_counter_threshold=10 --no-use-osr --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/debug_break_enabled_vm_test.dart b/tests/language/vm/debug_break_enabled_vm_test.dart
index e9b3f05..4003e77 100644
--- a/tests/language/vm/debug_break_enabled_vm_test.dart
+++ b/tests/language/vm/debug_break_enabled_vm_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=5 --enable-debug-break
+// VMOptions=--optimization-counter-threshold=5 --enable-debug-break --no-background-compilation
 
 // Verify that the optimizer does not trip over the debug break (StopInstr).
 
diff --git a/tests/language/vm/deopt_hoisted_smi_check_vm_test.dart b/tests/language/vm/deopt_hoisted_smi_check_vm_test.dart
index 6f6381d..091eed0 100644
--- a/tests/language/vm/deopt_hoisted_smi_check_vm_test.dart
+++ b/tests/language/vm/deopt_hoisted_smi_check_vm_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test deoptimization on an optimistically hoisted smi check.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10  --no-background-compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/vm/if_conversion_vm_test.dart b/tests/language/vm/if_conversion_vm_test.dart
index 2d97d4d..8fbcc3b 100644
--- a/tests/language/vm/if_conversion_vm_test.dart
+++ b/tests/language/vm/if_conversion_vm_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Test if-convertion pass in the optimizing compiler.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/issue11087_vm_test.dart b/tests/language/vm/issue11087_vm_test.dart
index f2a8fba..fbfab0e 100644
--- a/tests/language/vm/issue11087_vm_test.dart
+++ b/tests/language/vm/issue11087_vm_test.dart
@@ -5,7 +5,7 @@
 // Regression test for VM's IfConverted pass not keeping graph structure and
 // use lists in sync.
 
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 class A {
   int x;
diff --git a/tests/language/vm/licm_constant_redefinition_vm_test.dart b/tests/language/vm/licm_constant_redefinition_vm_test.dart
index 24f481e..662cb4b 100644
--- a/tests/language/vm/licm_constant_redefinition_vm_test.dart
+++ b/tests/language/vm/licm_constant_redefinition_vm_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=100 --no-use-osr
+// VMOptions=--optimization_counter_threshold=100 --no-use-osr --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/load_to_load_forwarding_vm_test.dart b/tests/language/vm/load_to_load_forwarding_vm_test.dart
index f97e662..9fca276 100644
--- a/tests/language/vm/load_to_load_forwarding_vm_test.dart
+++ b/tests/language/vm/load_to_load_forwarding_vm_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correctness of side effects tracking used by load to load forwarding.
 
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 import "dart:typed_data";
diff --git a/tests/language/vm/load_to_load_unaligned_forwarding_vm_test.dart b/tests/language/vm/load_to_load_unaligned_forwarding_vm_test.dart
index 0d9790f..fbfd10b 100644
--- a/tests/language/vm/load_to_load_unaligned_forwarding_vm_test.dart
+++ b/tests/language/vm/load_to_load_unaligned_forwarding_vm_test.dart
@@ -4,7 +4,7 @@
 // Test correctness of side effects tracking used by load to load forwarding.
 // Should be merged into load_to_load_forwarding once Issue 22151 is fixed.
 
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 import "dart:typed_data";
diff --git a/tests/language/vm/math_vm_test.dart b/tests/language/vm/math_vm_test.dart
index e672e9c..c38b3a0 100644
--- a/tests/language/vm/math_vm_test.dart
+++ b/tests/language/vm/math_vm_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Tests that the VM does not crash on weird corner cases of class Math.
-// VMOptions=--optimization_counter_threshold=100
+// VMOptions=--optimization_counter_threshold=100 --no-background_compilation
 
 library math_vm_test;
 
diff --git a/tests/language/vm/no_such_method_error_message_vm_test.dart b/tests/language/vm/no_such_method_error_message_vm_test.dart
index 481e3fe0..6be2738 100644
--- a/tests/language/vm/no_such_method_error_message_vm_test.dart
+++ b/tests/language/vm/no_such_method_error_message_vm_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/null_hashcode_optimized_vm_test.dart b/tests/language/vm/null_hashcode_optimized_vm_test.dart
index a214c29..d7263a7 100644
--- a/tests/language/vm/null_hashcode_optimized_vm_test.dart
+++ b/tests/language/vm/null_hashcode_optimized_vm_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test that optimized Object.hashCode works for the null receiver.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 main() {
   for (int i = 0; i < 20; i++) {
diff --git a/tests/language/vm/optimization_test.dart b/tests/language/vm/optimization_test.dart
index 0b54b5e..1dea3bd 100644
--- a/tests/language/vm/optimization_test.dart
+++ b/tests/language/vm/optimization_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test various optimizations and deoptimizations of optimizing compiler..
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/optimized_await_regress_test.dart b/tests/language/vm/optimized_await_regress_test.dart
index 86337bf..b7bedb9 100644
--- a/tests/language/vm/optimized_await_regress_test.dart
+++ b/tests/language/vm/optimized_await_regress_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // This tests that captured parameters (by the async-closure) are
 // correctly treated in try-catch generated in the async function.
diff --git a/tests/language/vm/optimized_check_class_test.dart b/tests/language/vm/optimized_check_class_test.dart
index c1e32bf..07757b2 100644
--- a/tests/language/vm/optimized_check_class_test.dart
+++ b/tests/language/vm/optimized_check_class_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/optimized_guarded_field_isolates_test.dart b/tests/language/vm/optimized_guarded_field_isolates_test.dart
index a150656..3c6a9c2 100644
--- a/tests/language/vm/optimized_guarded_field_isolates_test.dart
+++ b/tests/language/vm/optimized_guarded_field_isolates_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization_counter_threshold=100
+// VMOptions=--optimization_counter_threshold=100 --no-background_compilation
 
 // Test field type tracking and field list-length tracking in the presence of
 // multiple isolates.
diff --git a/tests/language/vm/optimized_guarded_field_test.dart b/tests/language/vm/optimized_guarded_field_test.dart
index aefdace..1a0748e 100644
--- a/tests/language/vm/optimized_guarded_field_test.dart
+++ b/tests/language/vm/optimized_guarded_field_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correct handling of phis with only environment uses that were inserted
 // by store to load forwarding.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import "package:expect/expect.dart";
 import "dart:typed_data";
diff --git a/tests/language/vm/optimized_identical_test.dart b/tests/language/vm/optimized_identical_test.dart
index 84a69ca..c7a0202 100644
--- a/tests/language/vm/optimized_identical_test.dart
+++ b/tests/language/vm/optimized_identical_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test various optimizations and deoptimizations of optimizing compiler..
-// VMOptions=--optimization-counter-threshold=10 --no-constant-propagation
+// VMOptions=--optimization-counter-threshold=10 --no-constant-propagation --no-background-compilation
 
 import "package:expect/expect.dart";
 
@@ -13,7 +13,7 @@
 test(a) {
   var dbl = a + 1.0;
   if (!identical(dbl, true)) {
-    return "ok"; 
+    return "ok";
   }
   throw "fail";
 }
diff --git a/tests/language/vm/optimized_polymorphic_list_access_test.dart b/tests/language/vm/optimized_polymorphic_list_access_test.dart
index 6ab48f9..77e5c12 100644
--- a/tests/language/vm/optimized_polymorphic_list_access_test.dart
+++ b/tests/language/vm/optimized_polymorphic_list_access_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/optimized_shl_test.dart b/tests/language/vm/optimized_shl_test.dart
index 559506c..0134248 100644
--- a/tests/language/vm/optimized_shl_test.dart
+++ b/tests/language/vm/optimized_shl_test.dart
@@ -2,7 +2,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/optimized_testsmi_test.dart b/tests/language/vm/optimized_testsmi_test.dart
index c5ac9e2..f5ef8c7 100644
--- a/tests/language/vm/optimized_testsmi_test.dart
+++ b/tests/language/vm/optimized_testsmi_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 // Test branch optimization for TestSmiInstr
 
diff --git a/tests/language/vm/regress_14903_test.dart b/tests/language/vm/regress_14903_test.dart
index b7eaaaa..68616d4 100644
--- a/tests/language/vm/regress_14903_test.dart
+++ b/tests/language/vm/regress_14903_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 
+// VMOptions=--optimization-counter-threshold=10  --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/regress_21245_test.dart b/tests/language/vm/regress_21245_test.dart
index 8fa7bb0..2e588fb 100644
--- a/tests/language/vm/regress_21245_test.dart
+++ b/tests/language/vm/regress_21245_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10 --no-use-osr
+// VMOptions=--optimization_counter_threshold=10 --no-use-osr --no-background_compilation
 
 test(a) {
   var e;
diff --git a/tests/language/vm/regress_22480_test.dart b/tests/language/vm/regress_22480_test.dart
index 3cbe98a..f0425a1 100644
--- a/tests/language/vm/regress_22480_test.dart
+++ b/tests/language/vm/regress_22480_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/vm/regress_22541_vm_test.dart b/tests/language/vm/regress_22541_vm_test.dart
index 36b4618..0d121ac 100644
--- a/tests/language/vm/regress_22541_vm_test.dart
+++ b/tests/language/vm/regress_22541_vm_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test range inference for multiplication of two negative values.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/vm/regress_22693_vm_test.dart b/tests/language/vm/regress_22693_vm_test.dart
index 1cd07f9..6df2a46 100644
--- a/tests/language/vm/regress_22693_vm_test.dart
+++ b/tests/language/vm/regress_22693_vm_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test location summary for Uint32 multiplication.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 const MASK = 0xFFFFFFFF;
 
diff --git a/tests/language/vm/regress_23117_vm_test.dart b/tests/language/vm/regress_23117_vm_test.dart
index 550d550..9b781ef 100644
--- a/tests/language/vm/regress_23117_vm_test.dart
+++ b/tests/language/vm/regress_23117_vm_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test location summary for Uint32 multiplication.
-// VMOptions=--optimization-counter-threshold=5
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/vm/reusable_boxes_test.dart b/tests/language/vm/reusable_boxes_test.dart
index a70cade..4e88e4a 100644
--- a/tests/language/vm/reusable_boxes_test.dart
+++ b/tests/language/vm/reusable_boxes_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test correct handling reusable boxes.
-// VMOptions=--optimization_counter_threshold=100
+// VMOptions=--optimization_counter_threshold=100 --no-background_compilation
 
 library reusable_boxes_test;
 
diff --git a/tests/language/vm/store_elimination_vm_test.dart b/tests/language/vm/store_elimination_vm_test.dart
index 8a3dcd7..21e2102 100644
--- a/tests/language/vm/store_elimination_vm_test.dart
+++ b/tests/language/vm/store_elimination_vm_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correctness of side effects tracking used by load to load forwarding.
 
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/vm/store_to_load_forwarding_phis_vm_test.dart b/tests/language/vm/store_to_load_forwarding_phis_vm_test.dart
index 72ee9b3..9157795 100644
--- a/tests/language/vm/store_to_load_forwarding_phis_vm_test.dart
+++ b/tests/language/vm/store_to_load_forwarding_phis_vm_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correct handling of phis with only environment uses that were inserted
 // by store to load forwarding.
-// VMOptions=--optimization_counter_threshold=100
+// VMOptions=--optimization_counter_threshold=100 --no-background_compilation
 
 library store_to_load_forwarding_phis_vm_test;
 
diff --git a/tests/language/vm/string_polymorphic_test.dart b/tests/language/vm/string_polymorphic_test.dart
index e7c6410..72eac28 100644
--- a/tests/language/vm/string_polymorphic_test.dart
+++ b/tests/language/vm/string_polymorphic_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Tests that the VM does not crash on weird corner cases of class Math.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/vm/type_propagation_test.dart b/tests/language/vm/type_propagation_test.dart
index 2783654..e42aca24 100644
--- a/tests/language/vm/type_propagation_test.dart
+++ b/tests/language/vm/type_propagation_test.dart
@@ -1,10 +1,10 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=1000 --max-polymorphic-checks=1
+// VMOptions=--optimization-counter-threshold=1000 --max-polymorphic-checks=1 --no-background-compilation
 
 // Test correct loop invariant code motion and type propagation from is-checks
-// and null-comparisons. 
+// and null-comparisons.
 
 class B {
   var b;
diff --git a/tests/language/vm/typed_data_polymorphic_view_test.dart b/tests/language/vm/typed_data_polymorphic_view_test.dart
index 94952e2..694c899 100644
--- a/tests/language/vm/typed_data_polymorphic_view_test.dart
+++ b/tests/language/vm/typed_data_polymorphic_view_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Tests that the VM does not crash on weird corner cases of class Math.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import 'dart:typed_data';
 import 'package:expect/expect.dart';
diff --git a/tests/language/vm/uint32_add_test.dart b/tests/language/vm/uint32_add_test.dart
index 46723be..4b66d0e 100644
--- a/tests/language/vm/uint32_add_test.dart
+++ b/tests/language/vm/uint32_add_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/vm/uint32_right_shift_test.dart b/tests/language/vm/uint32_right_shift_test.dart
index 6c7ae5f..d44b84e 100644
--- a/tests/language/vm/uint32_right_shift_test.dart
+++ b/tests/language/vm/uint32_right_shift_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/vm/uint32_shift_test.dart b/tests/language/vm/uint32_shift_test.dart
index fa8cb38..3f9f7e2 100644
--- a/tests/language/vm/uint32_shift_test.dart
+++ b/tests/language/vm/uint32_shift_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index a8623b4..87b74f2 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -336,11 +336,17 @@
 async/stream_iterator_test: Crash # (Stream createCancel...  cannot handle sync*/async* functions
 mirrors/parameter_annotation_mirror_test: Pass, Fail # Issue 25501.  Depends on inlining.
 
-[ $compiler == dart2js && $cps_ir && $host_checked ]
-mirrors/circular_factory_redirection_test/02: Crash # Assertion failure: Constant constructor already computed for generative_constructor(A#circular2)
-mirrors/mirrors_used_typedef_declaration_test/01: Crash # Assertion failure: typedef(Foo) has not been checked for cycles.
-mirrors/mirrors_used_typedef_declaration_test/none: Crash # Assertion failure: typedef(Foo) has not been checked for cycles.
-mirrors/typedef_library_test: Crash # Assertion failure: typedef(G) has not been checked for cycles.
+[ $compiler == dart2js && $host_checked ]
+mirrors/circular_factory_redirection_test/02: Crash # Assertion failure: Constant constructor already computed for generative_constructor(A#circular2).  Issue 25911
+mirrors/metadata_allowed_values_test/28: Crash # Issue 25911
+mirrors/metadata_allowed_values_test/29: Crash # Issue 25911
+mirrors/metadata_allowed_values_test/30: Crash # Issue 25911
+mirrors/metadata_allowed_values_test/31: Crash # Issue 25911
+
+[ $compiler == dart2js && $host_checked && $unchecked ]
+mirrors/mirrors_used_typedef_declaration_test/01: Crash # Assertion failure: typedef(Foo) has not been checked for cycles. Issue 25911
+mirrors/mirrors_used_typedef_declaration_test/none: Crash # Assertion failure: typedef(Foo) has not been checked for cycles. Issue 25911
+mirrors/typedef_library_test: Crash # Assertion failure: typedef(G) has not been checked for cycles. Issue 25911
 
 [ $compiler != dart2js ]
 async/dart2js_uncaught_error_test: Skip  # JS-integration only test
@@ -348,11 +354,9 @@
 [ $noopt && $arch == simarm64 ]
 async/slow_consumer2_test: Pass, RuntimeError # Issue 25726
 
-[ $noopt || $compiler == precompiler ]
+[ $noopt || $compiler == precompiler || $mode == product ]
 mirrors/*: SkipByDesign
+
+[ $noopt || $compiler == precompiler ]
 convert/chunked_conversion_utf88_test: Pass, Timeout
 convert/utf85_test: Pass, Timeout
-
-[ $runtime == vm && $mode == product ]
-mirrors/mirrors_reader_test: Fail,OK  # Expects exact type name.
-
diff --git a/tests/lib/math/double_pow_test.dart b/tests/lib/math/double_pow_test.dart
index 4736b5c..83a8ece 100644
--- a/tests/lib/math/double_pow_test.dart
+++ b/tests/lib/math/double_pow_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=5
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 
 library math_test;
 import "package:expect/expect.dart";
diff --git a/tests/lib/math/min_max_test.dart b/tests/lib/math/min_max_test.dart
index 1f89185..cf58169 100644
--- a/tests/lib/math/min_max_test.dart
+++ b/tests/lib/math/min_max_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing Math.min and Math.max.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 library min_max_test;
 import "package:expect/expect.dart";
diff --git a/tests/lib/typed_data/float32x4_clamp_test.dart b/tests/lib/typed_data/float32x4_clamp_test.dart
index 816fe0d..0109478 100644
--- a/tests/lib/typed_data/float32x4_clamp_test.dart
+++ b/tests/lib/typed_data/float32x4_clamp_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_clamp_test;
diff --git a/tests/lib/typed_data/float32x4_cross_test.dart b/tests/lib/typed_data/float32x4_cross_test.dart
index 3268488..1bfeb5d 100644
--- a/tests/lib/typed_data/float32x4_cross_test.dart
+++ b/tests/lib/typed_data/float32x4_cross_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_cross_test;
diff --git a/tests/lib/typed_data/float32x4_list_test.dart b/tests/lib/typed_data/float32x4_list_test.dart
index d0e509b..901f712 100644
--- a/tests/lib/typed_data/float32x4_list_test.dart
+++ b/tests/lib/typed_data/float32x4_list_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background_compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_list_test;
diff --git a/tests/lib/typed_data/float32x4_shuffle_test.dart b/tests/lib/typed_data/float32x4_shuffle_test.dart
index 751ad2d..651d2e0 100644
--- a/tests/lib/typed_data/float32x4_shuffle_test.dart
+++ b/tests/lib/typed_data/float32x4_shuffle_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_shuffle_test;
diff --git a/tests/lib/typed_data/float32x4_sign_mask_test.dart b/tests/lib/typed_data/float32x4_sign_mask_test.dart
index 95825d4..06a0bb0 100644
--- a/tests/lib/typed_data/float32x4_sign_mask_test.dart
+++ b/tests/lib/typed_data/float32x4_sign_mask_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_sign_mask;
diff --git a/tests/lib/typed_data/float32x4_test.dart b/tests/lib/typed_data/float32x4_test.dart
index 782aca4..0e5eeb2 100644
--- a/tests/lib/typed_data/float32x4_test.dart
+++ b/tests/lib/typed_data/float32x4_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_test;
diff --git a/tests/lib/typed_data/float32x4_transpose_test.dart b/tests/lib/typed_data/float32x4_transpose_test.dart
index ecb39fb..c75b8ef 100644
--- a/tests/lib/typed_data/float32x4_transpose_test.dart
+++ b/tests/lib/typed_data/float32x4_transpose_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_transpose_test;
diff --git a/tests/lib/typed_data/float32x4_two_arg_shuffle_test.dart b/tests/lib/typed_data/float32x4_two_arg_shuffle_test.dart
index d0df59d..ebd1ac6 100644
--- a/tests/lib/typed_data/float32x4_two_arg_shuffle_test.dart
+++ b/tests/lib/typed_data/float32x4_two_arg_shuffle_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_two_arg_shuffle_test;
diff --git a/tests/lib/typed_data/float32x4_unbox_phi_test.dart b/tests/lib/typed_data/float32x4_unbox_phi_test.dart
index 9309642..c44ae5e 100644
--- a/tests/lib/typed_data/float32x4_unbox_phi_test.dart
+++ b/tests/lib/typed_data/float32x4_unbox_phi_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_unbox_regress_test;
diff --git a/tests/lib/typed_data/float32x4_unbox_regress_test.dart b/tests/lib/typed_data/float32x4_unbox_regress_test.dart
index 155804f..abb00d6 100644
--- a/tests/lib/typed_data/float32x4_unbox_regress_test.dart
+++ b/tests/lib/typed_data/float32x4_unbox_regress_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library float32x4_unbox_regress_test;
diff --git a/tests/lib/typed_data/float64x2_functional_test.dart b/tests/lib/typed_data/float64x2_functional_test.dart
index 7ae6cee..67359e1 100644
--- a/tests/lib/typed_data/float64x2_functional_test.dart
+++ b/tests/lib/typed_data/float64x2_functional_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 library float64x2_functional_test;
 
diff --git a/tests/lib/typed_data/float64x2_typed_list_test.dart b/tests/lib/typed_data/float64x2_typed_list_test.dart
index b00cfd4..95db6c6 100644
--- a/tests/lib/typed_data/float64x2_typed_list_test.dart
+++ b/tests/lib/typed_data/float64x2_typed_list_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 library float64x2_typed_list_test;
 
diff --git a/tests/lib/typed_data/int32x4_arithmetic_test.dart b/tests/lib/typed_data/int32x4_arithmetic_test.dart
index 0cf81b7..f558840 100644
--- a/tests/lib/typed_data/int32x4_arithmetic_test.dart
+++ b/tests/lib/typed_data/int32x4_arithmetic_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library uint32x4_arithmetic_test;
diff --git a/tests/lib/typed_data/int32x4_bigint_test.dart b/tests/lib/typed_data/int32x4_bigint_test.dart
index c4b8ab1..282a7fb 100644
--- a/tests/lib/typed_data/int32x4_bigint_test.dart
+++ b/tests/lib/typed_data/int32x4_bigint_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library int32x4_bigint_test;
diff --git a/tests/lib/typed_data/int32x4_list_test.dart b/tests/lib/typed_data/int32x4_list_test.dart
index 4fa1976..70480bd 100644
--- a/tests/lib/typed_data/int32x4_list_test.dart
+++ b/tests/lib/typed_data/int32x4_list_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library int32x4_list_test;
diff --git a/tests/lib/typed_data/int32x4_shuffle_test.dart b/tests/lib/typed_data/int32x4_shuffle_test.dart
index d2b4bc6..79d81c7 100644
--- a/tests/lib/typed_data/int32x4_shuffle_test.dart
+++ b/tests/lib/typed_data/int32x4_shuffle_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library uint32x4_shuffle_test;
diff --git a/tests/lib/typed_data/int32x4_sign_mask_test.dart b/tests/lib/typed_data/int32x4_sign_mask_test.dart
index b4e620e..522054d 100644
--- a/tests/lib/typed_data/int32x4_sign_mask_test.dart
+++ b/tests/lib/typed_data/int32x4_sign_mask_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library int32x4_sign_mask;
diff --git a/tests/lib/typed_data/int32x4_test.dart b/tests/lib/typed_data/int32x4_test.dart
index 7e7d258..06fd62b 100644
--- a/tests/lib/typed_data/int32x4_test.dart
+++ b/tests/lib/typed_data/int32x4_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 library int32x4_test;
 
diff --git a/tests/lib/typed_data/int64_list_load_store_test.dart b/tests/lib/typed_data/int64_list_load_store_test.dart
index 6dd09c6..de8cd4e 100644
--- a/tests/lib/typed_data/int64_list_load_store_test.dart
+++ b/tests/lib/typed_data/int64_list_load_store_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Test that the compiler's load elimination phase sees interfering writes to
 // the array's buffer.
diff --git a/tests/lib/typed_data/simd_store_to_load_forward_test.dart b/tests/lib/typed_data/simd_store_to_load_forward_test.dart
index 4fae48f..d7757b7 100644
--- a/tests/lib/typed_data/simd_store_to_load_forward_test.dart
+++ b/tests/lib/typed_data/simd_store_to_load_forward_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library simd_store_to_load_forward_test;
diff --git a/tests/lib/typed_data/simd_type_check_removal.dart b/tests/lib/typed_data/simd_type_check_removal.dart
index 8aaef06..bffb456 100644
--- a/tests/lib/typed_data/simd_type_check_removal.dart
+++ b/tests/lib/typed_data/simd_type_check_removal.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library simd_store_to_load_forward_test;
diff --git a/tests/lib/typed_data/typed_data_hierarchy_int64_test.dart b/tests/lib/typed_data/typed_data_hierarchy_int64_test.dart
index 3b38bb6..a96c86a 100644
--- a/tests/lib/typed_data/typed_data_hierarchy_int64_test.dart
+++ b/tests/lib/typed_data/typed_data_hierarchy_int64_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library typed_data_hierarchy_int64_test;
diff --git a/tests/lib/typed_data/typed_data_hierarchy_test.dart b/tests/lib/typed_data/typed_data_hierarchy_test.dart
index eba0e7b..242c2c2 100644
--- a/tests/lib/typed_data/typed_data_hierarchy_test.dart
+++ b/tests/lib/typed_data/typed_data_hierarchy_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 // Library tag to be able to run in html test framework.
 library typed_data_hierarchy_test;
diff --git a/tests/standalone/array_bounds_check_generalization_test.dart b/tests/standalone/array_bounds_check_generalization_test.dart
index 2b6099d..c9326e6 100644
--- a/tests/standalone/array_bounds_check_generalization_test.dart
+++ b/tests/standalone/array_bounds_check_generalization_test.dart
@@ -4,7 +4,7 @@
 //
 // We are using --complete-timeline below to ensure that we get timeline events
 // generated during all phases of compilation and deoptimization.
-// VMOptions=--optimization_counter_threshold=10 --no-use-osr --complete-timeline
+// VMOptions=--optimization_counter_threshold=10 --no-use-osr --complete-timeline --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/standalone/double_smi_comparison_test.dart b/tests/standalone/double_smi_comparison_test.dart
index 1e18c46..fff6015 100644
--- a/tests/standalone/double_smi_comparison_test.dart
+++ b/tests/standalone/double_smi_comparison_test.dart
@@ -5,7 +5,7 @@
 // Smi arguments. We convert Smi to doubles and to the operation. This is
 // not correct in 64-bit mode where not every Smi can be converted to a
 // double without loss of precision.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/standalone/float_array_test.dart b/tests/standalone/float_array_test.dart
index 2be1711..bf4588a 100644
--- a/tests/standalone/float_array_test.dart
+++ b/tests/standalone/float_array_test.dart
@@ -4,7 +4,7 @@
 //
 // Dart test program for testing native float arrays.
 
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 // Library tag to be able to run in html test framework.
 library FloatArrayTest;
diff --git a/tests/standalone/int_list_test.dart b/tests/standalone/int_list_test.dart
index c3510ff..2f13b01 100644
--- a/tests/standalone/int_list_test.dart
+++ b/tests/standalone/int_list_test.dart
@@ -5,7 +5,7 @@
 // Dart Mint representations and type propagation issue.
 // Testing Int32List and Uint32List loads.
 //
-// VMOptions=--optimization-counter-threshold=5 --no-use-osr
+// VMOptions=--optimization-counter-threshold=5 --no-use-osr --no-background-compilation
 
 import 'dart:typed_data';
 import "package:expect/expect.dart";
diff --git a/tests/standalone/io/security_context_argument_test.dart b/tests/standalone/io/security_context_argument_test.dart
index e5332ac..6e9ddcf 100644
--- a/tests/standalone/io/security_context_argument_test.dart
+++ b/tests/standalone/io/security_context_argument_test.dart
@@ -44,10 +44,10 @@
         tlsException);
     Expect.throws(() => c.setClientAuthorities(
         localFile('certificates/server_key.p12')),
-        argumentError);
+        tlsException);
     Expect.throws(() => c.setClientAuthorities(
         localFile('certificates/server_key.p12'), password: "iHackSites"),
-        argumentError);
+        tlsException);
 
     // File does not exist
     Expect.throws(() => c.usePrivateKey(
@@ -97,7 +97,7 @@
         tlsException);
     Expect.throws(() => c.setTrustedCertificatesBytes([]), tlsException);
     Expect.throws(() => c.useCertificateChainBytes([]), tlsException);
-    Expect.throws(() => c.setClientAuthoritiesBytes([]), argumentError);
+    Expect.throws(() => c.setClientAuthoritiesBytes([]), tlsException);
 
     // Malformed PEM certs.
     Expect.throws(() => c.usePrivateKey(
@@ -115,7 +115,7 @@
         tlsException);
     Expect.throws(() => c.setClientAuthorities(
         localFile('certificates/client_authority_malformed.pem')),
-        argumentError);
+        tlsException);
 
     c.usePrivateKey(
         localFile('certificates/server_key.pem'), password: "dartdart");
diff --git a/tests/standalone/map_literal_oom_test.dart b/tests/standalone/map_insert_remove_oom_test.dart
similarity index 100%
rename from tests/standalone/map_literal_oom_test.dart
rename to tests/standalone/map_insert_remove_oom_test.dart
diff --git a/tests/standalone/pair_location_remapping_test.dart b/tests/standalone/pair_location_remapping_test.dart
index 277ccc5..98abdf1 100644
--- a/tests/standalone/pair_location_remapping_test.dart
+++ b/tests/standalone/pair_location_remapping_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test that pair locations are remaped in slow path environments.
-// VMOptions=--optimization_counter_threshold=10 --no-use-osr
+// VMOptions=--optimization_counter_threshold=10 --no-use-osr --no-background_compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/standalone/precompilation_dart2js_test.dart b/tests/standalone/precompilation_dart2js_test.dart
index 0deafcb..b964726 100644
--- a/tests/standalone/precompilation_dart2js_test.dart
+++ b/tests/standalone/precompilation_dart2js_test.dart
@@ -49,7 +49,7 @@
   Directory tmp;
   try {
     tmp = Directory.current.createTempSync("temp_precompilation_test");
-    var exec = "${dart_executable}_no_snapshot";
+    var exec = "${dart_executable}_bootstrap";
     var args = ["--package-root=$abs_package_root",
                 "--gen-precompiled-snapshot",
                 "${abs_package_root}compiler/src/dart2js.dart"];
diff --git a/tests/standalone/precompilation_test.dart b/tests/standalone/precompilation_test.dart
index e65bf17..ad493c9 100644
--- a/tests/standalone/precompilation_test.dart
+++ b/tests/standalone/precompilation_test.dart
@@ -49,7 +49,7 @@
   try {
     tmp = Directory.current.createTempSync("temp_precompilation_test");
     var result = Process.runSync(
-       "${dart_executable}_no_snapshot",
+       "${dart_executable}_bootstrap",
        ["--gen-precompiled-snapshot", Platform.script.path],
        workingDirectory: tmp.path);
     if (result.exitCode != 0) {
diff --git a/tests/standalone/regress_25335_test.dart b/tests/standalone/regress_25335_test.dart
index e4551a2..c20ed6d 100644
--- a/tests/standalone/regress_25335_test.dart
+++ b/tests/standalone/regress_25335_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 // Test that canonicalization inserts constants with correct representation.
-// VMOptions=--optimization-counter-threshold=10 --optimization-filter=bar
+// VMOptions=--optimization-counter-threshold=10 --optimization-filter=bar --no-background-compilation
 
 import 'dart:typed_data';
 
diff --git a/tests/standalone/slowpath_safepoints_test.dart b/tests/standalone/slowpath_safepoints_test.dart
index 254ad76..e15723c 100644
--- a/tests/standalone/slowpath_safepoints_test.dart
+++ b/tests/standalone/slowpath_safepoints_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that safepoints associated with slowpaths don't mark non-existing values
 // alive.
-// VMOptions=--optimization-counter-threshold=5 --no-inline_alloc --gc_at_instance_allocation=_Double
+// VMOptions=--optimization-counter-threshold=5 --no-inline_alloc --gc_at_instance_allocation=_Double --no-background-compilation
 
 class C {
   final next;
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 41f4d09..7efc16b 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -109,6 +109,9 @@
 precompilation_dart2js_test: Skip # Standalone only test.
 regress_25335_test: Skip # Int64List not supported.
 
+[ $compiler == dart2js && $cps_ir && $checked ]
+*: Skip # `assert` not implemented
+
 [ ($runtime == vm || $runtime == dart_product) && $mode == debug ]
 precompilation_dart2js_test: Pass, Slow
 
@@ -139,11 +142,9 @@
 oom_error_stacktrace_test: Skip # Fails on Linux
 
 [ $arch == mips ]
-io/signals_test: Fail # Issue 17440
 io/file_stat_test: Fail # Issue 17440
 io/process_sync_test: Skip # Starts 10 dart subprocesses, uses too much memory.
 io/signals_test: Skip # Starts 10 dart subprocesses, uses too much memory
-io/file_read_special_device_test: Fail # Issue 17440
 io/socket_source_address_test: Fail # Issue 22597
 
 [ $arch == mips && $mode == debug ]
@@ -156,7 +157,7 @@
 assert_test: Fail # Issue 14651.
 
 [ $compiler == none && $runtime == drt ]
-map_literal_oom_test: RuntimeError # Issue 24571
+map_insert_remove_oom_test: RuntimeError # Issue 24571
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 io/directory_invalid_arguments_test: StaticWarning
@@ -216,7 +217,7 @@
 assert_test: Pass, RuntimeError
 
 [ $noopt || $compiler == precompiler ]
-map_literal_oom_test: Pass, Crash # Issue 24678
+map_insert_remove_oom_test: Skip # Heap limit too low. Increasing iteration count to make a higher limit a meaningful test makes it too slow for simarm[64] bots.
 io/web_socket_test: Pass, RuntimeError # Issue 24674
 precompilation_test: Skip # Platform.executable
 precompilation_dart2js_test: Skip  # Platform.executable
diff --git a/tests/standalone/typed_data_test.dart b/tests/standalone/typed_data_test.dart
index 1b44624..a7e4c11 100644
--- a/tests/standalone/typed_data_test.dart
+++ b/tests/standalone/typed_data_test.dart
@@ -4,7 +4,7 @@
 //
 // Dart test program for testing typed data.
 
-// VMOptions=--optimization_counter_threshold=10
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
 
 // Library tag to be able to run in html test framework.
 library TypedDataTest;
diff --git a/tests/standalone/unboxed_int_converter_test.dart b/tests/standalone/unboxed_int_converter_test.dart
index 2b75a01..297861d 100644
--- a/tests/standalone/unboxed_int_converter_test.dart
+++ b/tests/standalone/unboxed_int_converter_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Test UnboxedIntConverter for int32.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 import "dart:typed_data";
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 4ca122e..7037f46 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -2,10 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-[ $compiler == dart2js && $host_checked ]
-dummy_compiler_test: Crash # Issue 22809
-
-[ $compiler == dart2js && $host_checked == false ]
+[ $compiler == dart2js ]
 dummy_compiler_test: Slow, Pass
 
 [ $compiler == dart2js ]
@@ -18,9 +15,19 @@
 [ ($compiler == none || $compiler == precompiler) && $runtime != vm ]
 dart2js_test: SkipByDesign # Uses dart:io.
 
-
 [ $compiler == dart2js && $mode == debug ]
 dummy_compiler_test: Slow, Pass
 
-[ $noopt || $compiler == precompiler || $compiler == dart2app ]
+[ $noopt || $compiler == precompiler || $mode == product ]
 source_mirrors_test: SkipByDesign # Imports dart:mirrors
+
+[ $compiler == dart2analyzer ]
+dart2js_test: StaticWarning # https://github.com/dart-lang/sdk/issues/25943
+recursive_import_test: StaticWarning # https://github.com/dart-lang/sdk/issues/25943
+dummy_compiler_test: StaticWarning # https://github.com/dart-lang/sdk/issues/25943
+source_mirrors_test: StaticWarning # https://github.com/dart-lang/sdk/issues/25943
+
+[ $compiler == dart2js && $cps_ir && $host_checked ]
+dummy_compiler_test: Crash # Issue 24485
+recursive_import_test: Crash # Issue 24485
+source_mirrors_test: Crash # Issue 24485
diff --git a/tools/.gitignore b/tools/.gitignore
new file mode 100644
index 0000000..2814b7b
--- /dev/null
+++ b/tools/.gitignore
@@ -0,0 +1,3 @@
+# tools/idl_parser is populated by gclient sync
+idl_parser
+
diff --git a/tools/VERSION b/tools/VERSION
index 81183ef7..597af30 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL dev
 MAJOR 1
-MINOR 15
+MINOR 16
 PATCH 0
-PRERELEASE 5
-PRERELEASE_PATCH 1
+PRERELEASE 0
+PRERELEASE_PATCH 0
diff --git a/tools/android_link.py b/tools/android_link.py
index 28edce5..6efea04 100755
--- a/tools/android_link.py
+++ b/tools/android_link.py
@@ -48,9 +48,9 @@
   link_args = sys.argv[4:]
 
   # Check arguments.
-  if target_arch not in ['arm', 'arm64', 'ia32']:
+  if target_arch not in ['arm', 'arm64', 'ia32', 'x64']:
     raise Exception(sys.argv[0] +
-        " first argument must be 'arm', 'arm64', or 'ia32'")
+        " first argument must be 'arm', 'arm64', 'ia32', or 'x64'")
   if link_type not in ['executable', 'library', 'shared_library']:
     raise Exception(sys.argv[0] +
                     " second argument must be 'executable' or 'library'")
@@ -81,6 +81,8 @@
     toolchain_arch = 'aarch64-linux-android-4.9'
   if target_arch == 'ia32':
     toolchain_arch = 'x86-4.9'
+  if target_arch == 'x64':
+    toolchain_arch = 'x86_64-4.9'
   toolchain_dir = 'linux-x86_64'
   android_toolchain = os.path.join(android_ndk_root,
       'toolchains', toolchain_arch,
@@ -94,6 +96,8 @@
         android_toolchain, 'aarch64-linux-android-c++')
   if target_arch == 'ia32':
     android_linker = os.path.join(android_toolchain, 'i686-linux-android-g++')
+  if target_arch == 'x64':
+    android_linker = os.path.join(android_toolchain, 'x86_64-linux-android-g++')
 
   # Grab the path to libgcc.a, which we must explicitly add to the link,
   # by invoking the cross-compiler with the -print-libgcc-file-name flag.
@@ -102,6 +106,8 @@
     android_gcc = os.path.join(android_toolchain, 'aarch64-linux-android-gcc')
   if target_arch == 'ia32':
     android_gcc = os.path.join(android_toolchain, 'i686-linux-android-gcc')
+  if target_arch == 'x64':
+    android_gcc = os.path.join(android_toolchain, 'x86_64-linux-android-gcc')
   android_libgcc = subprocess.check_output(
       [android_gcc, '-print-libgcc-file-name']).strip()
 
@@ -109,14 +115,19 @@
   # Android specific system includes and libraries.
   android_ndk_sysroot = os.path.join(android_ndk_root,
       'platforms', 'android-14', 'arch-arm')
+  libdir = 'lib'
   if target_arch == 'arm64':
     android_ndk_sysroot = os.path.join(android_ndk_root,
       'platforms', 'android-21', 'arch-arm64')
   if target_arch == 'ia32':
     android_ndk_sysroot = os.path.join(android_ndk_root,
         'platforms', 'android-14', 'arch-x86')
+  if target_arch == 'x64':
+    android_ndk_sysroot = os.path.join(android_ndk_root,
+        'platforms', 'android-21', 'arch-x86_64')
+    libdir = 'lib64'
   CheckDirExists(android_ndk_sysroot, 'Android sysroot')
-  android_ndk_lib = os.path.join(android_ndk_sysroot,'usr','lib')
+  android_ndk_lib = os.path.join(android_ndk_sysroot, 'usr', libdir)
   crtend_android = os.path.join(android_ndk_lib, 'crtend_android.o')
 
   if link_target == 'target':
diff --git a/tools/build.py b/tools/build.py
index 62717d7..3ec70d2 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -119,7 +119,7 @@
         print ("Cross-compilation to %s is not supported on host os %s."
                % (os_name, HOST_OS))
         return False
-      if not arch in ['ia32', 'arm', 'armv6', 'armv5te', 'arm64', 'mips']:
+      if not arch in ['ia32', 'x64', 'arm', 'armv6', 'armv5te', 'arm64', 'mips']:
         print ("Cross-compilation to %s is not supported for architecture %s."
                % (os_name, arch))
         return False
@@ -143,6 +143,8 @@
       return os.path.join(android_toolchain, 'aarch64-linux-android')
     if arch == 'ia32':
       return os.path.join(android_toolchain, 'i686-linux-android')
+    if arch == 'x64':
+      return os.path.join(android_toolchain, 'x86_64-linux-android')
 
   # If no cross compiler is specified, only try to figure one out on Linux.
   if not HOST_OS in ['linux']:
@@ -195,7 +197,7 @@
   global THIRD_PARTY_ROOT
   if host_os not in ['linux']:
     raise Exception('Unsupported host os %s' % host_os)
-  if target_arch not in ['ia32', 'arm', 'arm64']:
+  if target_arch not in ['ia32', 'x64', 'arm', 'arm64']:
     raise Exception('Unsupported target architecture %s' % target_arch)
 
   # Set up path to the Android NDK.
@@ -211,6 +213,8 @@
     toolchain_arch = 'aarch64-linux-android-4.9'
   if target_arch == 'ia32':
     toolchain_arch = 'x86-4.9'
+  if target_arch == 'x64':
+    toolchain_arch = 'x86_64-4.9'
   toolchain_dir = 'linux-x86_64'
   android_toolchain = os.path.join(android_ndk_root,
       'toolchains', toolchain_arch,
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index c35f98cd..f22b2a4 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -88,7 +88,49 @@
   },
   "Animation": {
     "members": {
-      "Animation": {}
+      "Animation": {},
+      "cancel": {
+        "support_level": "untriaged"
+      },
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "effect": {
+        "support_level": "untriaged"
+      },
+      "endClip": {
+        "support_level": "untriaged"
+      },
+      "finish": {
+        "support_level": "untriaged"
+      },
+      "finished": {
+        "support_level": "untriaged"
+      },
+      "pause": {
+        "support_level": "untriaged"
+      },
+      "play": {
+        "support_level": "untriaged"
+      },
+      "playState": {
+        "support_level": "untriaged"
+      },
+      "playbackRate": {
+        "support_level": "untriaged"
+      },
+      "ready": {
+        "support_level": "untriaged"
+      },
+      "reverse": {
+        "support_level": "untriaged"
+      },
+      "startClip": {
+        "support_level": "untriaged"
+      },
+      "startTime": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "untriaged"
   },
@@ -96,6 +138,61 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "AnimationEffectReadOnly": {
+    "members": {
+      "computedTiming": {
+        "support_level": "untriaged"
+      },
+      "timing": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AnimationEffectTiming": {
+    "members": {
+      "delay": {
+        "support_level": "untriaged"
+      },
+      "direction": {
+        "support_level": "untriaged"
+      },
+      "duration": {
+        "support_level": "untriaged"
+      },
+      "easing": {
+        "support_level": "untriaged"
+      },
+      "endDelay": {
+        "support_level": "untriaged"
+      },
+      "fill": {
+        "support_level": "untriaged"
+      },
+      "iterationStart": {
+        "support_level": "untriaged"
+      },
+      "iterations": {
+        "support_level": "untriaged"
+      },
+      "playbackRate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AnimationEvent": {
+    "members": {
+      "AnimationEvent": {},
+      "animationName": {
+        "support_level": "untriaged"
+      },
+      "elapsedTime": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AnimationNode": {
     "members": {
       "activeDuration": {
@@ -171,6 +268,7 @@
   },
   "AnimationPlayerEvent": {
     "members": {
+      "AnimationPlayerEvent": {},
       "currentTime": {
         "support_level": "untriaged"
       },
@@ -188,8 +286,25 @@
       "getAnimationPlayers": {
         "support_level": "untriaged"
       },
+      "getAnimations": {
+        "support_level": "untriaged"
+      },
       "play": {
         "support_level": "untriaged"
+      },
+      "playbackRate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AppBannerPromptResult": {
+    "members": {
+      "outcome": {
+        "support_level": "untriaged"
+      },
+      "platform": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -224,6 +339,7 @@
   },
   "ApplicationCacheErrorEvent": {
     "members": {
+      "ApplicationCacheErrorEvent": {},
       "message": {
         "support_level": "untriaged"
       },
@@ -288,6 +404,12 @@
   "AudioBuffer": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section",
     "members": {
+      "copyFromChannel": {
+        "support_level": "untriaged"
+      },
+      "copyToChannel": {
+        "support_level": "untriaged"
+      },
       "duration": {},
       "gain": {},
       "getChannelData": {},
@@ -312,6 +434,9 @@
       "SCHEDULED_STATE": {},
       "UNSCHEDULED_STATE": {},
       "buffer": {},
+      "detune": {
+        "support_level": "untriaged"
+      },
       "gain": {},
       "loop": {},
       "loopEnd": {},
@@ -337,6 +462,9 @@
       "addEventListener": {
         "support_level": "untriaged"
       },
+      "close": {
+        "support_level": "untriaged"
+      },
       "createAnalyser": {},
       "createBiquadFilter": {},
       "createBuffer": {},
@@ -361,6 +489,9 @@
         "support_level": "untriaged"
       },
       "createScriptProcessor": {},
+      "createStereoPanner": {
+        "support_level": "untriaged"
+      },
       "createWaveShaper": {},
       "createWaveTable": {},
       "currentTime": {},
@@ -374,8 +505,17 @@
       "removeEventListener": {
         "support_level": "untriaged"
       },
+      "resume": {
+        "support_level": "untriaged"
+      },
       "sampleRate": {},
-      "startRendering": {}
+      "startRendering": {},
+      "state": {
+        "support_level": "untriaged"
+      },
+      "suspend": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -490,6 +630,7 @@
   "AutocompleteErrorEvent": {
     "comment": "http://wiki.whatwg.org/wiki/RequestAutocomplete",
     "members": {
+      "AutocompleteErrorEvent": {},
       "reason": {}
     },
     "support_level": "experimental"
@@ -520,6 +661,21 @@
     },
     "support_level": "stable"
   },
+  "BeforeInstallPromptEvent": {
+    "members": {
+      "BeforeInstallPromptEvent": {},
+      "platforms": {
+        "support_level": "untriaged"
+      },
+      "prompt": {
+        "support_level": "untriaged"
+      },
+      "userChoice": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "BeforeLoadEvent": {
     "members": {
       "url": {}
@@ -566,6 +722,102 @@
     },
     "support_level": "stable"
   },
+  "Bluetooth": {
+    "members": {
+      "requestDevice": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BluetoothDevice": {
+    "members": {
+      "connectGATT": {
+        "support_level": "untriaged"
+      },
+      "deviceClass": {
+        "support_level": "untriaged"
+      },
+      "instanceID": {
+        "support_level": "untriaged"
+      },
+      "name": {
+        "support_level": "untriaged"
+      },
+      "paired": {
+        "support_level": "untriaged"
+      },
+      "productID": {
+        "support_level": "untriaged"
+      },
+      "productVersion": {
+        "support_level": "untriaged"
+      },
+      "vendorID": {
+        "support_level": "untriaged"
+      },
+      "vendorIDSource": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BluetoothGATTCharacteristic": {
+    "members": {
+      "readValue": {
+        "support_level": "untriaged"
+      },
+      "uuid": {
+        "support_level": "untriaged"
+      },
+      "writeValue": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BluetoothGATTRemoteServer": {
+    "members": {
+      "connected": {
+        "support_level": "untriaged"
+      },
+      "getPrimaryService": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BluetoothGATTService": {
+    "members": {
+      "getCharacteristic": {
+        "support_level": "untriaged"
+      },
+      "isPrimary": {
+        "support_level": "untriaged"
+      },
+      "uuid": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BluetoothUUID": {
+    "members": {
+      "canonicalUUID": {
+        "support_level": "untriaged"
+      },
+      "getCharacteristic": {
+        "support_level": "untriaged"
+      },
+      "getDescriptor": {
+        "support_level": "untriaged"
+      },
+      "getService": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Body": {
     "members": {
       "arrayBuffer": {
@@ -592,6 +844,42 @@
     "members": {},
     "support_level": "deprecated"
   },
+  "CHROMIUMSubscribeUniform": {
+    "members": {
+      "MOUSE_POSITION_CHROMIUM": {
+        "support_level": "untriaged"
+      },
+      "SUBSCRIBED_VALUES_BUFFER_CHROMIUM": {
+        "support_level": "untriaged"
+      },
+      "bindValuebufferCHROMIUM": {
+        "support_level": "untriaged"
+      },
+      "createValuebufferCHROMIUM": {
+        "support_level": "untriaged"
+      },
+      "deleteValuebufferCHROMIUM": {
+        "support_level": "untriaged"
+      },
+      "isValuebufferCHROMIUM": {
+        "support_level": "untriaged"
+      },
+      "populateSubscribedValuesCHROMIUM": {
+        "support_level": "untriaged"
+      },
+      "subscribeValueCHROMIUM": {
+        "support_level": "untriaged"
+      },
+      "uniformValuebufferCHROMIUM": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CHROMIUMValuebuffer": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "CSS": {
     "comment": "http://www.w3.org/TR/css3-conditional/#the-css-interface",
     "dart_action": "experimental",
@@ -626,6 +914,20 @@
     },
     "support_level": "stable"
   },
+  "CSSGroupingRule": {
+    "members": {
+      "cssRules": {
+        "support_level": "untriaged"
+      },
+      "deleteRule": {
+        "support_level": "untriaged"
+      },
+      "insertRule": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSHostRule": {
     "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#css-host-rule-interface",
     "members": {
@@ -661,6 +963,9 @@
       "__getter__": {
         "support_level": "untriaged"
       },
+      "appendRule": {
+        "support_level": "untriaged"
+      },
       "cssRules": {
         "support_level": "untriaged"
       },
@@ -969,6 +1274,12 @@
       },
       "keys": {
         "support_level": "untriaged"
+      },
+      "match": {
+        "support_level": "untriaged"
+      },
+      "open": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -1099,6 +1410,9 @@
       "fillRect": {},
       "fillStyle": {},
       "fillText": {},
+      "filter": {
+        "support_level": "untriaged"
+      },
       "font": {},
       "getContextAttributes": {
         "comment": "http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL",
@@ -1221,7 +1535,13 @@
   "CharacterData": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-FF21A306",
     "members": {
+      "after": {
+        "support_level": "untriaged"
+      },
       "appendData": {},
+      "before": {
+        "support_level": "untriaged"
+      },
       "data": {},
       "deleteData": {},
       "insertData": {},
@@ -1242,6 +1562,12 @@
   },
   "ChildNode": {
     "members": {
+      "after": {
+        "support_level": "untriaged"
+      },
+      "before": {
+        "support_level": "untriaged"
+      },
       "nextElementSibling": {
         "support_level": "untriaged"
       },
@@ -1298,11 +1624,17 @@
   },
   "Client": {
     "members": {
+      "frameType": {
+        "support_level": "untriaged"
+      },
       "id": {
         "support_level": "untriaged"
       },
       "postMessage": {
         "support_level": "untriaged"
+      },
+      "url": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -1322,11 +1654,28 @@
   "ClientRectList": {
     "comment": "http://www.w3.org/TR/cssom-view/#the-clientrectlist-interface",
     "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "item": {},
       "length": {}
     },
     "support_level": "stable"
   },
+  "Clients": {
+    "members": {
+      "claim": {
+        "support_level": "untriaged"
+      },
+      "matchAll": {
+        "support_level": "untriaged"
+      },
+      "openWindow": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Clipboard": {
     "comment": "http://www.w3.org/html/wg/drafts/html/master/editing.html#the-datatransfer-interface (Should be DataTransfer)",
     "members": {
@@ -1342,9 +1691,18 @@
     },
     "support_level": "stable"
   },
+  "ClipboardEvent": {
+    "members": {
+      "clipboardData": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CloseEvent": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#closeevent",
     "members": {
+      "CloseEvent": {},
       "code": {},
       "reason": {},
       "wasClean": {}
@@ -1375,6 +1733,7 @@
   "CompositionEvent": {
     "comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-CompositionEvent",
     "members": {
+      "CompositionEvent": {},
       "activeSegmentEnd": {
         "support_level": "untriaged"
       },
@@ -1389,6 +1748,65 @@
     },
     "support_level": "stable"
   },
+  "CompositorProxy": {
+    "members": {
+      "CompositorProxy": {},
+      "disconnect": {
+        "support_level": "untriaged"
+      },
+      "opacity": {
+        "support_level": "untriaged"
+      },
+      "scrollLeft": {
+        "support_level": "untriaged"
+      },
+      "scrollTop": {
+        "support_level": "untriaged"
+      },
+      "supports": {
+        "support_level": "untriaged"
+      },
+      "transform": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CompositorWorker": {
+    "members": {
+      "CompositorWorker": {},
+      "onerror": {
+        "support_level": "untriaged"
+      },
+      "onmessage": {
+        "support_level": "untriaged"
+      },
+      "postMessage": {
+        "support_level": "untriaged"
+      },
+      "terminate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CompositorWorkerGlobalScope": {
+    "members": {
+      "cancelAnimationFrame": {
+        "support_level": "untriaged"
+      },
+      "onmessage": {
+        "support_level": "untriaged"
+      },
+      "postMessage": {
+        "support_level": "untriaged"
+      },
+      "requestAnimationFrame": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Console": {
     "members": {
       "assert": {
@@ -1558,11 +1976,17 @@
       "avatarURL": {
         "support_level": "untriaged"
       },
+      "iconURL": {
+        "support_level": "untriaged"
+      },
       "id": {
         "support_level": "untriaged"
       },
       "name": {
         "support_level": "untriaged"
+      },
+      "type": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -1580,6 +2004,34 @@
       },
       "request": {
         "support_level": "untriaged"
+      },
+      "requireUserMediation": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CrossOriginConnectEvent": {
+    "members": {
+      "acceptConnection": {
+        "support_level": "untriaged"
+      },
+      "client": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CrossOriginServiceWorkerClient": {
+    "members": {
+      "origin": {
+        "support_level": "untriaged"
+      },
+      "postMessage": {
+        "support_level": "untriaged"
+      },
+      "targetUrl": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -1643,6 +2095,7 @@
   "CustomEvent": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Events/#interface-CustomEvent",
     "members": {
+      "CustomEvent": {},
       "_detail": {
         "support_level": "untriaged"
       },
@@ -2137,6 +2590,9 @@
     "members": {
       "DOMSettableTokenList": {},
       "__getter__": {},
+      "item": {
+        "support_level": "untriaged"
+      },
       "value": {}
     },
     "support_level": "stable"
@@ -2144,6 +2600,9 @@
   "DOMStringList": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMStringList",
     "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "contains": {},
       "item": {},
       "length": {}
@@ -2156,7 +2615,10 @@
       "DOMStringMap": {},
       "__delete__": {},
       "__getter__": {},
-      "__setter__": {}
+      "__setter__": {},
+      "item": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "stable"
   },
@@ -2313,6 +2775,15 @@
     },
     "support_level": "untriaged"
   },
+  "DefaultSessionStartEvent": {
+    "members": {
+      "DefaultSessionStartEvent": {},
+      "session": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "DelayNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DelayNode",
     "members": {
@@ -2359,6 +2830,7 @@
   },
   "DeviceLightEvent": {
     "members": {
+      "DeviceLightEvent": {},
       "value": {
         "support_level": "untriaged"
       }
@@ -2535,6 +3007,9 @@
       "documentURI": {},
       "domain": {},
       "elementFromPoint": {},
+      "elementsFromPoint": {
+        "support_level": "untriaged"
+      },
       "evaluate": {
         "dart_action": "suppress"
       },
@@ -2765,6 +3240,9 @@
       "onwheel": {
         "support_level": "untriaged"
       },
+      "origin": {
+        "support_level": "untriaged"
+      },
       "pointerLockElement": {
         "support_level": "untriaged"
       },
@@ -2783,6 +3261,9 @@
       "rootElement": {
         "support_level": "untriaged"
       },
+      "scrollingElement": {
+        "support_level": "untriaged"
+      },
       "securityPolicy": {
         "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#idl-def-SecurityPolicy",
         "support_level": "experimental"
@@ -2972,6 +3453,27 @@
     },
     "support_level": "experimental"
   },
+  "EXTsRGB": {
+    "members": {
+      "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT": {
+        "support_level": "untriaged"
+      },
+      "SRGB8_ALPHA8_EXT": {
+        "support_level": "untriaged"
+      },
+      "SRGB_ALPHA_EXT": {
+        "support_level": "untriaged"
+      },
+      "SRGB_EXT": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "EffectModel": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "Element": {
     "comment": "http://dom.spec.whatwg.org/#interface-element",
     "members": {
@@ -2980,10 +3482,16 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "after": {
+        "support_level": "untriaged"
+      },
       "animate": {
         "support_level": "untriaged"
       },
       "attributes": {},
+      "before": {
+        "support_level": "untriaged"
+      },
       "blur": {},
       "childElementCount": {},
       "children": {
@@ -3004,6 +3512,15 @@
       "clientLeft": {},
       "clientTop": {},
       "clientWidth": {},
+      "closest": {
+        "support_level": "untriaged"
+      },
+      "computedName": {
+        "support_level": "untriaged"
+      },
+      "computedRole": {
+        "support_level": "untriaged"
+      },
       "contentEditable": {
         "comment": "http://www.whatwg.org/specs/web-apps/2007-10-26/multipage/section-elements.html#htmlelement",
         "dart_action": "stable",
@@ -3034,6 +3551,9 @@
       "getAnimationPlayers": {
         "support_level": "untriaged"
       },
+      "getAnimations": {
+        "support_level": "untriaged"
+      },
       "getAttribute": {
         "support_level": "untriaged"
       },
@@ -3311,6 +3831,12 @@
       "requestPointerLock": {
         "support_level": "untriaged"
       },
+      "scroll": {
+        "support_level": "untriaged"
+      },
+      "scrollBy": {
+        "support_level": "untriaged"
+      },
       "scrollByLines": {},
       "scrollByPages": {},
       "scrollHeight": {},
@@ -3322,6 +3848,9 @@
         "support_level": "nonstandard"
       },
       "scrollLeft": {},
+      "scrollTo": {
+        "support_level": "untriaged"
+      },
       "scrollTop": {},
       "scrollWidth": {},
       "setAttribute": {},
@@ -3508,6 +4037,7 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#errorevent",
     "dart_action": "unstable",
     "members": {
+      "ErrorEvent": {},
       "colno": {
         "support_level": "untriaged"
       },
@@ -3550,6 +4080,7 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "Event": {},
       "FOCUS": {
         "comment": "https://developer.mozilla.org/en-US/docs/DOM/window.captureEvents",
         "dart_action": "suppress",
@@ -3701,6 +4232,7 @@
   },
   "ExtendableEvent": {
     "members": {
+      "ExtendableEvent": {},
       "waitUntil": {
         "support_level": "untriaged"
       }
@@ -3712,6 +4244,12 @@
       "FederatedCredential": {},
       "federation": {
         "support_level": "untriaged"
+      },
+      "protocol": {
+        "support_level": "untriaged"
+      },
+      "provider": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -3735,6 +4273,7 @@
   },
   "FetchEvent": {
     "members": {
+      "FetchEvent": {},
       "isReload": {
         "support_level": "untriaged"
       },
@@ -3750,6 +4289,7 @@
   "File": {
     "comment": "http://www.w3.org/TR/FileAPI/#dfn-file",
     "members": {
+      "File": {},
       "lastModified": {
         "support_level": "untriaged"
       },
@@ -3949,6 +4489,7 @@
   },
   "FocusEvent": {
     "members": {
+      "FocusEvent": {},
       "relatedTarget": {}
     },
     "support_level": "stable"
@@ -4066,10 +4607,29 @@
       "FormData": {},
       "append": {},
       "appendBlob": {},
-      "appendString": {}
+      "appendString": {},
+      "delete": {
+        "support_level": "untriaged"
+      },
+      "get": {
+        "support_level": "untriaged"
+      },
+      "getAll": {
+        "support_level": "untriaged"
+      },
+      "has": {
+        "support_level": "untriaged"
+      },
+      "set": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "stable"
   },
+  "FrameRequestCallback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "GainNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#GainNode",
     "members": {
@@ -4107,6 +4667,7 @@
   },
   "GamepadEvent": {
     "members": {
+      "GamepadEvent": {},
       "gamepad": {
         "support_level": "untriaged"
       }
@@ -4135,6 +4696,17 @@
     },
     "support_level": "untriaged"
   },
+  "GeofencingEvent": {
+    "members": {
+      "id": {
+        "support_level": "untriaged"
+      },
+      "region": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "GeofencingRegion": {
     "members": {
       "id": {
@@ -4326,6 +4898,17 @@
     },
     "support_level": "untriaged"
   },
+  "HMDVRDevice": {
+    "members": {
+      "getEyeParameters": {
+        "support_level": "untriaged"
+      },
+      "setFieldOfView": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "HTMLAllCollection": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all",
     "dart_action": "suppress",
@@ -4573,6 +5156,9 @@
         "dart_action": "unstable"
       },
       "name": {},
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "setCustomValidity": {},
       "type": {},
       "validationMessage": {},
@@ -4762,6 +5348,9 @@
     "comment": "http://www.whatwg.org/specs/web-apps/2007-10-26/multipage/section-elements.html#htmlelement",
     "members": {
       "accessKey": {},
+      "blur": {
+        "support_level": "untriaged"
+      },
       "children": {},
       "click": {},
       "contentEditable": {},
@@ -4770,6 +5359,9 @@
       },
       "dir": {},
       "draggable": {},
+      "focus": {
+        "support_level": "untriaged"
+      },
       "getInputContext": {
         "comment": "http://www.w3.org/TR/ime-api/#the-getinputcontext-method",
         "support_level": "experimental"
@@ -4964,6 +5556,9 @@
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
+      "style": {
+        "support_level": "untriaged"
+      },
       "tabIndex": {},
       "title": {},
       "translate": {},
@@ -5012,6 +5607,9 @@
       "elements": {},
       "form": {},
       "name": {},
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "setCustomValidity": {},
       "type": {},
       "validationMessage": {},
@@ -5035,6 +5633,9 @@
     "members": {
       "HTMLFormControlsCollection": {},
       "__getter__": {},
+      "item": {
+        "support_level": "untriaged"
+      },
       "namedItem": {}
     },
     "support_level": "stable"
@@ -5054,6 +5655,9 @@
       "elements": {},
       "encoding": {},
       "enctype": {},
+      "item": {
+        "support_level": "untriaged"
+      },
       "length": {},
       "method": {},
       "name": {},
@@ -5066,6 +5670,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute",
         "support_level": "experimental"
       },
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "requestAutocomplete": {
         "comment": "http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html",
         "support_level": "experimental"
@@ -5322,6 +5929,9 @@
         "support_level": "deprecated"
       },
       "alt": {},
+      "autocapitalize": {
+        "support_level": "untriaged"
+      },
       "autocomplete": {},
       "autofocus": {},
       "capture": {
@@ -5356,6 +5966,9 @@
       "max": {},
       "maxLength": {},
       "min": {},
+      "minLength": {
+        "support_level": "untriaged"
+      },
       "multiple": {},
       "name": {},
       "onspeechchange": {
@@ -5372,6 +5985,9 @@
       "pattern": {},
       "placeholder": {},
       "readOnly": {},
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "required": {},
       "select": {},
       "selectionDirection": {},
@@ -5436,6 +6052,9 @@
         "dart_action": "unstable"
       },
       "name": {},
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "setCustomValidity": {},
       "type": {},
       "validationMessage": {},
@@ -5690,9 +6309,18 @@
       "readyState": {},
       "seekable": {},
       "seeking": {},
+      "session": {
+        "support_level": "untriaged"
+      },
       "setMediaKeys": {
         "support_level": "untriaged"
       },
+      "setSinkId": {
+        "support_level": "untriaged"
+      },
+      "sinkId": {
+        "support_level": "untriaged"
+      },
       "src": {},
       "startTime": {
         "support_level": "nonstandard"
@@ -5772,9 +6400,15 @@
       "disabled": {
         "support_level": "untriaged"
       },
+      "icon": {
+        "support_level": "untriaged"
+      },
       "label": {
         "support_level": "untriaged"
       },
+      "radiogroup": {
+        "support_level": "untriaged"
+      },
       "type": {
         "support_level": "untriaged"
       }
@@ -5898,6 +6532,9 @@
         "support_level": "untriaged"
       },
       "name": {},
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "setCustomValidity": {},
       "standby": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLObjectElement-partial",
@@ -5945,6 +6582,9 @@
   "HTMLOptionsCollection": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmloptionscollection-0",
     "members": {
+      "item": {
+        "support_level": "untriaged"
+      },
       "length": {},
       "namedItem": {},
       "numericIndexGetter": {},
@@ -5967,6 +6607,9 @@
         "dart_action": "unstable"
       },
       "name": {},
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "setCustomValidity": {},
       "type": {},
       "validationMessage": {},
@@ -6109,6 +6752,9 @@
       "remove": {
         "support_level": "untriaged"
       },
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "required": {},
       "selectedIndex": {},
       "selectedOptions": {},
@@ -6427,6 +7073,9 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-textarea-element",
     "members": {
       "HTMLTextAreaElement": {},
+      "autocapitalize": {
+        "support_level": "untriaged"
+      },
       "autofocus": {},
       "checkValidity": {},
       "cols": {},
@@ -6445,9 +7094,15 @@
         "dart_action": "unstable"
       },
       "maxLength": {},
+      "minLength": {
+        "support_level": "untriaged"
+      },
       "name": {},
       "placeholder": {},
       "readOnly": {},
+      "reportValidity": {
+        "support_level": "untriaged"
+      },
       "required": {},
       "rows": {},
       "select": {},
@@ -6576,6 +7231,7 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#hashchangeevent",
     "dart_action": "unstable",
     "members": {
+      "HashChangeEvent": {},
       "initHashChangeEvent": {},
       "newURL": {},
       "oldURL": {}
@@ -6636,6 +7292,9 @@
       "forward": {},
       "go": {},
       "length": {},
+      "options": {
+        "support_level": "untriaged"
+      },
       "pushState": {},
       "replaceState": {},
       "state": {}
@@ -6752,6 +7411,12 @@
     "members": {
       "count": {},
       "get": {},
+      "getAll": {
+        "support_level": "untriaged"
+      },
+      "getAllKeys": {
+        "support_level": "untriaged"
+      },
       "getKey": {},
       "keyPath": {},
       "multiEntry": {},
@@ -6802,6 +7467,12 @@
       "delete": {},
       "deleteIndex": {},
       "get": {},
+      "getAll": {
+        "support_level": "untriaged"
+      },
+      "getAllKeys": {
+        "support_level": "untriaged"
+      },
       "index": {},
       "indexNames": {},
       "keyPath": {},
@@ -6855,6 +7526,9 @@
       "error": {},
       "mode": {},
       "objectStore": {},
+      "objectStoreNames": {
+        "support_level": "untriaged"
+      },
       "onabort": {},
       "oncomplete": {},
       "onerror": {},
@@ -6869,6 +7543,7 @@
     "comment": "http://www.w3.org/TR/IndexedDB/#idl-def-IDBVersionChangeEvent",
     "dart_action": "unstable",
     "members": {
+      "IDBVersionChangeEvent": {},
       "dataLoss": {
         "support_level": "untriaged"
       },
@@ -6921,6 +7596,15 @@
     },
     "support_level": "untriaged"
   },
+  "InputDevice": {
+    "members": {
+      "InputDevice": {},
+      "firesTouchEvents": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "InputMethodContext": {
     "comment": "http://www.w3.org/TR/ime-api/#idl-def-InputMethodContext",
     "members": {
@@ -7060,16 +7744,29 @@
       "DOM_KEY_LOCATION_STANDARD": {
         "support_level": "untriaged"
       },
+      "KeyboardEvent": {},
       "altGraphKey": {
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
       "altKey": {},
+      "charCode": {
+        "support_level": "untriaged"
+      },
+      "code": {
+        "support_level": "untriaged"
+      },
       "ctrlKey": {},
       "getModifierState": {
         "support_level": "untriaged"
       },
       "initKeyboardEvent": {},
+      "key": {
+        "support_level": "untriaged"
+      },
+      "keyCode": {
+        "support_level": "untriaged"
+      },
       "keyIdentifier": {
         "dart_action": "experimental",
         "support_level": "nonstandard"
@@ -7085,10 +7782,19 @@
       "repeat": {
         "support_level": "untriaged"
       },
-      "shiftKey": {}
+      "shiftKey": {},
+      "which": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "stable"
   },
+  "KeyframeEffect": {
+    "members": {
+      "KeyframeEffect": {}
+    },
+    "support_level": "untriaged"
+  },
   "LocalCredential": {
     "members": {
       "LocalCredential": {},
@@ -7179,6 +7885,7 @@
   "MIDIConnectionEvent": {
     "comment": "http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface",
     "members": {
+      "MIDIConnectionEvent": {},
       "port": {}
     },
     "support_level": "experimental"
@@ -7221,6 +7928,7 @@
   "MIDIMessageEvent": {
     "comment": "http://webaudio.github.io/web-midi-api/#midimessageevent-interface",
     "members": {
+      "MIDIMessageEvent": {},
       "data": {},
       "receivedTime": {}
     },
@@ -7260,12 +7968,24 @@
     "comment": "http://webaudio.github.io/web-midi-api/#idl-def-MIDIPort",
     "members": {
       "addEventListener": {},
+      "close": {
+        "support_level": "untriaged"
+      },
+      "connection": {
+        "support_level": "untriaged"
+      },
       "dispatchEvent": {},
       "id": {},
       "manufacturer": {},
       "name": {},
       "ondisconnect": {},
+      "open": {
+        "support_level": "untriaged"
+      },
       "removeEventListener": {},
+      "state": {
+        "support_level": "untriaged"
+      },
       "type": {},
       "version": {}
     },
@@ -7320,6 +8040,17 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "MediaDevices": {
+    "members": {
+      "enumerateDevices": {
+        "support_level": "untriaged"
+      },
+      "getUserMedia": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "MediaElementAudioSourceNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaElementAudioSourceNode",
     "members": {
@@ -7329,6 +8060,18 @@
     },
     "support_level": "experimental"
   },
+  "MediaEncryptedEvent": {
+    "members": {
+      "MediaEncryptedEvent": {},
+      "initData": {
+        "support_level": "untriaged"
+      },
+      "initDataType": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "MediaError": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#mediaerror",
     "dart_action": "unstable",
@@ -7364,6 +8107,7 @@
   "MediaKeyEvent": {
     "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#event-definitions",
     "members": {
+      "MediaKeyEvent": {},
       "defaultURL": {},
       "errorCode": {},
       "initData": {},
@@ -7377,8 +8121,12 @@
   "MediaKeyMessageEvent": {
     "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeymessageevent",
     "members": {
+      "MediaKeyMessageEvent": {},
       "destinationURL": {},
-      "message": {}
+      "message": {},
+      "messageType": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -7402,10 +8150,19 @@
       },
       "dispatchEvent": {},
       "error": {},
+      "expiration": {
+        "support_level": "untriaged"
+      },
       "generateRequest": {
         "support_level": "untriaged"
       },
+      "keyStatuses": {
+        "support_level": "untriaged"
+      },
       "keySystem": {},
+      "load": {
+        "support_level": "untriaged"
+      },
       "onkeyadded": {
         "support_level": "untriaged"
       },
@@ -7421,12 +8178,37 @@
       "release": {
         "support_level": "untriaged"
       },
+      "remove": {
+        "support_level": "untriaged"
+      },
       "removeEventListener": {},
       "sessionId": {},
       "update": {}
     },
     "support_level": "experimental"
   },
+  "MediaKeyStatusMap": {
+    "members": {
+      "size": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MediaKeySystemAccess": {
+    "members": {
+      "createMediaKeys": {
+        "support_level": "untriaged"
+      },
+      "getConfiguration": {
+        "support_level": "untriaged"
+      },
+      "keySystem": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "MediaKeys": {
     "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html",
     "members": {
@@ -7438,7 +8220,10 @@
       "isTypeSupported": {
         "support_level": "untriaged"
       },
-      "keySystem": {}
+      "keySystem": {},
+      "setServerCertificate": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -7470,6 +8255,7 @@
   },
   "MediaQueryListEvent": {
     "members": {
+      "MediaQueryListEvent": {},
       "matches": {
         "support_level": "untriaged"
       },
@@ -7487,6 +8273,18 @@
     },
     "support_level": "stable"
   },
+  "MediaSession": {
+    "members": {
+      "MediaSession": {},
+      "activate": {
+        "support_level": "untriaged"
+      },
+      "deactivate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "MediaSource": {
     "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource",
     "members": {
@@ -7509,6 +8307,9 @@
     "comment": "http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastream",
     "members": {
       "MediaStream": {},
+      "active": {
+        "support_level": "untriaged"
+      },
       "addEventListener": {},
       "addTrack": {},
       "clone": {
@@ -7552,6 +8353,7 @@
   "MediaStreamEvent": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/getusermedia.html",
     "members": {
+      "MediaStreamEvent": {},
       "stream": {}
     },
     "support_level": "experimental"
@@ -7618,6 +8420,7 @@
   "MessageEvent": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#messageevent",
     "members": {
+      "MessageEvent": {},
       "data": {},
       "initMessageEvent": {},
       "lastEventId": {
@@ -7686,8 +8489,12 @@
   "MouseEvent": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Events/#events-mouseevents",
     "members": {
+      "MouseEvent": {},
       "altKey": {},
       "button": {},
+      "buttons": {
+        "support_level": "untriaged"
+      },
       "clientX": {},
       "clientY": {},
       "ctrlKey": {},
@@ -7699,6 +8506,12 @@
         "support_level": "deprecated"
       },
       "initMouseEvent": {},
+      "layerX": {
+        "support_level": "untriaged"
+      },
+      "layerY": {
+        "support_level": "untriaged"
+      },
       "metaKey": {},
       "movementX": {
         "support_level": "untriaged"
@@ -7714,6 +8527,12 @@
         "dart_action": "unstable",
         "support_level": "nonstandard"
       },
+      "pageX": {
+        "support_level": "untriaged"
+      },
+      "pageY": {
+        "support_level": "untriaged"
+      },
       "region": {
         "support_level": "untriaged"
       },
@@ -7730,6 +8549,9 @@
       "webkitMovementY": {
         "support_level": "experimental"
       },
+      "which": {
+        "support_level": "untriaged"
+      },
       "x": {
         "dart_action": "suppress",
         "support_level": "nonstandard"
@@ -7818,6 +8640,9 @@
       "appVersion": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorid"
       },
+      "bluetooth": {
+        "support_level": "untriaged"
+      },
       "connection": {
         "support_level": "untriaged"
       },
@@ -7858,6 +8683,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils",
         "support_level": "experimental"
       },
+      "getVRDevices": {
+        "support_level": "untriaged"
+      },
       "hardwareConcurrency": {
         "support_level": "untriaged"
       },
@@ -7877,6 +8705,9 @@
       "maxTouchPoints": {
         "support_level": "untriaged"
       },
+      "mediaDevices": {
+        "support_level": "untriaged"
+      },
       "mimeTypes": {
         "dart_action": "experimental",
         "support_level": "nonstandard"
@@ -7885,6 +8716,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#navigatoronline",
         "dart_action": "unstable"
       },
+      "permissions": {
+        "support_level": "untriaged"
+      },
       "platform": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorid"
       },
@@ -7914,12 +8748,18 @@
       "requestMIDIAccess": {
         "support_level": "untriaged"
       },
+      "requestMediaKeySystemAccess": {
+        "support_level": "untriaged"
+      },
       "sendBeacon": {
         "support_level": "untriaged"
       },
       "serviceWorker": {
         "support_level": "untriaged"
       },
+      "services": {
+        "support_level": "untriaged"
+      },
       "storageQuota": {
         "support_level": "untriaged"
       },
@@ -8013,6 +8853,17 @@
     },
     "support_level": "untriaged"
   },
+  "NavigatorStorageUtils": {
+    "members": {
+      "cookieEnabled": {
+        "support_level": "untriaged"
+      },
+      "getStorageUpdates": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "NavigatorUserMediaError": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaError",
     "members": {
@@ -8196,6 +9047,25 @@
     },
     "support_level": "stable"
   },
+  "NonDocumentTypeChildNode": {
+    "members": {
+      "nextElementSibling": {
+        "support_level": "untriaged"
+      },
+      "previousElementSibling": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "NonElementParentNode": {
+    "members": {
+      "getElementById": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Notation": {
     "comment": "http://dom.spec.whatwg.org/#notation",
     "dart_action": "suppress",
@@ -8219,6 +9089,9 @@
         "support_level": "nonstandard"
       },
       "close": {},
+      "data": {
+        "support_level": "untriaged"
+      },
       "dir": {
         "dart_action": "experimental",
         "support_level": "nonstandard"
@@ -8249,16 +9122,31 @@
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
+      "silent": {
+        "support_level": "untriaged"
+      },
       "tag": {
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
       "title": {
         "support_level": "untriaged"
+      },
+      "vibrate": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "experimental"
   },
+  "NotificationEvent": {
+    "members": {
+      "NotificationEvent": {},
+      "notification": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "NotificationPermissionCallback": {
     "comment": "http://www.w3.org/TR/notifications/#notificationpermissioncallback",
     "members": {
@@ -8326,7 +9214,10 @@
   "OfflineAudioContext": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioContext-section",
     "members": {
-      "OfflineAudioContext": {}
+      "OfflineAudioContext": {},
+      "startRendering": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -8408,6 +9299,7 @@
   "PageTransitionEvent": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#pagetransitionevent",
     "members": {
+      "PageTransitionEvent": {},
       "persisted": {}
     },
     "support_level": "experimental"
@@ -8482,6 +9374,18 @@
     },
     "support_level": "untriaged"
   },
+  "PasswordCredential": {
+    "members": {
+      "PasswordCredential": {},
+      "formData": {
+        "support_level": "untriaged"
+      },
+      "password": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Path": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects",
     "members": {
@@ -8539,6 +9443,9 @@
       "addEventListener": {
         "support_level": "untriaged"
       },
+      "clearFrameTimings": {
+        "support_level": "untriaged"
+      },
       "clearMarks": {
         "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
         "support_level": "experimental"
@@ -8588,6 +9495,9 @@
       "removeEventListener": {
         "support_level": "untriaged"
       },
+      "setFrameTimingBufferSize": {
+        "support_level": "untriaged"
+      },
       "timing": {},
       "webkitClearResourceTimings": {
         "comment": "http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface",
@@ -8600,6 +9510,14 @@
     },
     "support_level": "stable"
   },
+  "PerformanceCompositeTiming": {
+    "members": {
+      "sourceFrame": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PerformanceEntry": {
     "comment": "http://www.w3.org/TR/performance-timeline/#sec-PerformanceEntry-interface",
     "members": {
@@ -8641,6 +9559,14 @@
     },
     "support_level": "stable"
   },
+  "PerformanceRenderTiming": {
+    "members": {
+      "sourceFrame": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PerformanceResourceTiming": {
     "comment": "http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming",
     "members": {
@@ -8664,7 +9590,10 @@
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
-      "secureConnectionStart": {}
+      "secureConnectionStart": {},
+      "workerStart": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -8696,10 +9625,81 @@
     },
     "support_level": "stable"
   },
+  "PeriodicSyncEvent": {
+    "members": {
+      "PeriodicSyncEvent": {},
+      "registration": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PeriodicSyncManager": {
+    "members": {
+      "getRegistration": {
+        "support_level": "untriaged"
+      },
+      "getRegistrations": {
+        "support_level": "untriaged"
+      },
+      "minPossiblePeriod": {
+        "support_level": "untriaged"
+      },
+      "permissionState": {
+        "support_level": "untriaged"
+      },
+      "register": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PeriodicSyncRegistration": {
+    "members": {
+      "minPeriod": {
+        "support_level": "untriaged"
+      },
+      "networkState": {
+        "support_level": "untriaged"
+      },
+      "powerState": {
+        "support_level": "untriaged"
+      },
+      "tag": {
+        "support_level": "untriaged"
+      },
+      "unregister": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PeriodicWave": {
     "members": {},
     "support_level": "untriaged"
   },
+  "PermissionStatus": {
+    "members": {
+      "onchange": {
+        "support_level": "untriaged"
+      },
+      "state": {
+        "support_level": "untriaged"
+      },
+      "status": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "Permissions": {
+    "members": {
+      "query": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Player": {
     "members": {
       "cancel": {
@@ -8767,6 +9767,9 @@
   },
   "PluginPlaceholderElement": {
     "members": {
+      "closeable": {
+        "support_level": "untriaged"
+      },
       "createdCallback": {
         "support_level": "untriaged"
       },
@@ -8776,9 +9779,40 @@
     },
     "support_level": "untriaged"
   },
+  "PointerEvent": {
+    "members": {
+      "PointerEvent": {},
+      "height": {
+        "support_level": "untriaged"
+      },
+      "isPrimary": {
+        "support_level": "untriaged"
+      },
+      "pointerId": {
+        "support_level": "untriaged"
+      },
+      "pointerType": {
+        "support_level": "untriaged"
+      },
+      "pressure": {
+        "support_level": "untriaged"
+      },
+      "tiltX": {
+        "support_level": "untriaged"
+      },
+      "tiltY": {
+        "support_level": "untriaged"
+      },
+      "width": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PopStateEvent": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#popstateevent",
     "members": {
+      "PopStateEvent": {},
       "state": {}
     },
     "support_level": "stable"
@@ -8811,8 +9845,69 @@
     },
     "support_level": "stable"
   },
+  "PositionSensorVRDevice": {
+    "members": {
+      "getImmediateState": {
+        "support_level": "untriaged"
+      },
+      "getState": {
+        "support_level": "untriaged"
+      },
+      "resetSensor": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Presentation": {
-    "members": {},
+    "members": {
+      "getAvailability": {
+        "support_level": "untriaged"
+      },
+      "joinSession": {
+        "support_level": "untriaged"
+      },
+      "session": {
+        "support_level": "untriaged"
+      },
+      "startSession": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PresentationAvailability": {
+    "members": {
+      "onchange": {
+        "support_level": "untriaged"
+      },
+      "value": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PresentationSession": {
+    "members": {
+      "binaryType": {
+        "support_level": "untriaged"
+      },
+      "close": {
+        "support_level": "untriaged"
+      },
+      "id": {
+        "support_level": "untriaged"
+      },
+      "onmessage": {
+        "support_level": "untriaged"
+      },
+      "send": {
+        "support_level": "untriaged"
+      },
+      "state": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "untriaged"
   },
   "ProcessingInstruction": {
@@ -8832,6 +9927,7 @@
   "ProgressEvent": {
     "comment": "http://xhr.spec.whatwg.org/#interface-progressevent",
     "members": {
+      "ProgressEvent": {},
       "lengthComputable": {},
       "loaded": {},
       "total": {}
@@ -8870,6 +9966,18 @@
     },
     "support_level": "untriaged"
   },
+  "PromiseRejectionEvent": {
+    "members": {
+      "PromiseRejectionEvent": {},
+      "promise": {
+        "support_level": "untriaged"
+      },
+      "reason": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PromiseResolver": {
     "members": {
       "fulfill": {
@@ -8886,6 +9994,7 @@
   },
   "PushEvent": {
     "members": {
+      "PushEvent": {},
       "data": {
         "support_level": "untriaged"
       }
@@ -8894,8 +10003,35 @@
   },
   "PushManager": {
     "members": {
+      "getSubscription": {
+        "support_level": "untriaged"
+      },
+      "permissionState": {
+        "support_level": "untriaged"
+      },
       "register": {
         "support_level": "untriaged"
+      },
+      "subscribe": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PushMessageData": {
+    "members": {
+      "PushMessageData": {},
+      "arrayBuffer": {
+        "support_level": "untriaged"
+      },
+      "blob": {
+        "support_level": "untriaged"
+      },
+      "json": {
+        "support_level": "untriaged"
+      },
+      "text": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -8911,6 +10047,17 @@
     },
     "support_level": "untriaged"
   },
+  "PushSubscription": {
+    "members": {
+      "endpoint": {
+        "support_level": "untriaged"
+      },
+      "unsubscribe": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RGBColor": {
     "comment": "http://dev.w3.org/csswg/cssom/",
     "dart_action": "suppress",
@@ -8940,6 +10087,7 @@
   "RTCDTMFToneChangeEvent": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFToneChangeEvent",
     "members": {
+      "RTCDTMFToneChangeEvent": {},
       "tone": {}
     },
     "support_level": "experimental"
@@ -9103,6 +10251,9 @@
   "RadioNodeList": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/#radionodelist",
     "members": {
+      "item": {
+        "support_level": "untriaged"
+      },
       "value": {}
     },
     "support_level": "stable"
@@ -9196,7 +10347,18 @@
     },
     "support_level": "deprecated"
   },
-  "ReadableStream": {
+  "ReadableByteStream": {
+    "members": {
+      "cancel": {
+        "support_level": "untriaged"
+      },
+      "getReader": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ReadableByteStreamReader": {
     "members": {
       "cancel": {
         "support_level": "untriaged"
@@ -9207,6 +10369,26 @@
       "read": {
         "support_level": "untriaged"
       },
+      "releaseLock": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ReadableStream": {
+    "members": {
+      "cancel": {
+        "support_level": "untriaged"
+      },
+      "closed": {
+        "support_level": "untriaged"
+      },
+      "getReader": {
+        "support_level": "untriaged"
+      },
+      "read": {
+        "support_level": "untriaged"
+      },
       "state": {
         "support_level": "untriaged"
       },
@@ -9216,6 +10398,23 @@
     },
     "support_level": "untriaged"
   },
+  "ReadableStreamReader": {
+    "members": {
+      "cancel": {
+        "support_level": "untriaged"
+      },
+      "closed": {
+        "support_level": "untriaged"
+      },
+      "read": {
+        "support_level": "untriaged"
+      },
+      "releaseLock": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Rect": {
     "comment": "http://dev.w3.org/csswg/cssom/",
     "dart_action": "suppress",
@@ -9229,6 +10428,7 @@
   },
   "RelatedEvent": {
     "members": {
+      "RelatedEvent": {},
       "relatedTarget": {
         "support_level": "untriaged"
       }
@@ -9241,6 +10441,9 @@
       "clone": {
         "support_level": "untriaged"
       },
+      "context": {
+        "support_level": "untriaged"
+      },
       "credentials": {
         "support_level": "untriaged"
       },
@@ -9941,9 +11144,15 @@
     "comment": "http://www.w3.org/TR/SVG/types.html#InterfaceSVGElement",
     "dart_action": "unstable",
     "members": {
+      "blur": {
+        "support_level": "untriaged"
+      },
       "className": {
         "support_level": "untriaged"
       },
+      "focus": {
+        "support_level": "untriaged"
+      },
       "getPresentationAttribute": {
         "support_level": "untriaged"
       },
@@ -10838,6 +12047,12 @@
         "comment": "http://www.w3.org/TR/SVG/filters.html#InterfaceSVGFilterPrimitiveStandardAttributes"
       },
       "in1": {},
+      "kernelUnitLengthX": {
+        "support_level": "untriaged"
+      },
+      "kernelUnitLengthY": {
+        "support_level": "untriaged"
+      },
       "result": {
         "comment": "http://www.w3.org/TR/SVG/filters.html#InterfaceSVGFilterPrimitiveStandardAttributes"
       },
@@ -12922,6 +14137,45 @@
     },
     "support_level": "experimental"
   },
+  "ScrollState": {
+    "members": {
+      "ScrollState": {},
+      "consumeDelta": {
+        "support_level": "untriaged"
+      },
+      "deltaGranularity": {
+        "support_level": "untriaged"
+      },
+      "deltaX": {
+        "support_level": "untriaged"
+      },
+      "deltaY": {
+        "support_level": "untriaged"
+      },
+      "fromUserInput": {
+        "support_level": "untriaged"
+      },
+      "inInertialPhase": {
+        "support_level": "untriaged"
+      },
+      "isBeginning": {
+        "support_level": "untriaged"
+      },
+      "isEnding": {
+        "support_level": "untriaged"
+      },
+      "shouldPropagate": {
+        "support_level": "untriaged"
+      },
+      "velocityX": {
+        "support_level": "untriaged"
+      },
+      "velocityY": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "SecurityPolicy": {
     "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicy",
     "members": {
@@ -12946,6 +14200,7 @@
   "SecurityPolicyViolationEvent": {
     "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicyviolationevent-events",
     "members": {
+      "SecurityPolicyViolationEvent": {},
       "blockedURI": {},
       "columnNumber": {},
       "documentURI": {},
@@ -13013,6 +14268,58 @@
     },
     "support_level": "stable"
   },
+  "ServicePort": {
+    "members": {
+      "close": {
+        "support_level": "untriaged"
+      },
+      "data": {
+        "support_level": "untriaged"
+      },
+      "name": {
+        "support_level": "untriaged"
+      },
+      "postMessage": {
+        "support_level": "untriaged"
+      },
+      "targetURL": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ServicePortCollection": {
+    "members": {
+      "connect": {
+        "support_level": "untriaged"
+      },
+      "match": {
+        "support_level": "untriaged"
+      },
+      "matchAll": {
+        "support_level": "untriaged"
+      },
+      "onmessage": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ServicePortConnectEvent": {
+    "members": {
+      "ServicePortConnectEvent": {},
+      "origin": {
+        "support_level": "untriaged"
+      },
+      "respondWith": {
+        "support_level": "untriaged"
+      },
+      "targetURL": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ServiceWorker": {
     "members": {},
     "support_level": "untriaged"
@@ -13050,9 +14357,15 @@
       "getRegistration": {
         "support_level": "untriaged"
       },
+      "getRegistrations": {
+        "support_level": "untriaged"
+      },
       "installing": {
         "support_level": "untriaged"
       },
+      "onmessage": {
+        "support_level": "untriaged"
+      },
       "ready": {
         "support_level": "untriaged"
       },
@@ -13088,8 +14401,38 @@
       "onmessage": {
         "support_level": "untriaged"
       },
+      "ports": {
+        "support_level": "untriaged"
+      },
+      "registration": {
+        "support_level": "untriaged"
+      },
       "scope": {
         "support_level": "untriaged"
+      },
+      "skipWaiting": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ServiceWorkerMessageEvent": {
+    "members": {
+      "ServiceWorkerMessageEvent": {},
+      "data": {
+        "support_level": "untriaged"
+      },
+      "lastEventId": {
+        "support_level": "untriaged"
+      },
+      "origin": {
+        "support_level": "untriaged"
+      },
+      "ports": {
+        "support_level": "untriaged"
+      },
+      "source": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -13099,15 +14442,36 @@
       "active": {
         "support_level": "untriaged"
       },
+      "geofencing": {
+        "support_level": "untriaged"
+      },
+      "getNotifications": {
+        "support_level": "untriaged"
+      },
       "installing": {
         "support_level": "untriaged"
       },
+      "periodicSync": {
+        "support_level": "untriaged"
+      },
+      "pushManager": {
+        "support_level": "untriaged"
+      },
       "scope": {
         "support_level": "untriaged"
       },
+      "showNotification": {
+        "support_level": "untriaged"
+      },
+      "sync": {
+        "support_level": "untriaged"
+      },
       "unregister": {
         "support_level": "untriaged"
       },
+      "update": {
+        "support_level": "untriaged"
+      },
       "waiting": {
         "support_level": "untriaged"
       }
@@ -13120,7 +14484,13 @@
       "activeElement": {},
       "applyAuthorStyles": {},
       "cloneNode": {},
+      "delegatesFocus": {
+        "support_level": "untriaged"
+      },
       "elementFromPoint": {},
+      "elementsFromPoint": {
+        "support_level": "untriaged"
+      },
       "getElementById": {},
       "getElementsByClassName": {},
       "getElementsByTagName": {},
@@ -13140,6 +14510,14 @@
     },
     "support_level": "experimental"
   },
+  "SharedArrayBuffer": {
+    "members": {
+      "byteLength": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "SharedWorker": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface",
     "members": {
@@ -13228,6 +14606,9 @@
         "support_level": "untriaged"
       },
       "timestampOffset": {},
+      "trackDefaults": {
+        "support_level": "untriaged"
+      },
       "updating": {
         "support_level": "untriaged"
       }
@@ -13311,6 +14692,9 @@
       "SpeechRecognition": {},
       "abort": {},
       "addEventListener": {},
+      "audioTrack": {
+        "support_level": "untriaged"
+      },
       "continuous": {},
       "dispatchEvent": {},
       "grammars": {},
@@ -13329,6 +14713,9 @@
       "onspeechstart": {},
       "onstart": {},
       "removeEventListener": {},
+      "serviceURI": {
+        "support_level": "untriaged"
+      },
       "start": {},
       "stop": {}
     },
@@ -13345,6 +14732,7 @@
   "SpeechRecognitionError": {
     "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-error",
     "members": {
+      "SpeechRecognitionError": {},
       "error": {},
       "message": {}
     },
@@ -13353,6 +14741,7 @@
   "SpeechRecognitionEvent": {
     "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-event",
     "members": {
+      "SpeechRecognitionEvent": {},
       "emma": {},
       "interpretation": {},
       "resultIndex": {},
@@ -13405,7 +14794,10 @@
     "members": {
       "charIndex": {},
       "elapsedTime": {},
-      "name": {}
+      "name": {},
+      "utterance": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -13452,6 +14844,33 @@
     },
     "support_level": "experimental"
   },
+  "StashedMessagePort": {
+    "members": {
+      "name": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "StashedPortCollection": {
+    "members": {
+      "add": {
+        "support_level": "untriaged"
+      },
+      "onmessage": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "StereoPannerNode": {
+    "members": {
+      "pan": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Storage": {
     "comment": "http://www.w3.org/TR/webstorage/#the-storage-interface",
     "dart_action": "unstable",
@@ -13480,6 +14899,7 @@
     "comment": "http://www.w3.org/TR/webstorage/#the-storage-event",
     "dart_action": "unstable",
     "members": {
+      "StorageEvent": {},
       "initStorageEvent": {},
       "key": {},
       "newValue": {},
@@ -13609,6 +15029,43 @@
     },
     "support_level": "untriaged"
   },
+  "SyncEvent": {
+    "members": {
+      "SyncEvent": {},
+      "registration": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "SyncManager": {
+    "members": {
+      "getRegistration": {
+        "support_level": "untriaged"
+      },
+      "getRegistrations": {
+        "support_level": "untriaged"
+      },
+      "permissionState": {
+        "support_level": "untriaged"
+      },
+      "register": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "SyncRegistration": {
+    "members": {
+      "tag": {
+        "support_level": "untriaged"
+      },
+      "unregister": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Text": {
     "comment": "http://dom.spec.whatwg.org/#interface-text",
     "members": {
@@ -13919,6 +15376,9 @@
       "radiusY": {
         "support_level": "untriaged"
       },
+      "rotationAngle": {
+        "support_level": "untriaged"
+      },
       "screenX": {},
       "screenY": {},
       "target": {},
@@ -13959,10 +15419,44 @@
     },
     "support_level": "experimental"
   },
+  "TrackDefault": {
+    "members": {
+      "TrackDefault": {},
+      "byteStreamTrackID": {
+        "support_level": "untriaged"
+      },
+      "kinds": {
+        "support_level": "untriaged"
+      },
+      "label": {
+        "support_level": "untriaged"
+      },
+      "language": {
+        "support_level": "untriaged"
+      },
+      "type": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "TrackDefaultList": {
+    "members": {
+      "TrackDefaultList": {},
+      "item": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "TrackEvent": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#trackevent",
     "dart_action": "unstable",
     "members": {
+      "TrackEvent": {},
       "track": {}
     },
     "support_level": "experimental"
@@ -13970,6 +15464,7 @@
   "TransitionEvent": {
     "comment": "http://dev.w3.org/csswg/css-transitions/#Events-TransitionEvent",
     "members": {
+      "TransitionEvent": {},
       "elapsedTime": {},
       "propertyName": {},
       "pseudoElement": {}
@@ -14002,6 +15497,7 @@
   "UIEvent": {
     "comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-UIEvent",
     "members": {
+      "UIEvent": {},
       "charCode": {
         "comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#legacy-key-attributes",
         "dart_action": "unstable",
@@ -14034,6 +15530,9 @@
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
+      "sourceDevice": {
+        "support_level": "untriaged"
+      },
       "view": {},
       "which": {
         "comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#legacy-key-attributes",
@@ -14211,6 +15710,87 @@
     },
     "support_level": "stable"
   },
+  "VRDevice": {
+    "members": {
+      "deviceId": {
+        "support_level": "untriaged"
+      },
+      "deviceName": {
+        "support_level": "untriaged"
+      },
+      "hardwareUnitId": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VREyeParameters": {
+    "members": {
+      "currentFieldOfView": {
+        "support_level": "untriaged"
+      },
+      "eyeTranslation": {
+        "support_level": "untriaged"
+      },
+      "maximumFieldOfView": {
+        "support_level": "untriaged"
+      },
+      "minimumFieldOfView": {
+        "support_level": "untriaged"
+      },
+      "recommendedFieldOfView": {
+        "support_level": "untriaged"
+      },
+      "renderRect": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRFieldOfView": {
+    "members": {
+      "VRFieldOfView": {},
+      "downDegrees": {
+        "support_level": "untriaged"
+      },
+      "leftDegrees": {
+        "support_level": "untriaged"
+      },
+      "rightDegrees": {
+        "support_level": "untriaged"
+      },
+      "upDegrees": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRPositionState": {
+    "members": {
+      "angularAcceleration": {
+        "support_level": "untriaged"
+      },
+      "angularVelocity": {
+        "support_level": "untriaged"
+      },
+      "linearAcceleration": {
+        "support_level": "untriaged"
+      },
+      "linearVelocity": {
+        "support_level": "untriaged"
+      },
+      "orientation": {
+        "support_level": "untriaged"
+      },
+      "position": {
+        "support_level": "untriaged"
+      },
+      "timeStamp": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "VTTCue": {
     "members": {
       "VTTCue": {},
@@ -14301,6 +15881,9 @@
       "rangeUnderflow": {},
       "stepMismatch": {},
       "tooLong": {},
+      "tooShort": {
+        "support_level": "untriaged"
+      },
       "typeMismatch": {},
       "valid": {},
       "valueMissing": {}
@@ -14385,6 +15968,1587 @@
     "members": {},
     "support_level": "experimental"
   },
+  "WebGL2RenderingContext": {
+    "members": {
+      "ACTIVE_ATTRIBUTES": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_UNIFORMS": {
+        "support_level": "untriaged"
+      },
+      "ALIASED_LINE_WIDTH_RANGE": {
+        "support_level": "untriaged"
+      },
+      "ALIASED_POINT_SIZE_RANGE": {
+        "support_level": "untriaged"
+      },
+      "ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ALPHA_BITS": {
+        "support_level": "untriaged"
+      },
+      "ALWAYS": {
+        "support_level": "untriaged"
+      },
+      "ARRAY_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "ATTACHED_SHADERS": {
+        "support_level": "untriaged"
+      },
+      "BACK": {
+        "support_level": "untriaged"
+      },
+      "BLEND": {
+        "support_level": "untriaged"
+      },
+      "BLEND_COLOR": {
+        "support_level": "untriaged"
+      },
+      "BLEND_DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_DST_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLEND_SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_SRC_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLUE_BITS": {
+        "support_level": "untriaged"
+      },
+      "BOOL": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC2": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC3": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC4": {
+        "support_level": "untriaged"
+      },
+      "BROWSER_DEFAULT_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "BUFFER_USAGE": {
+        "support_level": "untriaged"
+      },
+      "BYTE": {
+        "support_level": "untriaged"
+      },
+      "CCW": {
+        "support_level": "untriaged"
+      },
+      "CLAMP_TO_EDGE": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT0": {
+        "support_level": "untriaged"
+      },
+      "COLOR_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "COLOR_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "COLOR_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "COMPILE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_TEXTURE_FORMATS": {
+        "support_level": "untriaged"
+      },
+      "CONSTANT_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "CONSTANT_COLOR": {
+        "support_level": "untriaged"
+      },
+      "CONTEXT_LOST_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "CULL_FACE": {
+        "support_level": "untriaged"
+      },
+      "CULL_FACE_MODE": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_PROGRAM": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_VERTEX_ATTRIB": {
+        "support_level": "untriaged"
+      },
+      "CW": {
+        "support_level": "untriaged"
+      },
+      "DECR": {
+        "support_level": "untriaged"
+      },
+      "DECR_WRAP": {
+        "support_level": "untriaged"
+      },
+      "DELETE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_BITS": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT16": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_FUNC": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_RANGE": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_STENCIL": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_STENCIL_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_TEST": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "DITHER": {
+        "support_level": "untriaged"
+      },
+      "DONT_CARE": {
+        "support_level": "untriaged"
+      },
+      "DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "DST_COLOR": {
+        "support_level": "untriaged"
+      },
+      "DYNAMIC_DRAW": {
+        "support_level": "untriaged"
+      },
+      "ELEMENT_ARRAY_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "ELEMENT_ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "EQUAL": {
+        "support_level": "untriaged"
+      },
+      "FASTEST": {
+        "support_level": "untriaged"
+      },
+      "FLOAT": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "FRAGMENT_SHADER": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_COMPLETE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_DIMENSIONS": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_UNSUPPORTED": {
+        "support_level": "untriaged"
+      },
+      "FRONT": {
+        "support_level": "untriaged"
+      },
+      "FRONT_AND_BACK": {
+        "support_level": "untriaged"
+      },
+      "FRONT_FACE": {
+        "support_level": "untriaged"
+      },
+      "FUNC_ADD": {
+        "support_level": "untriaged"
+      },
+      "FUNC_REVERSE_SUBTRACT": {
+        "support_level": "untriaged"
+      },
+      "FUNC_SUBTRACT": {
+        "support_level": "untriaged"
+      },
+      "GENERATE_MIPMAP_HINT": {
+        "support_level": "untriaged"
+      },
+      "GEQUAL": {
+        "support_level": "untriaged"
+      },
+      "GREATER": {
+        "support_level": "untriaged"
+      },
+      "GREEN_BITS": {
+        "support_level": "untriaged"
+      },
+      "HIGH_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "HIGH_INT": {
+        "support_level": "untriaged"
+      },
+      "IMPLEMENTATION_COLOR_READ_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "IMPLEMENTATION_COLOR_READ_TYPE": {
+        "support_level": "untriaged"
+      },
+      "INCR": {
+        "support_level": "untriaged"
+      },
+      "INCR_WRAP": {
+        "support_level": "untriaged"
+      },
+      "INT": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "INVALID_ENUM": {
+        "support_level": "untriaged"
+      },
+      "INVALID_FRAMEBUFFER_OPERATION": {
+        "support_level": "untriaged"
+      },
+      "INVALID_OPERATION": {
+        "support_level": "untriaged"
+      },
+      "INVALID_VALUE": {
+        "support_level": "untriaged"
+      },
+      "INVERT": {
+        "support_level": "untriaged"
+      },
+      "KEEP": {
+        "support_level": "untriaged"
+      },
+      "LEQUAL": {
+        "support_level": "untriaged"
+      },
+      "LESS": {
+        "support_level": "untriaged"
+      },
+      "LINEAR": {
+        "support_level": "untriaged"
+      },
+      "LINEAR_MIPMAP_LINEAR": {
+        "support_level": "untriaged"
+      },
+      "LINEAR_MIPMAP_NEAREST": {
+        "support_level": "untriaged"
+      },
+      "LINES": {
+        "support_level": "untriaged"
+      },
+      "LINE_LOOP": {
+        "support_level": "untriaged"
+      },
+      "LINE_STRIP": {
+        "support_level": "untriaged"
+      },
+      "LINE_WIDTH": {
+        "support_level": "untriaged"
+      },
+      "LINK_STATUS": {
+        "support_level": "untriaged"
+      },
+      "LOW_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "LOW_INT": {
+        "support_level": "untriaged"
+      },
+      "LUMINANCE": {
+        "support_level": "untriaged"
+      },
+      "LUMINANCE_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_CUBE_MAP_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_RENDERBUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_VARYING_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VIEWPORT_DIMS": {
+        "support_level": "untriaged"
+      },
+      "MEDIUM_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "MEDIUM_INT": {
+        "support_level": "untriaged"
+      },
+      "MIRRORED_REPEAT": {
+        "support_level": "untriaged"
+      },
+      "NEAREST": {
+        "support_level": "untriaged"
+      },
+      "NEAREST_MIPMAP_LINEAR": {
+        "support_level": "untriaged"
+      },
+      "NEAREST_MIPMAP_NEAREST": {
+        "support_level": "untriaged"
+      },
+      "NEVER": {
+        "support_level": "untriaged"
+      },
+      "NICEST": {
+        "support_level": "untriaged"
+      },
+      "NONE": {
+        "support_level": "untriaged"
+      },
+      "NOTEQUAL": {
+        "support_level": "untriaged"
+      },
+      "NO_ERROR": {
+        "support_level": "untriaged"
+      },
+      "ONE": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_CONSTANT_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_CONSTANT_COLOR": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_DST_COLOR": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_SRC_COLOR": {
+        "support_level": "untriaged"
+      },
+      "OUT_OF_MEMORY": {
+        "support_level": "untriaged"
+      },
+      "PACK_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "POINTS": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_FACTOR": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_FILL": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_UNITS": {
+        "support_level": "untriaged"
+      },
+      "RED_BITS": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_ALPHA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_BLUE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_DEPTH_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_GREEN_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_HEIGHT": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_INTERNAL_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_RED_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_STENCIL_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_WIDTH": {
+        "support_level": "untriaged"
+      },
+      "RENDERER": {
+        "support_level": "untriaged"
+      },
+      "REPEAT": {
+        "support_level": "untriaged"
+      },
+      "REPLACE": {
+        "support_level": "untriaged"
+      },
+      "RGB": {
+        "support_level": "untriaged"
+      },
+      "RGB565": {
+        "support_level": "untriaged"
+      },
+      "RGB5_A1": {
+        "support_level": "untriaged"
+      },
+      "RGBA": {
+        "support_level": "untriaged"
+      },
+      "RGBA4": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_ALPHA_TO_COVERAGE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_BUFFERS": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE_INVERT": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE_VALUE": {
+        "support_level": "untriaged"
+      },
+      "SCISSOR_BOX": {
+        "support_level": "untriaged"
+      },
+      "SCISSOR_TEST": {
+        "support_level": "untriaged"
+      },
+      "SHADER_TYPE": {
+        "support_level": "untriaged"
+      },
+      "SHADING_LANGUAGE_VERSION": {
+        "support_level": "untriaged"
+      },
+      "SHORT": {
+        "support_level": "untriaged"
+      },
+      "SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "SRC_ALPHA_SATURATE": {
+        "support_level": "untriaged"
+      },
+      "SRC_COLOR": {
+        "support_level": "untriaged"
+      },
+      "STATIC_DRAW": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_FUNC": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_PASS_DEPTH_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_PASS_DEPTH_PASS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_REF": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_VALUE_MASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BITS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_FUNC": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_INDEX": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_INDEX8": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_PASS_DEPTH_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_PASS_DEPTH_PASS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_REF": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_TEST": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_VALUE_MASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "STREAM_DRAW": {
+        "support_level": "untriaged"
+      },
+      "SUBPIXEL_BITS": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE0": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE1": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE10": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE11": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE12": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE13": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE14": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE15": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE16": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE17": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE18": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE19": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE2": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE20": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE21": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE22": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE23": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE24": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE25": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE26": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE27": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE28": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE29": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE3": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE30": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE31": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE4": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE5": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE6": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE7": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE8": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE9": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_2D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_2D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_CUBE_MAP": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_X": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_Y": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_Z": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_X": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_Y": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_Z": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAG_FILTER": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MIN_FILTER": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_S": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_T": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLES": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLE_FAN": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLE_STRIP": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_COLORSPACE_CONVERSION_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_FLIP_Y_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_PREMULTIPLY_ALPHA_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_BYTE": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_4_4_4_4": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_5_5_5_1": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_5_6_5": {
+        "support_level": "untriaged"
+      },
+      "VALIDATE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "VENDOR": {
+        "support_level": "untriaged"
+      },
+      "VERSION": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_ENABLED": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_NORMALIZED": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_POINTER": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_SIZE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_TYPE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_SHADER": {
+        "support_level": "untriaged"
+      },
+      "VIEWPORT": {
+        "support_level": "untriaged"
+      },
+      "ZERO": {
+        "support_level": "untriaged"
+      },
+      "activeTexture": {
+        "support_level": "untriaged"
+      },
+      "attachShader": {
+        "support_level": "untriaged"
+      },
+      "beginQuery": {
+        "support_level": "untriaged"
+      },
+      "beginTransformFeedback": {
+        "support_level": "untriaged"
+      },
+      "bindAttribLocation": {
+        "support_level": "untriaged"
+      },
+      "bindBuffer": {
+        "support_level": "untriaged"
+      },
+      "bindBufferBase": {
+        "support_level": "untriaged"
+      },
+      "bindBufferRange": {
+        "support_level": "untriaged"
+      },
+      "bindFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "bindRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "bindSampler": {
+        "support_level": "untriaged"
+      },
+      "bindTexture": {
+        "support_level": "untriaged"
+      },
+      "bindTransformFeedback": {
+        "support_level": "untriaged"
+      },
+      "bindVertexArray": {
+        "support_level": "untriaged"
+      },
+      "blendColor": {
+        "support_level": "untriaged"
+      },
+      "blendEquation": {
+        "support_level": "untriaged"
+      },
+      "blendEquationSeparate": {
+        "support_level": "untriaged"
+      },
+      "blendFunc": {
+        "support_level": "untriaged"
+      },
+      "blendFuncSeparate": {
+        "support_level": "untriaged"
+      },
+      "blitFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "bufferData": {
+        "support_level": "untriaged"
+      },
+      "bufferSubData": {
+        "support_level": "untriaged"
+      },
+      "canvas": {
+        "support_level": "untriaged"
+      },
+      "checkFramebufferStatus": {
+        "support_level": "untriaged"
+      },
+      "clear": {
+        "support_level": "untriaged"
+      },
+      "clearBufferfi": {
+        "support_level": "untriaged"
+      },
+      "clearBufferfv": {
+        "support_level": "untriaged"
+      },
+      "clearBufferiv": {
+        "support_level": "untriaged"
+      },
+      "clearBufferuiv": {
+        "support_level": "untriaged"
+      },
+      "clearColor": {
+        "support_level": "untriaged"
+      },
+      "clearDepth": {
+        "support_level": "untriaged"
+      },
+      "clearStencil": {
+        "support_level": "untriaged"
+      },
+      "clientWaitSync": {
+        "support_level": "untriaged"
+      },
+      "colorMask": {
+        "support_level": "untriaged"
+      },
+      "compileShader": {
+        "support_level": "untriaged"
+      },
+      "compressedTexImage2D": {
+        "support_level": "untriaged"
+      },
+      "compressedTexImage3D": {
+        "support_level": "untriaged"
+      },
+      "compressedTexSubImage2D": {
+        "support_level": "untriaged"
+      },
+      "compressedTexSubImage3D": {
+        "support_level": "untriaged"
+      },
+      "copyBufferSubData": {
+        "support_level": "untriaged"
+      },
+      "copyTexImage2D": {
+        "support_level": "untriaged"
+      },
+      "copyTexSubImage2D": {
+        "support_level": "untriaged"
+      },
+      "copyTexSubImage3D": {
+        "support_level": "untriaged"
+      },
+      "createBuffer": {
+        "support_level": "untriaged"
+      },
+      "createFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "createProgram": {
+        "support_level": "untriaged"
+      },
+      "createQuery": {
+        "support_level": "untriaged"
+      },
+      "createRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "createSampler": {
+        "support_level": "untriaged"
+      },
+      "createShader": {
+        "support_level": "untriaged"
+      },
+      "createTexture": {
+        "support_level": "untriaged"
+      },
+      "createTransformFeedback": {
+        "support_level": "untriaged"
+      },
+      "createVertexArray": {
+        "support_level": "untriaged"
+      },
+      "cullFace": {
+        "support_level": "untriaged"
+      },
+      "deleteBuffer": {
+        "support_level": "untriaged"
+      },
+      "deleteFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "deleteProgram": {
+        "support_level": "untriaged"
+      },
+      "deleteQuery": {
+        "support_level": "untriaged"
+      },
+      "deleteRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "deleteSampler": {
+        "support_level": "untriaged"
+      },
+      "deleteShader": {
+        "support_level": "untriaged"
+      },
+      "deleteSync": {
+        "support_level": "untriaged"
+      },
+      "deleteTexture": {
+        "support_level": "untriaged"
+      },
+      "deleteTransformFeedback": {
+        "support_level": "untriaged"
+      },
+      "deleteVertexArray": {
+        "support_level": "untriaged"
+      },
+      "depthFunc": {
+        "support_level": "untriaged"
+      },
+      "depthMask": {
+        "support_level": "untriaged"
+      },
+      "depthRange": {
+        "support_level": "untriaged"
+      },
+      "detachShader": {
+        "support_level": "untriaged"
+      },
+      "disable": {
+        "support_level": "untriaged"
+      },
+      "disableVertexAttribArray": {
+        "support_level": "untriaged"
+      },
+      "drawArrays": {
+        "support_level": "untriaged"
+      },
+      "drawArraysInstanced": {
+        "support_level": "untriaged"
+      },
+      "drawBuffers": {
+        "support_level": "untriaged"
+      },
+      "drawElements": {
+        "support_level": "untriaged"
+      },
+      "drawElementsInstanced": {
+        "support_level": "untriaged"
+      },
+      "drawRangeElements": {
+        "support_level": "untriaged"
+      },
+      "drawingBufferHeight": {
+        "support_level": "untriaged"
+      },
+      "drawingBufferWidth": {
+        "support_level": "untriaged"
+      },
+      "enable": {
+        "support_level": "untriaged"
+      },
+      "enableVertexAttribArray": {
+        "support_level": "untriaged"
+      },
+      "endQuery": {
+        "support_level": "untriaged"
+      },
+      "endTransformFeedback": {
+        "support_level": "untriaged"
+      },
+      "fenceSync": {
+        "support_level": "untriaged"
+      },
+      "finish": {
+        "support_level": "untriaged"
+      },
+      "flush": {
+        "support_level": "untriaged"
+      },
+      "framebufferRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "framebufferTexture2D": {
+        "support_level": "untriaged"
+      },
+      "framebufferTextureLayer": {
+        "support_level": "untriaged"
+      },
+      "frontFace": {
+        "support_level": "untriaged"
+      },
+      "generateMipmap": {
+        "support_level": "untriaged"
+      },
+      "getActiveAttrib": {
+        "support_level": "untriaged"
+      },
+      "getActiveUniform": {
+        "support_level": "untriaged"
+      },
+      "getActiveUniformBlockName": {
+        "support_level": "untriaged"
+      },
+      "getActiveUniformBlockParameter": {
+        "support_level": "untriaged"
+      },
+      "getActiveUniforms": {
+        "support_level": "untriaged"
+      },
+      "getAttachedShaders": {
+        "support_level": "untriaged"
+      },
+      "getAttribLocation": {
+        "support_level": "untriaged"
+      },
+      "getBufferParameter": {
+        "support_level": "untriaged"
+      },
+      "getBufferSubData": {
+        "support_level": "untriaged"
+      },
+      "getContextAttributes": {
+        "support_level": "untriaged"
+      },
+      "getError": {
+        "support_level": "untriaged"
+      },
+      "getExtension": {
+        "support_level": "untriaged"
+      },
+      "getFragDataLocation": {
+        "support_level": "untriaged"
+      },
+      "getFramebufferAttachmentParameter": {
+        "support_level": "untriaged"
+      },
+      "getIndexedParameter": {
+        "support_level": "untriaged"
+      },
+      "getInternalformatParameter": {
+        "support_level": "untriaged"
+      },
+      "getParameter": {
+        "support_level": "untriaged"
+      },
+      "getProgramInfoLog": {
+        "support_level": "untriaged"
+      },
+      "getProgramParameter": {
+        "support_level": "untriaged"
+      },
+      "getQuery": {
+        "support_level": "untriaged"
+      },
+      "getQueryParameter": {
+        "support_level": "untriaged"
+      },
+      "getRenderbufferParameter": {
+        "support_level": "untriaged"
+      },
+      "getSamplerParameter": {
+        "support_level": "untriaged"
+      },
+      "getShaderInfoLog": {
+        "support_level": "untriaged"
+      },
+      "getShaderParameter": {
+        "support_level": "untriaged"
+      },
+      "getShaderPrecisionFormat": {
+        "support_level": "untriaged"
+      },
+      "getShaderSource": {
+        "support_level": "untriaged"
+      },
+      "getSupportedExtensions": {
+        "support_level": "untriaged"
+      },
+      "getSyncParameter": {
+        "support_level": "untriaged"
+      },
+      "getTexParameter": {
+        "support_level": "untriaged"
+      },
+      "getTransformFeedbackVarying": {
+        "support_level": "untriaged"
+      },
+      "getUniform": {
+        "support_level": "untriaged"
+      },
+      "getUniformBlockIndex": {
+        "support_level": "untriaged"
+      },
+      "getUniformIndices": {
+        "support_level": "untriaged"
+      },
+      "getUniformLocation": {
+        "support_level": "untriaged"
+      },
+      "getVertexAttrib": {
+        "support_level": "untriaged"
+      },
+      "getVertexAttribOffset": {
+        "support_level": "untriaged"
+      },
+      "hint": {
+        "support_level": "untriaged"
+      },
+      "invalidateFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "invalidateSubFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "isBuffer": {
+        "support_level": "untriaged"
+      },
+      "isContextLost": {
+        "support_level": "untriaged"
+      },
+      "isEnabled": {
+        "support_level": "untriaged"
+      },
+      "isFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "isProgram": {
+        "support_level": "untriaged"
+      },
+      "isQuery": {
+        "support_level": "untriaged"
+      },
+      "isRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "isSampler": {
+        "support_level": "untriaged"
+      },
+      "isShader": {
+        "support_level": "untriaged"
+      },
+      "isSync": {
+        "support_level": "untriaged"
+      },
+      "isTexture": {
+        "support_level": "untriaged"
+      },
+      "isTransformFeedback": {
+        "support_level": "untriaged"
+      },
+      "isVertexArray": {
+        "support_level": "untriaged"
+      },
+      "lineWidth": {
+        "support_level": "untriaged"
+      },
+      "linkProgram": {
+        "support_level": "untriaged"
+      },
+      "pauseTransformFeedback": {
+        "support_level": "untriaged"
+      },
+      "pixelStorei": {
+        "support_level": "untriaged"
+      },
+      "polygonOffset": {
+        "support_level": "untriaged"
+      },
+      "readBuffer": {
+        "support_level": "untriaged"
+      },
+      "readPixels": {
+        "support_level": "untriaged"
+      },
+      "renderbufferStorage": {
+        "support_level": "untriaged"
+      },
+      "renderbufferStorageMultisample": {
+        "support_level": "untriaged"
+      },
+      "resumeTransformFeedback": {
+        "support_level": "untriaged"
+      },
+      "sampleCoverage": {
+        "support_level": "untriaged"
+      },
+      "samplerParameterf": {
+        "support_level": "untriaged"
+      },
+      "samplerParameteri": {
+        "support_level": "untriaged"
+      },
+      "scissor": {
+        "support_level": "untriaged"
+      },
+      "shaderSource": {
+        "support_level": "untriaged"
+      },
+      "stencilFunc": {
+        "support_level": "untriaged"
+      },
+      "stencilFuncSeparate": {
+        "support_level": "untriaged"
+      },
+      "stencilMask": {
+        "support_level": "untriaged"
+      },
+      "stencilMaskSeparate": {
+        "support_level": "untriaged"
+      },
+      "stencilOp": {
+        "support_level": "untriaged"
+      },
+      "stencilOpSeparate": {
+        "support_level": "untriaged"
+      },
+      "texImage2D": {
+        "support_level": "untriaged"
+      },
+      "texImage3D": {
+        "support_level": "untriaged"
+      },
+      "texParameterf": {
+        "support_level": "untriaged"
+      },
+      "texParameteri": {
+        "support_level": "untriaged"
+      },
+      "texStorage2D": {
+        "support_level": "untriaged"
+      },
+      "texStorage3D": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2D": {
+        "support_level": "untriaged"
+      },
+      "texSubImage3D": {
+        "support_level": "untriaged"
+      },
+      "transformFeedbackVaryings": {
+        "support_level": "untriaged"
+      },
+      "uniform1f": {
+        "support_level": "untriaged"
+      },
+      "uniform1fv": {
+        "support_level": "untriaged"
+      },
+      "uniform1i": {
+        "support_level": "untriaged"
+      },
+      "uniform1iv": {
+        "support_level": "untriaged"
+      },
+      "uniform1ui": {
+        "support_level": "untriaged"
+      },
+      "uniform1uiv": {
+        "support_level": "untriaged"
+      },
+      "uniform2f": {
+        "support_level": "untriaged"
+      },
+      "uniform2fv": {
+        "support_level": "untriaged"
+      },
+      "uniform2i": {
+        "support_level": "untriaged"
+      },
+      "uniform2iv": {
+        "support_level": "untriaged"
+      },
+      "uniform2ui": {
+        "support_level": "untriaged"
+      },
+      "uniform2uiv": {
+        "support_level": "untriaged"
+      },
+      "uniform3f": {
+        "support_level": "untriaged"
+      },
+      "uniform3fv": {
+        "support_level": "untriaged"
+      },
+      "uniform3i": {
+        "support_level": "untriaged"
+      },
+      "uniform3iv": {
+        "support_level": "untriaged"
+      },
+      "uniform3ui": {
+        "support_level": "untriaged"
+      },
+      "uniform3uiv": {
+        "support_level": "untriaged"
+      },
+      "uniform4f": {
+        "support_level": "untriaged"
+      },
+      "uniform4fv": {
+        "support_level": "untriaged"
+      },
+      "uniform4i": {
+        "support_level": "untriaged"
+      },
+      "uniform4iv": {
+        "support_level": "untriaged"
+      },
+      "uniform4ui": {
+        "support_level": "untriaged"
+      },
+      "uniform4uiv": {
+        "support_level": "untriaged"
+      },
+      "uniformBlockBinding": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix2fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix2x3fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix2x4fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix3fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix3x2fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix3x4fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix4fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix4x2fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix4x3fv": {
+        "support_level": "untriaged"
+      },
+      "useProgram": {
+        "support_level": "untriaged"
+      },
+      "validateProgram": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib1f": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib1fv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib2f": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib2fv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib3f": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib3fv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib4f": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib4fv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttribDivisor": {
+        "support_level": "untriaged"
+      },
+      "vertexAttribI4i": {
+        "support_level": "untriaged"
+      },
+      "vertexAttribI4iv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttribI4ui": {
+        "support_level": "untriaged"
+      },
+      "vertexAttribI4uiv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttribIPointer": {
+        "support_level": "untriaged"
+      },
+      "vertexAttribPointer": {
+        "support_level": "untriaged"
+      },
+      "viewport": {
+        "support_level": "untriaged"
+      },
+      "waitSync": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "WebGL2RenderingContextBase": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "WebGLActiveInfo": {
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#5.11",
     "dart_action": "unstable",
@@ -14460,6 +17624,7 @@
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#WEBGLCONTEXTEVENT",
     "dart_action": "unstable",
     "members": {
+      "WebGLContextEvent": {},
       "statusMessage": {}
     },
     "support_level": "stable"
@@ -14551,6 +17716,10 @@
     "members": {},
     "support_level": "stable"
   },
+  "WebGLQuery": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "WebGLRenderbuffer": {
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#5.7",
     "dart_action": "unstable",
@@ -16380,6 +19549,10 @@
     },
     "support_level": "untriaged"
   },
+  "WebGLSampler": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "WebGLShader": {
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#5.8",
     "members": {},
@@ -16394,16 +19567,28 @@
     },
     "support_level": "stable"
   },
+  "WebGLSync": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "WebGLTexture": {
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#5.9",
     "members": {},
     "support_level": "stable"
   },
+  "WebGLTransformFeedback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "WebGLUniformLocation": {
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#5.10",
     "members": {},
     "support_level": "stable"
   },
+  "WebGLVertexArrayObject": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "WebGLVertexArrayObjectOES": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/",
     "dart_action": "experimental",
@@ -16647,6 +19832,7 @@
       "DOM_DELTA_LINE": {},
       "DOM_DELTA_PAGE": {},
       "DOM_DELTA_PIXEL": {},
+      "WheelEvent": {},
       "deltaMode": {},
       "deltaX": {},
       "deltaY": {},
@@ -16675,6 +19861,12 @@
       },
       "Window": {},
       "__getter__": {},
+      "_setInterval_String": {
+        "support_level": "untriaged"
+      },
+      "_setTimeout_String": {
+        "support_level": "untriaged"
+      },
       "addEventListener": {},
       "alert": {},
       "applicationCache": {},
@@ -16684,6 +19876,9 @@
         "support_level": "deprecated"
       },
       "btoa": {},
+      "caches": {
+        "support_level": "untriaged"
+      },
       "cancelAnimationFrame": {},
       "captureEvents": {
         "comment": "http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture",
@@ -16722,6 +19917,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "fetch": {
+        "support_level": "untriaged"
+      },
       "find": {
         "support_level": "nonstandard"
       },
@@ -17023,6 +20221,20 @@
     },
     "support_level": "untriaged"
   },
+  "WindowClient": {
+    "members": {
+      "focus": {
+        "support_level": "untriaged"
+      },
+      "focused": {
+        "support_level": "untriaged"
+      },
+      "visibilityState": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WindowEventHandlers": {
     "members": {
       "onbeforeunload": {
@@ -17057,6 +20269,12 @@
   },
   "WindowTimers": {
     "members": {
+      "_setInterval_String": {
+        "support_level": "untriaged"
+      },
+      "_setTimeout_String": {
+        "support_level": "untriaged"
+      },
       "clearInterval": {
         "support_level": "untriaged"
       },
@@ -17194,6 +20412,12 @@
       "TEMPORARY": {
         "support_level": "untriaged"
       },
+      "_setInterval_String": {
+        "support_level": "untriaged"
+      },
+      "_setTimeout_String": {
+        "support_level": "untriaged"
+      },
       "addEventListener": {
         "support_level": "untriaged"
       },
@@ -17203,6 +20427,9 @@
       "btoa": {
         "support_level": "untriaged"
       },
+      "caches": {
+        "support_level": "untriaged"
+      },
       "clearInterval": {
         "support_level": "untriaged"
       },
@@ -17224,6 +20451,9 @@
       "dispatchEvent": {
         "support_level": "untriaged"
       },
+      "fetch": {
+        "support_level": "untriaged"
+      },
       "importScripts": {
         "support_level": "untriaged"
       },
@@ -17344,11 +20574,38 @@
   },
   "WorkerPerformance": {
     "members": {
+      "clearMarks": {
+        "support_level": "untriaged"
+      },
+      "clearMeasures": {
+        "support_level": "untriaged"
+      },
+      "getEntries": {
+        "support_level": "untriaged"
+      },
+      "getEntriesByName": {
+        "support_level": "untriaged"
+      },
+      "getEntriesByType": {
+        "support_level": "untriaged"
+      },
+      "mark": {
+        "support_level": "untriaged"
+      },
+      "measure": {
+        "support_level": "untriaged"
+      },
       "memory": {
         "support_level": "untriaged"
       },
       "now": {
         "support_level": "untriaged"
+      },
+      "webkitClearResourceTimings": {
+        "support_level": "untriaged"
+      },
+      "webkitSetResourceTimingBufferSize": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index bf857a8..533a448 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -60,6 +60,11 @@
   void handleEvent();
 };
 
+[Callback]
+interface RequestAnimationFrameCallback{
+    void handleEvent(double highResTime);
+};
+
 // FIXME(leafp): This is a temporary hack to get things running while
 // we are still generating _blink from the dart side idl files.
 // Once we are up and running generating dart:_blink in dartium
@@ -418,3 +423,10 @@
 };
 
 Element implements GlobalEventHandlers;
+
+
+// This only exists in Safari, and is deprecated there. But include it anyway
+// because otherwise iterating CSSRules in Safari can yield unknown JS objects.
+interface CSSCharsetRule : CSSRule {
+    [MeasureAs=CSSCharsetRuleEncoding] attribute DOMString encoding;
+};
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 8194dfc..b528141 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -29,6 +29,14 @@
   # location is dartium-git/src/third_party 
   third_party_dir = os.path.join(dart_dir, '..', 'third_party')
   assert(os.path.exists(third_party_dir))
+else:
+  # It's Dart we need to make sure that tools in injected in our search path
+  # because this is where idl_parser is located for a Dart enlistment.  Dartium
+  # can figure out the tools directory because of the location of where the
+  # scripts blink scripts are located.
+  tools_dir = os.path.join(dart_dir, 'tools')
+  sys.path.insert(1, tools_dir)
+
 sys.path.insert(1, third_party_dir)
 
 sys.path.insert(1, os.path.join(dart_dir, 'tools/dom/scripts'))
@@ -177,7 +185,7 @@
     cpp_library_emitter = CPPLibraryEmitter(emitters, cpp_output_dir)
     dart_output_dir = os.path.join(dartium_output_dir, 'dart')
     backend_factory = lambda interface:\
-        DartiumBackend(interface, cpp_library_emitter, backend_options)
+        DartiumBackend(interface, cpp_library_emitter, backend_options, _logger)
     dart_libraries = DartLibraries(
         HTML_LIBRARY_NAMES, template_loader, 'dartium', dartium_output_dir, dart_js_interop)
 
diff --git a/tools/dom/scripts/dartgenerator.py b/tools/dom/scripts/dartgenerator.py
index e3e9625..e03a0fa 100755
--- a/tools/dom/scripts/dartgenerator.py
+++ b/tools/dom/scripts/dartgenerator.py
@@ -12,7 +12,7 @@
 import re
 import shutil
 from generator import *
-from idlnode import IDLType
+from idlnode import IDLType, resolveTypedef
 
 _logger = logging.getLogger('dartgenerator')
 
@@ -98,6 +98,15 @@
               type_name.endswith('Constructor')):
             _logger.warn('removing %s in %s which has unidentified type %s' %
                        (node_name, interface.id, type_name))
+
+          # One last check is the type a typedef in an IDL file (the typedefs
+          # are treated as global).
+          resolvedType = resolveTypedef(idl_type)
+          if (resolvedType != idl_type):
+            idl_type.id = resolvedType.id
+            idl_type.nullable = resolvedType.nullable
+            continue
+
           return False
         return True
 
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index b90a2b3..fefbd2d 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -29,6 +29,11 @@
 
 _dart2js_annotations = monitored.Dict('dartmetadata._dart2js_annotations', {
 
+    'AnimationEffectTiming.duration': [
+      "@Creates('Null')",
+      "@Returns('num|String')",
+     ],
+
     'ArrayBufferView': [
       "@Creates('TypedData')",
       "@Returns('TypedData|Null')",
@@ -56,6 +61,10 @@
       "@Returns('String|CanvasGradient|CanvasPattern')",
     ],
 
+    'CryptoKey.algorithm': [
+      "@Creates('Null')",
+    ],
+
     'CustomEvent._detail': [
       "@Creates('Null')",
     ],
@@ -276,6 +285,11 @@
       "@Returns('EventTarget|=Object')",
     ],
 
+    'Notification.data': [
+      "@annotation_Creates_SerializedScriptValue",
+      "@annotation_Returns_SerializedScriptValue",
+    ],
+
     'PopStateEvent.state': [
       "@annotation_Creates_SerializedScriptValue",
       "@annotation_Returns_SerializedScriptValue",
@@ -290,6 +304,16 @@
       "@annotation_Returns_SerializedScriptValue",
     ],
 
+    'ServiceWorkerMessageEvent.data': [
+      "@annotation_Creates_SerializedScriptValue",
+      "@annotation_Returns_SerializedScriptValue",
+    ],
+
+    'ServiceWorkerMessageEvent.source': [
+      "@Creates('Null')",
+      "@Returns('_ServiceWorker|MessagePort')",
+     ],
+
     'ShadowRoot.getElementsByClassName': [
       "@Creates('NodeList|HtmlCollection')",
       "@Returns('NodeList|HtmlCollection')",
@@ -317,6 +341,14 @@
       "@Creates('Null')",
     ],
 
+    'VTTCue.line': [
+       "@Returns('num|String')",
+    ],
+
+    'VTTCue.position': [
+       "@Returns('num|String')",
+    ],
+
     'WebGLRenderingContext.getBufferParameter': [
       "@Creates('int|Null')",
       "@Returns('int|Null')",
diff --git a/tools/dom/scripts/databasebuilder.py b/tools/dom/scripts/databasebuilder.py
index ceb6eb1..b0977ad 100755
--- a/tools/dom/scripts/databasebuilder.py
+++ b/tools/dom/scripts/databasebuilder.py
@@ -617,6 +617,9 @@
 
     end_time = time.time()
 
+    for warning in report_unions_to_any():
+      _logger.warning(warning)
+
     print 'Total %s files %sprocessed in databasebuilder in %s seconds' % \
     (len(file_paths), '', round((end_time - start_time), 2))
 
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index c944fc3..8e62fac 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -37,7 +37,7 @@
 ]
 
 class HtmlDartGenerator(object):
-  def __init__(self, interface, options, dart_use_blink):
+  def __init__(self, interface, options, dart_use_blink, logger):
     self._dart_use_blink = dart_use_blink
     self._database = options.database
     self._interface = interface
@@ -46,6 +46,7 @@
     self._renamer = options.renamer
     self._metadata = options.metadata
     self._library_name = self._renamer.GetLibraryName(self._interface)
+    _logger.setLevel(logger.level)
 
   def EmitSupportCheck(self):
     if self.HasSupportCheck():
@@ -252,7 +253,7 @@
         operation.id != '__getter__' and
         operation.id != '__setter__' and
         operation.id != '__delete__'):
-      _logger.error('Multiple type signatures for %s.%s. Please file a bug with'
+      _logger.warn('Multiple type signatures for %s.%s. Please file a bug with'
           ' the dart:html team to determine if one of these functions should be'
           ' renamed.' % (
           interface.id, operation.id))
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 372ecca..6e83fd3 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -43,8 +43,8 @@
   '*.change': ('change', 'Event'),
   '*.click': ('click', 'MouseEvent'),
   '*.contextmenu': ('contextMenu', 'MouseEvent'),
-  '*.copy': ('copy', 'Event'),
-  '*.cut': ('cut', 'Event'),
+  '*.copy': ('copy', 'ClipboardEvent'),
+  '*.cut': ('cut', 'ClipboardEvent'),
   '*.dblclick': ('doubleClick', 'Event'),
   '*.drag': ('drag', 'MouseEvent'),
   '*.dragend': ('dragEnd', 'MouseEvent'),
@@ -79,7 +79,7 @@
   '*.mousewheel': ('mouseWheel', 'WheelEvent'),
   '*.offline': ('offline', 'Event'),
   '*.online': ('online', 'Event'),
-  '*.paste': ('paste', 'Event'),
+  '*.paste': ('paste', 'ClipboardEvent'),
   '*.pause': ('pause', 'Event'),
   '*.play': ('play', 'Event'),
   '*.playing': ('playing', 'Event'),
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index addddd9..7bb618a 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -380,6 +380,7 @@
   'UIEvent.layerY',
   'UIEvent.pageX',
   'UIEvent.pageY',
+  'UIEvent.which',
   'WheelEvent.initWebKitWheelEvent',
   'WheelEvent.deltaX',
   'WheelEvent.deltaY',
@@ -563,6 +564,8 @@
     'CanvasRenderingContext2D.webkitImageSmoothingEnabled',
     'CharacterData.remove',
     'ChildNode.replaceWith',
+    'CSSStyleDeclaration.__getter__',
+    'CSSStyleDeclaration.__setter__',
     'Window.call:blur',
     'Window.call:focus',
     'Window.clientInformation',
@@ -794,6 +797,9 @@
     'HTMLUListElement.compact',
     'HTMLUListElement.type',
     'IDBDatabase.transaction', # We do this in a template without the generated implementation at all.
+    'KeyboardEvent.charCode',
+    'KeyboardEvent.keyCode',
+    'KeyboardEvent.which',
     'Location.valueOf',
     'MessageEvent.data',
     'MessageEvent.ports',
@@ -828,6 +834,7 @@
     'NodeList.item',
     'ParentNode.append',
     'ParentNode.prepend',
+    'ServiceWorkerMessageEvent.data',
     'ShadowRoot.getElementsByTagNameNS',
     'SVGElement.getPresentationAttribute',
     'SVGElementInstance.on:wheel',
@@ -850,6 +857,7 @@
 # Manual dart: library name lookup.
 _library_names = monitored.Dict('htmlrenamer._library_names', {
   'ANGLEInstancedArrays': 'web_gl',
+  'CHROMIUMSubscribeUniform': 'web_gl',
   'Database': 'web_sql',
   'Navigator': 'html',
   'Window': 'html',
@@ -857,6 +865,7 @@
 
 _library_ids = monitored.Dict('htmlrenamer._library_names', {
   'ANGLEInstancedArrays': 'WebGl',
+  'CHROMIUMSubscribeUniform': 'WebGl',
   'Database': 'WebSql',
   'Navigator': 'Html',
   'Window': 'Html',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index 2d81988..5e4d156 100755
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -12,18 +12,33 @@
 
 new_asts = {}
 
+# Report of union types mapped to any.
+_unions_to_any = []
+
+def report_unions_to_any():
+  global _unions_to_any
+
+  warnings = []
+  for union_id in sorted(_unions_to_any):
+    warnings.append('Union type %s is mapped to \'any\'' % union_id)
+
+  return warnings
+
 # Ugly but Chrome IDLs can reference typedefs in any IDL w/o an include.  So we
 # need to remember any typedef seen then alias any reference to a typedef.
-typeDefsFixup = []
+_typeDefsFixup = []
 
-def _resolveTypedef(type):
+def _addTypedef(typedef):
+  _typeDefsFixup.append(typedef)
+
+def resolveTypedef(type):
   """ Given a type if it's a known typedef (only typedef's that aren't union)
       are remembered for fixup.  typedefs that are union type are mapped to
       any so those we don't need to alias.  typedefs referenced in the file
       where the typedef was defined are automatically aliased to the real type.
       This resolves typedef where the declaration is in another IDL file.
   """
-  for typedef in typeDefsFixup:
+  for typedef in _typeDefsFixup:
     if typedef.id == type.id:
       return typedef.type
 
@@ -364,6 +379,8 @@
 
     filename_basename = os.path.basename(filename)
 
+    # Report of union types mapped to any.
+
     self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
     self.dictionaries = self._convert_all(ast, 'Dictionary', IDLDictionary)
 
@@ -425,7 +442,7 @@
         self.dictionaries.append(dictionary)
       else:
         # All other typedefs we record
-        typeDefsFixup.append(IDLTypeDef(typedef_type))
+        _addTypedef(IDLTypeDef(typedef_type))
 
     self.enums = self._convert_all(ast, 'Enum', IDLEnum)
 
@@ -556,6 +573,8 @@
   StringType, VoidType, IntegerType, etc."""
 
   def __init__(self, ast):
+    global _unions_to_any
+
     IDLNode.__init__(self, ast)
 
     if ast:
@@ -595,7 +614,9 @@
         if isinstance(ast, IdlType) or isinstance(ast, IdlArrayOrSequenceType) or \
            isinstance(ast, IdlNullableType):
           if isinstance(ast, IdlNullableType) and ast.inner_type.is_union_type:
-            print 'WARNING type %s is union mapped to \'any\'' % self.id
+            # Report of union types mapped to any.
+            if not(self.id in _unions_to_any):
+              _unions_to_any.append(self.id)
             # TODO(terry): For union types use any otherwise type is unionType is
             #              not found and is removed during merging.
             self.id = 'any'
@@ -616,19 +637,20 @@
         else:
           # IdlUnionType
           if ast.is_union_type:
-            print 'WARNING type %s is union mapped to \'any\'' % self.id
-          # TODO(terry): For union types use any otherwise type is unionType is
-          #              not found and is removed during merging.
+            if not(self.id in _unions_to_any):
+              _unions_to_any.append(self.id)
+            # TODO(terry): For union types use any otherwise type is unionType is
+            #              not found and is removed during merging.
             self.id = 'any'
-          # TODO(terry): Any union type e.g. 'type1 or type2 or type2',
-          #                            'typedef (Type1 or Type2) UnionType'
-          # Is a problem we need to extend IDLType and IDLTypeDef to handle more
-          # than one type.
-          #
-          # Also for typedef's e.g.,
-          #                 typedef (Type1 or Type2) UnionType
-          # should consider synthesizing a new interface (e.g., UnionType) that's
-          # both Type1 and Type2.
+            # TODO(terry): Any union type e.g. 'type1 or type2 or type2',
+            #                            'typedef (Type1 or Type2) UnionType'
+            # Is a problem we need to extend IDLType and IDLTypeDef to handle more
+            # than one type.
+            #
+            # Also for typedef's e.g.,
+            #                 typedef (Type1 or Type2) UnionType
+            # should consider synthesizing a new interface (e.g., UnionType) that's
+            # both Type1 and Type2.
       if not self.id:
         print '>>>> __module__ %s' % ast.__module__
         raise SyntaxError('Could not parse type %s' % (ast))
@@ -768,7 +790,7 @@
     IDLNode.__init__(self, ast)
 
     self.type = self._convert_first(ast, 'Type', IDLType)
-    self.type = _resolveTypedef(self.type)
+    self.type = resolveTypedef(self.type)
 
     self._convert_ext_attrs(ast)
     self._convert_annotations(ast)
@@ -784,7 +806,8 @@
     IDLMember.__init__(self, ast, doc_js_interface_name)
 
     self.type = self._convert_first(ast, 'ReturnType', IDLType)
-    self.type = _resolveTypedef(self.type)
+    self.type = resolveTypedef(self.type)
+
     self.arguments = self._convert_all(ast, 'Argument', IDLArgument)
     self.specials = self._find_all(ast, 'Special')
     # Special case: there are getters of the form
@@ -862,7 +885,7 @@
         self.default_value_is_null = False
 
     self.type = self._convert_first(ast, 'Type', IDLType)
-    self.type = _resolveTypedef(self.type)
+    self.type = resolveTypedef(self.type)
 
     self.optional = self._has(ast, 'Optional')
     self._convert_ext_attrs(ast)
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 7656695..b31b23d 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -737,7 +737,7 @@
   """
 
   def __init__(self, interface, options, logging_level=logging.WARNING):
-    super(Dart2JSBackend, self).__init__(interface, options, False)
+    super(Dart2JSBackend, self).__init__(interface, options, False, _logger)
 
     self._database = options.database
     self._template_loader = options.templates
@@ -747,7 +747,6 @@
     self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
     self._current_secondary_parent = None
     self._library_name = self._renamer.GetLibraryName(self._interface)
-
     _logger.setLevel(logging_level)
 
   def ImplementsMergedMembers(self):
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 5470993..1fd37f4 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -7,12 +7,14 @@
 native binding from the IDL database."""
 
 import emitter
+import logging
 import os
 from generator import *
 from htmldartgenerator import *
 from idlnode import IDLArgument, IDLAttribute, IDLEnum, IDLMember
 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES
 
+_logger = logging.getLogger('systemnative')
 
 # TODO(vsm): This should be recoverable from IDL, but we appear to not
 # track the necessary info.
@@ -76,9 +78,8 @@
 class DartiumBackend(HtmlDartGenerator):
   """Generates Dart implementation for one DOM IDL interface."""
 
-  def __init__(self, interface,
-               cpp_library_emitter, options):
-    super(DartiumBackend, self).__init__(interface, options, True)
+  def __init__(self, interface, cpp_library_emitter, options, loggerParent):
+    super(DartiumBackend, self).__init__(interface, options, True, loggerParent)
 
     self._interface = interface
     self._cpp_library_emitter = cpp_library_emitter
@@ -96,6 +97,7 @@
     self._cpp_definitions_emitter = None
     self._cpp_resolver_emitter = None
     self._dart_js_interop = options.dart_js_interop
+    _logger.setLevel(loggerParent.level)
 
   def ImplementsMergedMembers(self):
     # We could not add merged functions to implementation class because
diff --git a/tools/dom/src/dart2js_KeyEvent.dart b/tools/dom/src/dart2js_KeyEvent.dart
index 5dd0c06..0324f07 100644
--- a/tools/dom/src/dart2js_KeyEvent.dart
+++ b/tools/dom/src/dart2js_KeyEvent.dart
@@ -33,22 +33,22 @@
   /** The "fixed" value of whether the alt key is being pressed. */
   bool _shadowAltKey;
 
-  /** Caculated value of what the estimated charCode is for this event. */
+  /** Calculated value of what the estimated charCode is for this event. */
   int _shadowCharCode;
 
-  /** Caculated value of what the estimated keyCode is for this event. */
+  /** Calculated value of what the estimated keyCode is for this event. */
   int _shadowKeyCode;
 
-  /** Caculated value of what the estimated keyCode is for this event. */
+  /** Calculated 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. */
+  /** Calculated 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. */
+  /** Calculated 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. */
+  /** Calculated value of what the estimated keyCode is for this event. */
   int get which => keyCode;
 
   /** Accessor to the underlying keyCode value is the parent event. */
@@ -185,23 +185,22 @@
   static EventStreamProvider<KeyEvent> keyPressEvent =
       new _KeyboardEventHandler('keypress');
 
-  /** Accessor to the clipboardData available for this event. */
-  DataTransfer get clipboardData => _parent.clipboardData;
+  String get code => _parent.code;
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
   int get detail => _parent.detail;
+  String get key => _parent.key;
   /**
    * Accessor to the part of the keyboard that the key was pressed from (one of
    * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
    * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
    */
   int get keyLocation => _parent.keyLocation;
-  Point get layer => _parent.layer;
   /** True if the Meta (or Mac command) key is pressed during this event. */
   bool get metaKey => _parent.metaKey;
-  Point get page => _parent.page;
   /** True if the shift key was pressed during this event. */
   bool get shiftKey => _parent.shiftKey;
+  InputDevice get sourceDevice => _parent.sourceDevice;
   Window get view => _parent.view;
   void _initUIEvent(String type, bool canBubble, bool cancelable,
       Window view, int detail) {
@@ -211,6 +210,8 @@
 
   int get _charCode => charCode;
   int get _keyCode => keyCode;
+  int get _which => which;
+
   String get _keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
@@ -220,10 +221,6 @@
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
-  int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
   @Experimental() // untriaged
   bool getModifierState(String keyArgument) => throw new UnimplementedError();
   @Experimental() // untriaged
diff --git a/tools/dom/src/dart2js_WrappedEvent.dart b/tools/dom/src/dart2js_WrappedEvent.dart
index e7e21a0..3f8789f 100644
--- a/tools/dom/src/dart2js_WrappedEvent.dart
+++ b/tools/dom/src/dart2js_WrappedEvent.dart
@@ -19,8 +19,6 @@
 
   bool get cancelable => wrapped.cancelable;
 
-  DataTransfer get clipboardData => wrapped.clipboardData;
-
   EventTarget get currentTarget => wrapped.currentTarget;
 
   bool get defaultPrevented => wrapped.defaultPrevented;
diff --git a/tools/dom/src/dartium_KeyEvent.dart b/tools/dom/src/dartium_KeyEvent.dart
index 327ddf0..9997689 100644
--- a/tools/dom/src/dartium_KeyEvent.dart
+++ b/tools/dom/src/dartium_KeyEvent.dart
@@ -43,22 +43,22 @@
   /** The "fixed" value of whether the alt key is being pressed. */
   bool _shadowAltKey;
 
-  /** Caculated value of what the estimated charCode is for this event. */
+  /** Calculated value of what the estimated charCode is for this event. */
   int _shadowCharCode;
 
-  /** Caculated value of what the estimated keyCode is for this event. */
+  /** Calculated value of what the estimated keyCode is for this event. */
   int _shadowKeyCode;
 
-  /** Caculated value of what the estimated keyCode is for this event. */
+  /** Calculated 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. */
+  /** Calculated 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. */
+  /** Calculated 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. */
+  /** Calculated value of what the estimated keyCode is for this event. */
   int get which => keyCode;
 
   /** Accessor to the underlying keyCode value is the parent event. */
@@ -113,8 +113,6 @@
   /** The currently registered target for this event. */
   EventTarget get currentTarget => _currentTarget;
 
-  /** Accessor to the clipboardData available for this event. */
-  DataTransfer get clipboardData => _parent.clipboardData;
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
   int get detail => _parent.detail;
@@ -124,10 +122,8 @@
    * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
    */
   int get keyLocation => _parent.keyLocation;
-  Point get layer => _parent.layer;
   /** True if the Meta (or Mac command) key is pressed during this event. */
   bool get metaKey => _parent.metaKey;
-  Point get page => _parent.page;
   /** True if the shift key was pressed during this event. */
   bool get shiftKey => _parent.shiftKey;
   Window get view => _parent.view;
@@ -139,6 +135,7 @@
 
   int get _charCode => charCode;
   int get _keyCode => keyCode;
+  int get _which => which;
   String get _keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
@@ -148,10 +145,6 @@
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
-  int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
-  int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
   @Experimental() // untriaged
   bool getModifierState(String keyArgument) => throw new UnimplementedError();
   @Experimental() // untriaged
diff --git a/tools/dom/src/dartium_WrappedEvent.dart b/tools/dom/src/dartium_WrappedEvent.dart
index 18c43f0..2364158 100644
--- a/tools/dom/src/dartium_WrappedEvent.dart
+++ b/tools/dom/src/dartium_WrappedEvent.dart
@@ -26,8 +26,6 @@
 
   bool get cancelable => wrapped.cancelable;
 
-  DataTransfer get clipboardData => wrapped.clipboardData;
-
   EventTarget get currentTarget => wrapped.currentTarget;
 
   bool get defaultPrevented => wrapped.defaultPrevented;
diff --git a/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate b/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
index 23e22bf..bbd6aeb 100644
--- a/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
@@ -62,5 +62,8 @@
 
   @DomName('KeyboardEvent.charCode')
   int get charCode => _charCode;
+
+  @DomName('KeyboardEvent.which')
+  int get which => _which;
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate b/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
index 80ecea1..5d5d23a 100644
--- a/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
@@ -60,4 +60,12 @@
   @DomName('MouseEvent.screenX')
   @DomName('MouseEvent.screenY')
   Point get screen => new Point(_screenX, _screenY);
+
+  @DomName('MouseEvent.layerX')
+  @DomName('MouseEvent.layerY')
+  Point get layer => new Point(_layerX, _layerY);
+
+  @DomName('MouseEvent.pageX')
+  @DomName('MouseEvent.pageY')
+  Point get page => new Point(_pageX, _pageY);
 }
diff --git a/tools/dom/templates/html/dartium/impl_KeyboardEvent.darttemplate b/tools/dom/templates/html/dartium/impl_KeyboardEvent.darttemplate
index 2cdb92b..7e4d026 100644
--- a/tools/dom/templates/html/dartium/impl_KeyboardEvent.darttemplate
+++ b/tools/dom/templates/html/dartium/impl_KeyboardEvent.darttemplate
@@ -24,5 +24,8 @@
 
   @DomName('KeyboardEvent.charCode')
   int get charCode => _charCode;
+
+  @DomName('KeyboardEvent.which')
+  int get which => _which;
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/dartium/impl_MouseEvent.darttemplate b/tools/dom/templates/html/dartium/impl_MouseEvent.darttemplate
index 02bc4fb..c4dc511 100644
--- a/tools/dom/templates/html/dartium/impl_MouseEvent.darttemplate
+++ b/tools/dom/templates/html/dartium/impl_MouseEvent.darttemplate
@@ -64,4 +64,12 @@
   @DomName('MouseEvent.screenX')
   @DomName('MouseEvent.screenY')
   Point get screen => new Point(_screenX, _screenY);
+
+  @DomName('MouseEvent.layerX')
+  @DomName('MouseEvent.layerY')
+  Point get layer => new Point(_layerX, _layerY);
+
+  @DomName('MouseEvent.pageX')
+  @DomName('MouseEvent.pageY')
+  Point get page => new Point(_pageX, _pageY);
 }
diff --git a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index cd5fa3c..74c7d33 100644
--- a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -15,7 +15,7 @@
   @DocsEditable()
   ImageData createImageDataFromImageData(ImageData imagedata) =>
 $if DART2JS
-    JS('ImageData', '#.createImageData(#, #)', this, imagedata);
+    JS('ImageData', '#.createImageData(#)', this, imagedata);
 $else
     this.createImageData(imagedata);
 $endif
diff --git a/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate b/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
index fec4341..19d77d1 100644
--- a/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
@@ -48,8 +48,8 @@
   @JSName('data')
   @DomName('MessageEvent.data')
   @DocsEditable()
-  @Creates('Null')
-  @Returns('Object|Null')
+  @annotation_Creates_SerializedScriptValue
+  @annotation_Returns_SerializedScriptValue
   final dynamic _get_data;
 
 $endif
diff --git a/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate b/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate
new file mode 100644
index 0000000..42a803f
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate
@@ -0,0 +1,38 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+part of $LIBRARYNAME;
+
+// TODO(alanknight): Provide a nicer constructor that uses named parameters
+// rather than an initialization map.
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+
+$if DARTIUM
+  // TODO(alanknight): This really should be generated by the
+  // _OutputConversion in the systemnative.py script, but that doesn't
+  // use those conversions right now, so do this as a one-off.
+  @DomName('ServiceWorkerMessageEvent.data')
+  @DocsEditable()
+  dynamic get data => convertNativeToDart_SerializedScriptValue(
+      _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+$else
+  // TODO(alanknight): This really should be generated by the
+  // _OutputConversion in the systemnative.py script, but that doesn't
+  // use those conversions right now, so do this as a one-off.
+  @DomName('ServiceWorkerMessageEvent.data')
+  @DocsEditable()
+  dynamic get data => convertNativeToDart_SerializedScriptValue(this._get_data);
+
+  @JSName('data')
+  @DomName('ServiceWorkerMessageEvent.data')
+  @DocsEditable()
+  @annotation_Creates_SerializedScriptValue
+  @annotation_Returns_SerializedScriptValue
+  final dynamic _get_data;
+$endif
+
+$!MEMBERS
+}
diff --git a/tools/dom/templates/html/impl/impl_UIEvent.darttemplate b/tools/dom/templates/html/impl/impl_UIEvent.darttemplate
index 223dc0a..5894720 100644
--- a/tools/dom/templates/html/impl/impl_UIEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_UIEvent.darttemplate
@@ -24,12 +24,4 @@
     return e;
   }
 $!MEMBERS
-
-  @DomName('UIEvent.layerX')
-  @DomName('UIEvent.layerY')
-  Point get layer => new Point(_layerX, _layerY);
-
-  @DomName('UIEvent.pageX')
-  @DomName('UIEvent.pageY')
-  Point get page => new Point(_pageX, _pageY);
 }
diff --git a/tools/gyp/configurations.gypi b/tools/gyp/configurations.gypi
index 84237ca..6a4b796 100644
--- a/tools/gyp/configurations.gypi
+++ b/tools/gyp/configurations.gypi
@@ -660,6 +660,33 @@
         ],
       },
 
+      'DebugAndroidX64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_x64_Base', 'Dart_Debug',
+          'Dart_Android_Base',
+          'Dart_Android_x64_Base',
+          'Dart_Android_Debug',
+        ],
+      },
+
+      'ReleaseAndroidX64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_x64_Base', 'Dart_Release',
+          'Dart_Android_Base',
+          'Dart_Android_x64_Base',
+          'Dart_Android_Release',
+        ],
+      },
+
+      'ProductAndroidX64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_x64_Base', 'Dart_Product',
+          'Dart_Android_Base',
+          'Dart_Android_x64_Base',
+          'Dart_Android_Product',
+        ],
+      },
+
       'DebugAndroidARM': {
         'inherit_from': [
           'Dart_Base', 'Dart_arm_Base', 'Dart_Debug',
diff --git a/tools/gyp/configurations_android.gypi b/tools/gyp/configurations_android.gypi
index 0d6133d..8708d6d 100644
--- a/tools/gyp/configurations_android.gypi
+++ b/tools/gyp/configurations_android.gypi
@@ -148,6 +148,58 @@
           }],
         ],
       },
+      'Dart_Android_x64_Base': {
+        'abstract': 1,
+        'variables': {
+          'android_sysroot': '<(android_ndk_root)/platforms/android-21/arch-x86_64',
+          'android_ndk_include': '<(android_sysroot)/usr/include',
+          'android_ndk_lib': '<(android_sysroot)/usr/lib64',
+        },
+        'target_conditions': [
+          ['_toolset=="target"', {
+            'cflags': [
+              '-fPIE',
+              '--sysroot=<(android_sysroot)',
+              '-I<(android_ndk_include)',
+              '-I<(android_ndk_root)/sources/cxx-stl/stlport/stlport',
+            ],
+            'target_conditions': [
+              ['_type=="executable"', {
+                'ldflags!': ['-Wl,--exclude-libs=ALL,-shared',],
+              }],
+              ['_type=="shared_library"', {
+                'ldflags': ['-Wl,-shared,-Bsymbolic',],
+              }],
+            ],
+            'ldflags': [
+              'x64', '>(_type)', 'target',
+              '-nostdlib',
+              '-Wl,--no-undefined',
+              # Don't export symbols from statically linked libraries.
+              '-Wl,--exclude-libs=ALL',
+              '-Wl,-rpath-link=<(android_ndk_lib)',
+              '-L<(android_ndk_lib)',
+              '-L<(android_ndk_root)/sources/cxx-stl/stlport/libs/x86_64',
+              '-z',
+              'muldefs',
+              '-Bdynamic',
+              '-pie',
+              '-Wl,-dynamic-linker,/system/bin/linker',
+              '-Wl,--gc-sections',
+              '-Wl,-z,nocopyreloc',
+              # crtbegin_dynamic.o should be the last item in ldflags.
+              '<(android_ndk_lib)/crtbegin_dynamic.o',
+            ],
+            'ldflags!': [
+              '-pthread',  # Not supported by Android toolchain.
+            ],
+          }],
+          ['_toolset=="host"', {
+            'cflags': [ '-pthread' ],
+            'ldflags': [ '-pthread' ],
+          }],
+        ],
+      },
       'Dart_Android_arm_Base': {
         'abstract': 1,
         'variables': {
diff --git a/tools/precompilation/test_linux.sh b/tools/precompilation/test_linux.sh
index 514ac04..056fde0 100755
--- a/tools/precompilation/test_linux.sh
+++ b/tools/precompilation/test_linux.sh
@@ -8,8 +8,8 @@
 
 ./tools/build.py -mdebug -ax64 runtime
 
-./out/DebugX64/dart_no_snapshot --gen-precompiled-snapshot --package-root=out/DebugX64/packages/ "$1"
+./out/DebugX64/dart_bootstrap --gen-precompiled-snapshot --package-root=out/DebugX64/packages/ "$1"
 
 gcc -nostartfiles -m64 -shared -Wl,-soname,libprecompiled.so -o libprecompiled.so precompiled.S
 
-LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$PWD" gdb -ex run --args ./out/DebugX64/dart_precompiled_runtime --run-precompiled-snapshot not_used.dart
+gdb -ex run --args ./out/DebugX64/dart_precompiled_runtime --run-precompiled-snapshot=$PWD not_used.dart
diff --git a/tools/precompilation/test_linux_simarm.sh b/tools/precompilation/test_linux_simarm.sh
index bd0f1f0..13d09eb 100755
--- a/tools/precompilation/test_linux_simarm.sh
+++ b/tools/precompilation/test_linux_simarm.sh
@@ -8,8 +8,8 @@
 
 ./tools/build.py -mdebug -asimarm runtime
 
-./out/DebugSIMARM/dart_no_snapshot --gen-precompiled-snapshot --package-root=out/DebugX64/packages/ "$1"
+./out/DebugSIMARM/dart_bootstrap --gen-precompiled-snapshot --package-root=out/DebugX64/packages/ "$1"
 
 gcc -nostartfiles -m32 -shared -Wl,-soname,libprecompiled.so -o libprecompiled.so precompiled.S
 
-LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$PWD" gdb -ex run --args ./out/DebugSIMARM/dart_precompiled_runtime --run-precompiled-snapshot not_used.dart
+gdb -ex run --args ./out/DebugSIMARM/dart_precompiled_runtime --run-precompiled-snapshot=$PWD not_used.dart
diff --git a/tools/precompilation/test_macos.sh b/tools/precompilation/test_macos.sh
index ed90d12..1b97e36 100755
--- a/tools/precompilation/test_macos.sh
+++ b/tools/precompilation/test_macos.sh
@@ -8,8 +8,8 @@
 
 ./tools/build.py -mdebug -ax64 runtime
 
-./xcodebuild/DebugX64/dart_no_snapshot --gen-precompiled-snapshot --package-root=xcodebuild/DebugX64/packages/ "$1"
+./xcodebuild/DebugX64/dart_bootstrap --gen-precompiled-snapshot --package-root=xcodebuild/DebugX64/packages/ "$1"
 
 clang -nostartfiles -m64 -dynamiclib -o libprecompiled.dylib precompiled.S
 
-LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$PWD" lldb -- ./xcodebuild/DebugX64/dart_precompiled_runtime --run-precompiled-snapshot not_used.dart
+lldb -- ./xcodebuild/DebugX64/dart_precompiled_runtime --run-precompiled-snapshot=$PWD not_used.dart
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 4794992..ed9f2c0 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -354,7 +354,7 @@
       CommandBuilder commandBuilder,
       List arguments,
       Map<String, String> environmentOverrides) {
-    var exec = "$buildDir/dart_no_snapshot";
+    var exec = "$buildDir/dart_bootstrap";
     var args = new List();
     args.add("--gen-precompiled-snapshot=$tempDir");
     args.addAll(arguments);
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index c2b2aed..55cf8fe 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -270,11 +270,10 @@
     augmentedArgs.add("--run-precompiled-snapshot=${artifact.filename}");
     augmentedArgs.addAll(arguments);
 
-    var augmentedEnv = new Map.from(environmentOverrides);
-    augmentedEnv['LD_LIBRARY_PATH'] = artifact.filename;
-
     return <Command>[commandBuilder.getVmCommand(
-          suite.dartPrecompiledBinaryFileName, augmentedArgs, augmentedEnv)];
+        suite.dartPrecompiledBinaryFileName,
+        augmentedArgs,
+        environmentOverrides)];
   }
 }
 
diff --git a/utils/dartanalyzer/dartanalyzer.gyp b/utils/dartanalyzer/dartanalyzer.gyp
index 6aec554..1fa08ee 100644
--- a/utils/dartanalyzer/dartanalyzer.gyp
+++ b/utils/dartanalyzer/dartanalyzer.gyp
@@ -19,6 +19,7 @@
             '../../sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart',
             '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
             '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../pkg/analyzer_cli"])',
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../pkg/analyzer"])',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/dartanalyzer.dart.snapshot',
