diff --git a/CHANGELOG.md b/CHANGELOG.md
index 48ec197..1522229 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 2.0.0-dev.40.0
+
 ## 2.0.0-dev.39.0
 ### Tool Changes
 #### Pub
@@ -227,6 +229,7 @@
     `timeout`.
   * `Stdin.hasTerminal` added, which is true if stdin is attached to a terminal.
   * `WebSocket` added static `userAgent` property.
+  * `RandomAccessFile.close` returns `Future<void>`
 
 * `dart:isolate`
 
@@ -274,22 +277,36 @@
 
 ### Tool Changes
 
-* Analyzer
+#### Analyzer
 
-  * The analyzer will no longer issue a warning when a generic type parameter
-    is used as the type in an instance check. For example:
+* The analyzer will no longer issue a warning when a generic type parameter
+  is used as the type in an instance check. For example:
+
+  ```dart
+  test<T>() {
+    print(3 is T); // No warning
+  }
+  ```
+
+* New static checking of `@visibleForTesting` elements. Accessing a method,
+  function, class, etc. annotated with `@visibleForTesting` from a file _not_
+  in a `test/` directory will result in a new hint ([issue 28273]).
+* Static analysis now respects functions annotated with `@alwaysThrows`
+  ([issue 31384]).
+* New hints added:
+  * `NULL_AWARE_BEFORE_OPERATOR` when an operator is used after a null-aware
+    access. For example:
 
     ```dart
-    test<T>() {
-      print(3 is T); // No warning
-    }
+    x?.a - ''; // HINT
     ```
 
-  * New static checking of `@visibleForTesting` elements. Accessing a method,
-    function, class, etc. annotated with `@visibleForTesting` from a file _not_
-    in a `test/` directory will result in a new hint ([issue 28273]).
-  * Static analysis now respects functions annotated with `@alwaysThrows`
-    ([issue 31384]).
+  * `NULL_AWARE_IN_LOGICAL_OPERATOR` when an expression with null-aware access
+    is used as a condition in logical operators. For example:
+
+    ```dart
+    x.a || x?.b; // HINT
+    ```
 
 [issue 28273]: https://github.com/dart-lang/sdk/issues/28273
 [issue 31384]: https://github.com/dart-lang/sdk/issues/31384
diff --git a/DEPS b/DEPS
index 1c46318..e30ca30 100644
--- a/DEPS
+++ b/DEPS
@@ -94,7 +94,7 @@
   "http_retry_tag": "@0.1.0",
   "http_tag" : "@0.11.3+16",
   "http_throttle_tag" : "@1.0.1",
-  "idl_parser_rev": "@7fbe68cab90c38147dee4f48c30ad0d496c17915",
+  "idl_parser_rev": "@5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
   "intl_tag": "@0.15.2",
   "isolate_tag": "@1.1.0",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
@@ -143,7 +143,7 @@
   "utf_tag": "@0.9.0+4",
   "watcher_tag": "@0.9.7+7",
   "web_socket_channel_tag": "@1.0.7",
-  "WebCore_rev": "@3c45690813c112373757bbef53de1602a62af609",
+  "WebCore_rev": "@fb11e887f77919450e497344da570d780e078bc8",
   "yaml_tag": "@2.1.13",
   "zlib_rev": "@c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
 }
diff --git a/pkg/analysis_server/benchmark/integration/main.dart b/pkg/analysis_server/benchmark/integration/main.dart
index 0760b17..a84e913 100644
--- a/pkg/analysis_server/benchmark/integration/main.dart
+++ b/pkg/analysis_server/benchmark/integration/main.dart
@@ -75,9 +75,8 @@
       help: '<filePath>\n'
           'The input file specifying how this client should interact with the server.\n'
           'If the input file name is "stdin", then the instructions are read from standard input.');
-  _argParser.addOption(MAP_OPTION,
+  _argParser.addMultiOption(MAP_OPTION,
       abbr: 'm',
-      allowMultiple: true,
       splitCommas: false,
       help: '<oldSrcPath>,<newSrcPath>\n'
           'This option defines a mapping from the original source directory <oldSrcPath>\n'
diff --git a/pkg/analysis_server/benchmark/perf/analysis_timing_tests.dart b/pkg/analysis_server/benchmark/perf/analysis_timing_tests.dart
index 7933045..fb60e43 100644
--- a/pkg/analysis_server/benchmark/perf/analysis_timing_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/analysis_timing_tests.dart
@@ -52,8 +52,8 @@
 String source;
 
 ArgParser _createArgParser() => new ArgParser()
-  ..addOption(METRIC_NAME_OPTION,
-      help: 'metric name (defaults to `analysis`)', allowMultiple: true)
+  ..addMultiOption(METRIC_NAME_OPTION,
+      help: 'metric name (defaults to `analysis`)')
   ..addOption(SOURCE_OPTION, help: 'full path to source directory for analysis')
   ..addOption(PRIORITY_FILE_OPTION,
       help: '(optional) full path to a priority file');
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index 25dfe13..f786479 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -68,6 +68,7 @@
 
     // Compute instrumented code.
     if (widgets.isNotEmpty) {
+      _rewriteRelativeDirectives();
       instrumentationEdits.sort((a, b) => b.offset - a.offset);
       instrumentedCode =
           SourceEdit.applySequence(content, instrumentationEdits);
@@ -339,6 +340,25 @@
     }
     return node.toString();
   }
+
+  /// The instrumented code is put into a temporary directory for Dart VM to
+  /// run. So, any relative URIs must be changed to corresponding absolute URIs.
+  void _rewriteRelativeDirectives() {
+    for (var directive in unit.directives) {
+      if (directive is UriBasedDirective) {
+        String uriContent = directive.uriContent;
+        Source source = directive.uriSource;
+        if (uriContent != null && source != null) {
+          try {
+            if (!Uri.parse(uriContent).isAbsolute) {
+              instrumentationEdits.add(new SourceEdit(directive.uri.offset,
+                  directive.uri.length, "'${source.uri}'"));
+            }
+          } on FormatException {}
+        }
+      }
+    }
+  }
 }
 
 class _FlutterOutlineBuilder extends GeneralizingAstVisitor<void> {
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 3f35824..8ae5367 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -72,8 +72,7 @@
       List<String> allowed,
       Map<String, String> allowedHelp,
       String defaultsTo,
-      void callback(value),
-      bool allowMultiple: false}) {
+      void callback(value)}) {
     _knownFlags.add(name);
     _parser.addOption(name,
         abbr: abbr,
@@ -81,8 +80,7 @@
         allowed: allowed,
         allowedHelp: allowedHelp,
         defaultsTo: defaultsTo,
-        callback: callback,
-        allowMultiple: allowMultiple);
+        callback: callback);
   }
 
   /// Generates a string displaying usage information for the defined options.
@@ -318,6 +316,8 @@
     analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
     if (results.wasParsed(PREVIEW_DART2)) {
       analysisServerOptions.previewDart2 = results[PREVIEW_DART2];
+    } else {
+      analysisServerOptions.previewDart2 = true;
     }
     analysisServerOptions.useCFE = results[USE_CFE];
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index 3f9c444..e31866b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -101,6 +101,9 @@
     }
 
     SourceRange selectionRange = builder.selectionRange;
+    if (selectionRange == null) {
+      return null;
+    }
     int offsetDelta = targetId.offset + replacement.indexOf(completion);
     String displayText =
         displayTextBuffer.isNotEmpty ? displayTextBuffer.toString() : null;
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index ce3e78b..446edf9 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -2973,7 +2973,7 @@
   /// does not export a class with such name.
   Future<ClassElement> _getExportedClass(
       String libraryUri, String className) async {
-    var libraryElement = await _getLibraryByUri(libraryUri);
+    var libraryElement = await session.getLibraryByUri(libraryUri);
     var element = libraryElement.exportNamespace.get(className);
     if (element is ClassElement) {
       return element;
@@ -2982,34 +2982,6 @@
     }
   }
 
-  /// Return the [LibraryElement] for the library with the given [uri].
-  Future<LibraryElement> _getLibraryByUri(String uri) async {
-    var libraryElement = libraryCache[uri];
-    if (libraryElement == null) {
-      void walkLibraries(LibraryElement library) {
-        var libraryUri = library.source.uri.toString();
-        if (libraryCache[libraryUri] == null) {
-          libraryCache[libraryUri] = library;
-          library.importedLibraries.forEach(walkLibraries);
-          library.exportedLibraries.forEach(walkLibraries);
-        }
-      }
-
-      // Fill the cache with all libraries referenced from the unit.
-      walkLibraries(unitLibraryElement);
-
-      // The library might be already in the cache.
-      libraryElement = libraryCache[uri];
-
-      // If still not found, build a new library element.
-      if (libraryElement == null) {
-        libraryElement = await session.getLibraryByUri(uri);
-        libraryCache[uri] = libraryElement;
-      }
-    }
-    return libraryElement;
-  }
-
   /**
    * Returns the text of the given node in the unit.
    */
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index dd3dc19..a2bfe33 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -89,6 +89,8 @@
 class DartFixKind {
   static const ADD_ASYNC =
       const FixKind('ADD_ASYNC', 50, "Add 'async' modifier");
+  static const ADD_EXPLICIT_CAST =
+      const FixKind('ADD_EXPLICIT_CAST', 50, "Add cast");
   static const ADD_FIELD_FORMAL_PARAMETERS = const FixKind(
       'ADD_FIELD_FORMAL_PARAMETERS', 30, "Add final field formal parameters");
   static const ADD_MISSING_PARAMETER_POSITIONAL = const FixKind(
@@ -211,6 +213,8 @@
       'REMOVE_UNUSED_CATCH_STACK', 50, "Remove unused stack trace variable");
   static const REMOVE_UNUSED_IMPORT =
       const FixKind('REMOVE_UNUSED_IMPORT', 50, "Remove unused import");
+  static const RENAME_TO_CAMEL_CASE =
+      const FixKind('RENAME_TO_CAMEL_CASE', 50, "Rename to '{0}'");
   static const REPLACE_BOOLEAN_WITH_BOOL = const FixKind(
       'REPLACE_BOOLEAN_WITH_BOOL', 50, "Replace 'boolean' with 'bool'");
   static const REPLACE_FINAL_WITH_CONST = const FixKind(
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 c5340dc..7c28a08 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -364,6 +364,7 @@
       await _addFix_useStaticAccess_property();
     }
     if (errorCode == StaticTypeWarningCode.INVALID_ASSIGNMENT) {
+      await _addFix_addExplicitCast();
       await _addFix_changeTypeAnnotation();
     }
     if (errorCode == StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION) {
@@ -447,6 +448,9 @@
       if (name == LintNames.empty_statements) {
         await _addFix_removeEmptyStatement();
       }
+      if (name == LintNames.non_constant_identifier_names) {
+        await _addFix_renameToCamelCase();
+      }
       if (name == LintNames.prefer_collection_literals) {
         await _addFix_replaceWithLiteral();
       }
@@ -497,6 +501,80 @@
     }
   }
 
+  Future<Null> _addFix_addExplicitCast() async {
+    if (coveredNode is! Expression) {
+      return;
+    }
+    Expression target = coveredNode;
+    DartType fromType = target.staticType;
+    DartType toType;
+    AstNode parent = target.parent;
+    if (parent is AssignmentExpression && target == parent.rightHandSide) {
+      toType = parent.leftHandSide.staticType;
+    } else if (parent is VariableDeclaration && target == parent.initializer) {
+      toType = parent.name.staticType;
+    } else {
+      return;
+    }
+    // TODO(brianwilkerson) I think it's more efficient to invoke `cast` before
+    // invoking `toList()`, so check to see whether the cast should be inserted
+    // before the end of the expression.
+    // TODO(brianwilkerson) We should not produce a fix if the target is an
+    // invocation of the `cast` method.
+    bool needsParentheses = target.precedence < 15;
+    if ((_isDartCoreList(fromType) && _isDartCoreList(toType)) ||
+        (_isDartCoreSet(fromType) && _isDartCoreSet(toType))) {
+      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        if (needsParentheses) {
+          builder.addSimpleInsertion(target.offset, '(');
+        }
+        builder.addInsertion(target.end, (DartEditBuilder builder) {
+          if (needsParentheses) {
+            builder.write(')');
+          }
+          builder.write('.cast<');
+          builder.writeType((toType as InterfaceType).typeArguments[0]);
+          builder.write('>()');
+        });
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.ADD_EXPLICIT_CAST);
+    } else if (_isDartCoreMap(fromType) && _isDartCoreMap(toType)) {
+      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        if (needsParentheses) {
+          builder.addSimpleInsertion(target.offset, '(');
+        }
+        builder.addInsertion(target.end, (DartEditBuilder builder) {
+          if (needsParentheses) {
+            builder.write(')');
+          }
+          builder.write('.cast<');
+          builder.writeType((toType as InterfaceType).typeArguments[0]);
+          builder.write(', ');
+          builder.writeType((toType as InterfaceType).typeArguments[1]);
+          builder.write('>()');
+        });
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.ADD_EXPLICIT_CAST);
+    } else {
+      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        if (needsParentheses) {
+          builder.addSimpleInsertion(target.offset, '(');
+        }
+        builder.addInsertion(target.end, (DartEditBuilder builder) {
+          if (needsParentheses) {
+            builder.write(')');
+          }
+          builder.write(' as ');
+          builder.writeType(toType);
+        });
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.ADD_EXPLICIT_CAST);
+    }
+  }
+
   Future<Null> _addFix_addMissingMethodCall() async {
     ClassDeclaration targetClass = node.parent as ClassDeclaration;
     int insertOffset = targetClass.end - 1;
@@ -2362,6 +2440,47 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_IMPORT);
   }
 
+  Future<Null> _addFix_renameToCamelCase() async {
+    if (node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier identifier = this.node;
+
+    // Prepare the new name.
+    List<String> words = identifier.name.split('_');
+    if (words.length < 2) {
+      return;
+    }
+    var newName = words.first + words.skip(1).map((w) => capitalize(w)).join();
+
+    // Find references to the identifier.
+    List<SimpleIdentifier> references;
+    Element element = identifier.staticElement;
+    if (element is LocalVariableElement) {
+      AstNode root = node.getAncestor((node) => node is Block);
+      references = findLocalElementReferences(root, element);
+    } else if (element is ParameterElement) {
+      if (!element.isNamed) {
+        AstNode root = node.getAncestor((node) =>
+            node.parent is ClassDeclaration || node.parent is CompilationUnit);
+        references = findLocalElementReferences(root, element);
+      }
+    }
+    if (references == null) {
+      return;
+    }
+
+    // Compute the change.
+    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+      for (var reference in references) {
+        builder.addSimpleReplacement(range.node(reference), newName);
+      }
+    });
+    _addFixFromBuilder(changeBuilder, DartFixKind.RENAME_TO_CAMEL_CASE,
+        args: [newName]);
+  }
+
   Future<Null> _addFix_replaceFinalWithConst() async {
     if (node is VariableDeclarationList) {
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
@@ -3309,6 +3428,39 @@
     return node is SimpleIdentifier && node.name == 'await';
   }
 
+  bool _isDartCoreList(DartType type) {
+    if (type is! InterfaceType) {
+      return false;
+    }
+    ClassElement element = type.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "List" && element.library.isDartCore;
+  }
+
+  bool _isDartCoreMap(DartType type) {
+    if (type is! InterfaceType) {
+      return false;
+    }
+    ClassElement element = type.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "Map" && element.library.isDartCore;
+  }
+
+  bool _isDartCoreSet(DartType type) {
+    if (type is! InterfaceType) {
+      return false;
+    }
+    ClassElement element = type.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "Set" && element.library.isDartCore;
+  }
+
   bool _isLibSrcPath(String path) {
     List<String> parts = resourceProvider.pathContext.split(path);
     for (int i = 0; i < parts.length - 2; i++) {
@@ -3435,6 +3587,8 @@
   static const String empty_catches = 'empty_catches';
   static const String empty_constructor_bodies = 'empty_constructor_bodies';
   static const String empty_statements = 'empty_statements';
+  static const String non_constant_identifier_names =
+      'non_constant_identifier_names';
   static const String prefer_collection_literals = 'prefer_collection_literals';
   static const String prefer_conditional_assignment =
       'prefer_conditional_assignment';
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 1347247..71dd8c0 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -144,6 +144,16 @@
 }
 
 /**
+ * Return references to the [element] inside the [root] node.
+ */
+List<SimpleIdentifier> findLocalElementReferences(
+    AstNode root, LocalElement element) {
+  var collector = new _ElementReferenceCollector(element);
+  root.accept(collector);
+  return collector.references;
+}
+
+/**
  * TODO(scheglov) replace with nodes once there will be [CompilationUnit.getComments].
  *
  * Returns [SourceRange]s of all comments in [unit].
@@ -1463,6 +1473,20 @@
   }
 }
 
+class _ElementReferenceCollector extends RecursiveAstVisitor<void> {
+  final Element element;
+  final List<SimpleIdentifier> references = [];
+
+  _ElementReferenceCollector(this.element);
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.staticElement == element) {
+      references.add(node);
+    }
+  }
+}
+
 class _ImportDirectiveInfo {
   final String uri;
   final int offset;
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index f9a45f6..487a4ac 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -108,7 +108,6 @@
           expect(info.parameter, matches(parameterRegexp));
         }
       }
-      expect(info.propagatedType, equals(propagatedType));
       if (staticTypeRegexps == null) {
         expect(info.staticType, isNull);
       } else {
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index f52caaf..e143a15 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -112,7 +112,7 @@
           HighlightRegionType.COMMENT_END_OF_LINE, ['// End of line comment']);
       check(HighlightRegionType.CONSTRUCTOR, ['constructor']);
       check(HighlightRegionType.DIRECTIVE, ["import 'dart:async' as async;"]);
-      check(HighlightRegionType.DYNAMIC_TYPE, ['dynamicType']);
+      check(HighlightRegionType.DYNAMIC_TYPE, ['dynamicType', 'local']);
       check(HighlightRegionType.FIELD, ['field']);
       check(HighlightRegionType.FIELD_STATIC, ['staticField']);
       check(HighlightRegionType.FUNCTION, ['print']);
@@ -129,8 +129,8 @@
       check(HighlightRegionType.LITERAL_MAP,
           ['{1.0: [].toList()}', '{2: local}']);
       check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
-      check(HighlightRegionType.LOCAL_VARIABLE, ['local']);
-      check(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, ['local']);
+      //check(HighlightRegionType.LOCAL_VARIABLE, ['local']);
+      //check(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, ['local']);
       check(HighlightRegionType.METHOD, ['toList']);
       check(HighlightRegionType.METHOD_DECLARATION, ['method']);
       check(HighlightRegionType.METHOD_DECLARATION_STATIC, ['staticMethod']);
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test2.dart b/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
index 2157e77..5f4a9c3 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
@@ -147,8 +147,8 @@
       check(HighlightRegionType.LITERAL_MAP,
           ['{1.0: [].toList()}', '{2: local}']);
       check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
-      check(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, ['local']);
-      check(HighlightRegionType.LOCAL_VARIABLE_REFERENCE, ['local']);
+      check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_DECLARATION, ['local']);
+      check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_REFERENCE, ['local']);
       check(HighlightRegionType.INSTANCE_METHOD_REFERENCE, ['toList']);
       check(HighlightRegionType.INSTANCE_METHOD_DECLARATION, ['method']);
       check(HighlightRegionType.STATIC_METHOD_DECLARATION, ['staticMethod']);
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index f703fe0..55e1e84 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -63,7 +63,6 @@
     expect(currentAnalysisErrors[path], isNotEmpty);
   }
 
-  @failingTest
   test_updateContent_multipleAdds() async {
     String pathname = sourcePath('test.dart');
     writeFile(pathname, r'''
diff --git a/pkg/analysis_server/test/mock_sdk.dart b/pkg/analysis_server/test/mock_sdk.dart
index 86252cd..de74dd3 100644
--- a/pkg/analysis_server/test/mock_sdk.dart
+++ b/pkg/analysis_server/test/mock_sdk.dart
@@ -130,16 +130,19 @@
   bool get isEmpty;
   Iterable<T> map<T>(T f(E e)) => null;
   T fold<T>(T initialValue, T combine(T previousValue, E element));
+  List<E> toList({bool growable: true});
 }
 
 class List<E> implements Iterable<E> {
   List();
   void add(E value) {}
   void addAll(Iterable<E> iterable) {}
+  List<R> cast<R>();
   E operator [](int index) => null;
   void operator []=(int index, E value) {}
   Iterator<E> get iterator => null;
   void clear() {}
+  Iterable<E> where(bool test(E element)) {}
 
   bool get isEmpty => false;
   E get first => null;
@@ -147,6 +150,7 @@
 }
 
 abstract class Map<K, V> extends Object {
+  Map<RK, RV> cast<RK, RV>();
   bool containsKey(Object key);
   Iterable<K> get keys;
 }
@@ -155,6 +159,10 @@
 
 void print(Object object) {}
 
+class Set<E> implements Iterable<E> {
+  Set<R> cast<R>();
+}
+
 class Uri {
   static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
     int parseHex(int start, int end) {
@@ -167,7 +175,6 @@
 class _Override { const _Override(); }
 const Object override = const _Override();
 ''');
-
   static const MockSdkLibrary LIB_ASYNC =
       const MockSdkLibrary('dart:async', '/lib/async/async.dart', '''
 library dart.async;
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 2826fd6..486a6a6 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -97,12 +97,7 @@
 
   assertNoFix(FixKind kind) async {
     AnalysisError error = await _findErrorToFix();
-    List<Fix> fixes = await _computeFixes(error);
-    for (Fix fix in fixes) {
-      if (fix.kind == kind) {
-        fail('Unexpected fix $kind in\n${fixes.join('\n')}');
-      }
-    }
+    await _assertNoFix(kind, error);
   }
 
   List<LinkedEditSuggestion> expectedSuggestions(
@@ -139,6 +134,15 @@
     }
   }
 
+  Future _assertNoFix(FixKind kind, AnalysisError error) async {
+    List<Fix> fixes = await _computeFixes(error);
+    for (Fix fix in fixes) {
+      if (fix.kind == kind) {
+        fail('Unexpected fix $kind in\n${fixes.join('\n')}');
+      }
+    }
+  }
+
   Future<List<AnalysisError>> _computeErrors() async {
     return (await driver.getResult(convertPath(testFile))).errors;
   }
@@ -381,6 +385,194 @@
 ''');
   }
 
+  test_addExplicitCast_assignment_general() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b;
+  b = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(A a) {
+  B b;
+  b = a as B;
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_assignment_list() async {
+    await resolveTestUnit('''
+f(List<A> a) {
+  List<B> b;
+  b = a.where((e) => e is B).toList();
+}
+class A {}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(List<A> a) {
+  List<B> b;
+  b = a.where((e) => e is B).toList().cast<B>();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_assignment_map() async {
+    await resolveTestUnit('''
+f(Map<A, B> a) {
+  Map<B, A> b;
+  b = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(Map<A, B> a) {
+  Map<B, A> b;
+  b = a.cast<B, A>();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_assignment_needsParens() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b;
+  b = a..m();
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(A a) {
+  B b;
+  b = (a..m()) as B;
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_assignment_set() async {
+    await resolveTestUnit('''
+f(Set<A> a) {
+  Set<B> b;
+  b = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(Set<A> a) {
+  Set<B> b;
+  b = a.cast<B>();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_declaration_general() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(A a) {
+  B b = a as B;
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_declaration_list() async {
+    await resolveTestUnit('''
+f(List<A> a) {
+  List<B> b = a.where((e) => e is B).toList();
+}
+class A {}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(List<A> a) {
+  List<B> b = a.where((e) => e is B).toList().cast<B>();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_declaration_map() async {
+    await resolveTestUnit('''
+f(Map<A, B> a) {
+  Map<B, A> b = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(Map<A, B> a) {
+  Map<B, A> b = a.cast<B, A>();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_declaration_needsParens() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b = a..m();
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(A a) {
+  B b = (a..m()) as B;
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+  }
+
+  test_addExplicitCast_declaration_set() async {
+    await resolveTestUnit('''
+f(Set<A> a) {
+  Set<B> b = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
+f(Set<A> a) {
+  Set<B> b = a.cast<B>();
+}
+class A {}
+class B {}
+''');
+  }
+
   test_addFieldFormalParameters_hasRequiredParameter() async {
     await resolveTestUnit('''
 class Test {
@@ -5938,6 +6130,11 @@
     resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
   }
 
+  @override
+  assertNoFix(FixKind kind) async {
+    await _assertNoFix(kind, error);
+  }
+
   Future<Null> findLint(String src, String lintCode, {int length: 1}) async {
     int errorOffset = src.indexOf('/*LINT*/');
     await resolveTestUnit(src.replaceAll('/*LINT*/', ''));
@@ -6798,6 +6995,115 @@
 ''');
   }
 
+  test_renameToCamelCase_BAD_parameter_optionalNamed() async {
+    String src = '''
+foo({int /*LINT*/my_integer_variable}) {
+  print(my_integer_variable);
+}
+''';
+    await findLint(src, LintNames.non_constant_identifier_names);
+    await assertNoFix(DartFixKind.RENAME_TO_CAMEL_CASE);
+  }
+
+  test_renameToCamelCase_OK_localVariable() async {
+    String src = '''
+main() {
+  int /*LINT*/my_integer_variable = 42;
+  int foo;
+  print(my_integer_variable);
+  print(foo);
+}
+''';
+    await findLint(src, LintNames.non_constant_identifier_names);
+
+    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
+
+    verifyResult('''
+main() {
+  int myIntegerVariable = 42;
+  int foo;
+  print(myIntegerVariable);
+  print(foo);
+}
+''');
+  }
+
+  test_renameToCamelCase_OK_parameter_closure() async {
+    String src = '''
+main() {
+  [0, 1, 2].forEach((/*LINT*/my_integer_variable) {
+    print(my_integer_variable);
+  });
+}
+''';
+    await findLint(src, LintNames.non_constant_identifier_names);
+
+    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
+
+    verifyResult('''
+main() {
+  [0, 1, 2].forEach((myIntegerVariable) {
+    print(myIntegerVariable);
+  });
+}
+''');
+  }
+
+  test_renameToCamelCase_OK_parameter_function() async {
+    String src = '''
+main(int /*LINT*/my_integer_variable) {
+  print(my_integer_variable);
+}
+''';
+    await findLint(src, LintNames.non_constant_identifier_names);
+
+    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
+
+    verifyResult('''
+main(int myIntegerVariable) {
+  print(myIntegerVariable);
+}
+''');
+  }
+
+  test_renameToCamelCase_OK_parameter_method() async {
+    String src = '''
+class A {
+  main(int /*LINT*/my_integer_variable) {
+    print(my_integer_variable);
+  }
+}
+''';
+    await findLint(src, LintNames.non_constant_identifier_names);
+
+    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
+
+    verifyResult('''
+class A {
+  main(int myIntegerVariable) {
+    print(myIntegerVariable);
+  }
+}
+''');
+  }
+
+  test_renameToCamelCase_OK_parameter_optionalPositional() async {
+    String src = '''
+main([int /*LINT*/my_integer_variable]) {
+  print(my_integer_variable);
+}
+''';
+    await findLint(src, LintNames.non_constant_identifier_names);
+
+    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
+
+    verifyResult('''
+main([int myIntegerVariable]) {
+  print(myIntegerVariable);
+}
+''');
+  }
+
   test_replaceFinalWithConst_method() async {
     String src = '''
 /*LINT*/final int a = 1;
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index 218a54b..374cf39 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -376,6 +376,118 @@
     expect(myWidget.renderConstructor, isNull);
   }
 
+  test_render_instrumentedCode_registerWidgets() async {
+    await _computeOutline('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.forDesignTime();
+
+  @override
+  Widget build(BuildContext context) {
+    return new Row(
+      children: <Widget>[
+        new Text('aaa'),
+        new Text('bbb'),
+      ],
+    );
+  }
+}
+''');
+    expect(
+        computer.instrumentedCode,
+        r'''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.forDesignTime();
+
+  @override
+  Widget build(BuildContext context) {
+    return _registerWidgetInstance(0, new Row(
+      children: <Widget>[
+        _registerWidgetInstance(1, new Text('aaa')),
+        _registerWidgetInstance(2, new Text('bbb')),
+      ],
+    ));
+  }
+}
+''' +
+            FlutterOutlineComputer.RENDER_APPEND);
+  }
+
+  test_render_instrumentedCode_rewriteUri_file() async {
+    testPath = resourceProvider.convertPath('/home/user/test/test.dart');
+    var libFile = newFile('/home/user/test/my_lib.dart', content: '');
+
+    await _computeOutline('''
+import 'package:flutter/widgets.dart';
+import 'my_lib.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.forDesignTime();
+
+  @override
+  Widget build(BuildContext context) {
+    return new Container();
+  }
+}
+''');
+    expect(
+        computer.instrumentedCode,
+        '''
+import 'package:flutter/widgets.dart';
+import '${libFile.toUri()}';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.forDesignTime();
+
+  @override
+  Widget build(BuildContext context) {
+    return _registerWidgetInstance(0, new Container());
+  }
+}
+''' +
+            FlutterOutlineComputer.RENDER_APPEND);
+  }
+
+  test_render_instrumentedCode_rewriteUri_package() async {
+    packageMap['test'] = [newFolder('/home/user/test/lib')];
+
+    testPath = resourceProvider.convertPath('/home/user/test/lib/test.dart');
+    newFile('/home/user/test/lib/my_lib.dart', content: '');
+
+    await _computeOutline('''
+import 'package:flutter/widgets.dart';
+import 'my_lib.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.forDesignTime();
+
+  @override
+  Widget build(BuildContext context) {
+    return new Container();
+  }
+}
+''');
+    expect(
+        computer.instrumentedCode,
+        '''
+import 'package:flutter/widgets.dart';
+import 'package:test/my_lib.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.forDesignTime();
+
+  @override
+  Widget build(BuildContext context) {
+    return _registerWidgetInstance(0, new Container());
+  }
+}
+''' +
+            FlutterOutlineComputer.RENDER_APPEND);
+  }
+
   test_render_stateful_createState_blockBody() async {
     FlutterOutline unitOutline = await _computeOutline('''
 import 'package:flutter/widgets.dart';
@@ -449,27 +561,6 @@
     expect(myWidget.stateOffset, isNull);
     expect(myWidget.stateLength, isNull);
 
-    expect(
-        computer.instrumentedCode,
-        r'''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return _registerWidgetInstance(0, new Row(
-      children: <Widget>[
-        _registerWidgetInstance(1, new Text('aaa')),
-        _registerWidgetInstance(2, new Text('bbb')),
-      ],
-    ));
-  }
-}
-''' +
-            FlutterOutlineComputer.RENDER_APPEND);
-
     var build = myWidget.children[1];
 
     var row = build.children[0];
diff --git a/pkg/analyzer/lib/source/analysis_options_provider.dart b/pkg/analyzer/lib/source/analysis_options_provider.dart
index 8c47f07..40b53e7 100644
--- a/pkg/analyzer/lib/source/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/source/analysis_options_provider.dart
@@ -2,8 +2,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.
 
-library analyzer.source.analysis_options_provider;
-
 import 'dart:core';
 
 import 'package:analyzer/file_system/file_system.dart';
@@ -155,7 +153,7 @@
   ///
   Map<String, YamlNode> merge(
           Map<String, YamlNode> defaults, Map<String, YamlNode> overrides) =>
-      new Merger().merge(defaults, overrides) as Map<String, YamlNode>;
+      new Merger().mergeMap(defaults, overrides);
 
   /// Read the contents of [source] as a string.
   /// Returns null if source is null or does not exist.
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 8f6af83..2703beb 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -196,9 +196,8 @@
   //
   // Hidden flags and options.
   //
-  parser.addOption(defineVariableOption,
+  parser.addMultiOption(defineVariableOption,
       abbr: 'D',
-      allowMultiple: true,
       help: 'Define environment variables. For example, "-Dfoo=bar" defines an '
           'environment variable named "foo" whose value is "bar".',
       hide: hide);
@@ -291,7 +290,7 @@
   Set<String> knownAbbreviations = new HashSet<String>();
   parser.options.forEach((String name, Option option) {
     knownOptions.add(name);
-    String abbreviation = option.abbreviation;
+    String abbreviation = option.abbr;
     if (abbreviation != null) {
       knownAbbreviations.add(abbreviation);
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 2b6e7ac..43a1d47 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -94,7 +94,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 52;
+  static const int DATA_VERSION = 53;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
@@ -326,11 +326,8 @@
 
   /**
    * The current analysis session.
-   *
-   * TODO(brianwilkerson) Create a new session when the current session might
-   * produce inconsistent results.
    */
-  AnalysisSession _currentSession;
+  AnalysisSessionImpl _currentSession;
 
   /**
    * Create a new instance of [AnalysisDriver].
@@ -356,7 +353,7 @@
         _sourceFactory = sourceFactory.clone(),
         _sdkBundle = sdkBundle,
         _externalSummaries = externalSummaries {
-    _currentSession = new AnalysisSessionImpl(this);
+    _createNewSession();
     _onResults = _resultController.stream.asBroadcastStream();
     _testView = new AnalysisDriverTestView(this);
     _createFileTracker();
@@ -1122,6 +1119,7 @@
    * of state.
    */
   void _changeHook() {
+    _createNewSession();
     _priorityResults.clear();
     _scheduler.notify(this);
   }
@@ -1238,6 +1236,8 @@
             }
           }
 
+          _currentSession.put(libraryElement: resolvedUnit?.element?.library);
+
           // Return the result, full or partial.
           _logger.writeln('Computed new analysis result.');
           AnalysisResult result = _getAnalysisResultFromBytes(
@@ -1385,6 +1385,13 @@
   }
 
   /**
+   * Create a new analysis session, so invalidating the current one.
+   */
+  void _createNewSession() {
+    _currentSession = new AnalysisSessionImpl(this);
+  }
+
+  /**
    * Fill [_salt] with data.
    */
   void _fillSalt() {
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index b8ff388..9125b01 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -32,6 +32,11 @@
   TypeSystem _typeSystem;
 
   /**
+   * The cache of libraries for URIs.
+   */
+  final Map<String, LibraryElement> _uriToLibraryCache = {};
+
+  /**
    * Initialize a newly created analysis session.
    */
   AnalysisSessionImpl(this._driver);
@@ -70,9 +75,14 @@
   }
 
   @override
-  Future<LibraryElement> getLibraryByUri(String uri) {
+  Future<LibraryElement> getLibraryByUri(String uri) async {
     _checkConsistency();
-    return _driver.getLibraryByUri(uri);
+    var libraryElement = _uriToLibraryCache[uri];
+    if (libraryElement == null) {
+      libraryElement = await _driver.getLibraryByUri(uri);
+      _fillUriToLibraryCache(libraryElement);
+    }
+    return libraryElement;
   }
 
   @override
@@ -113,6 +123,18 @@
   }
 
   /**
+   * Put information into the session, so it is available even though it is
+   * not yet requested by the user. We want to put only information that is
+   * already available directly, or can be derived from available information
+   * very cheaply.
+   */
+  void put({LibraryElement libraryElement}) {
+    if (libraryElement != null) {
+      _fillUriToLibraryCache(libraryElement);
+    }
+  }
+
+  /**
    * Check to see that results from this session will be consistent, and throw
    * an [InconsistentAnalysisException] if they might not be.
    */
@@ -121,4 +143,21 @@
       throw new InconsistentAnalysisException();
     }
   }
+
+  /**
+   * Fill the [_uriToLibraryCache] with libraries referenced from the
+   * given [library].
+   */
+  void _fillUriToLibraryCache(LibraryElement library) {
+    Source source = library.source;
+    if (source == null) {
+      print('zzzzz');
+    }
+    String uri = source.uri.toString();
+    if (_uriToLibraryCache[uri] == null) {
+      _uriToLibraryCache[uri] = library;
+      library.importedLibraries.forEach(_fillUriToLibraryCache);
+      library.exportedLibraries.forEach(_fillUriToLibraryCache);
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 63c6633..f916e4d 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -2,8 +2,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.
 
-library analyzer.src.dart.ast.ast;
-
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -92,7 +90,7 @@
    * The documentation comment associated with this node, or `null` if this node
    * does not have a documentation comment associated with it.
    */
-  Comment _comment;
+  CommentImpl _comment;
 
   /**
    * The annotations associated with this node.
@@ -132,7 +130,7 @@
 
   @override
   void set documentationComment(Comment comment) {
-    _comment = _becomeParentOf(comment as AstNodeImpl);
+    _comment = _becomeParentOf(comment as CommentImpl);
   }
 
   @override
@@ -209,7 +207,7 @@
    * The name of the class defining the constructor that is being invoked or the
    * name of the field that is being referenced.
    */
-  Identifier _name;
+  IdentifierImpl _name;
 
   /**
    * The period before the constructor name, or `null` if this annotation is not
@@ -222,13 +220,13 @@
    * The name of the constructor being invoked, or `null` if this annotation is
    * not the invocation of a named constructor.
    */
-  SimpleIdentifier _constructorName;
+  SimpleIdentifierImpl _constructorName;
 
   /**
    * The arguments to the constructor being invoked, or `null` if this
    * annotation is not the invocation of a constructor.
    */
-  ArgumentList _arguments;
+  ArgumentListImpl _arguments;
 
   /**
    * The element associated with this annotation, or `null` if the AST structure
@@ -260,7 +258,7 @@
 
   @override
   void set arguments(ArgumentList arguments) {
-    _arguments = _becomeParentOf(arguments as AstNodeImpl);
+    _arguments = _becomeParentOf(arguments as ArgumentListImpl);
   }
 
   @override
@@ -279,7 +277,7 @@
 
   @override
   void set constructorName(SimpleIdentifier name) {
-    _constructorName = _becomeParentOf(name as AstNodeImpl);
+    _constructorName = _becomeParentOf(name as SimpleIdentifierImpl);
   }
 
   @override
@@ -312,7 +310,7 @@
 
   @override
   void set name(Identifier name) {
-    _name = _becomeParentOf(name as AstNodeImpl);
+    _name = _becomeParentOf(name as IdentifierImpl);
   }
 
   @override
@@ -497,7 +495,7 @@
   /**
    * The expression used to compute the value being cast.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The 'as' operator.
@@ -508,7 +506,7 @@
   /**
    * The type being cast to.
    */
-  TypeAnnotation _type;
+  TypeAnnotationImpl _type;
 
   /**
    * Initialize a newly created as expression.
@@ -534,7 +532,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -545,7 +543,7 @@
 
   @override
   void set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as AstNodeImpl);
+    _type = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -575,7 +573,7 @@
   /**
    * The condition that is being asserted to be `true`.
    */
-  Expression _condition;
+  ExpressionImpl _condition;
 
   @override
   Token comma;
@@ -584,7 +582,7 @@
    * The message to report if the assertion fails, or `null` if no message was
    * supplied.
    */
-  Expression _message;
+  ExpressionImpl _message;
 
   @override
   Token rightParenthesis;
@@ -620,7 +618,7 @@
 
   @override
   void set condition(Expression condition) {
-    _condition = _becomeParentOf(condition as AstNodeImpl);
+    _condition = _becomeParentOf(condition as ExpressionImpl);
   }
 
   @override
@@ -631,7 +629,7 @@
 
   @override
   void set message(Expression expression) {
-    _message = _becomeParentOf(expression as AstNodeImpl);
+    _message = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -660,7 +658,7 @@
   /**
    * The condition that is being asserted to be `true`.
    */
-  Expression _condition;
+  ExpressionImpl _condition;
 
   @override
   Token comma;
@@ -669,7 +667,7 @@
    * The message to report if the assertion fails, or `null` if no message was
    * supplied.
    */
-  Expression _message;
+  ExpressionImpl _message;
 
   @override
   Token rightParenthesis;
@@ -710,7 +708,7 @@
 
   @override
   void set condition(Expression condition) {
-    _condition = _becomeParentOf(condition as AstNodeImpl);
+    _condition = _becomeParentOf(condition as ExpressionImpl);
   }
 
   @override
@@ -721,7 +719,7 @@
 
   @override
   void set message(Expression expression) {
-    _message = _becomeParentOf(expression as AstNodeImpl);
+    _message = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -745,7 +743,7 @@
   /**
    * The expression used to compute the left hand side.
    */
-  Expression _leftHandSide;
+  ExpressionImpl _leftHandSide;
 
   /**
    * The assignment operator being applied.
@@ -756,7 +754,7 @@
   /**
    * The expression used to compute the right hand side.
    */
-  Expression _rightHandSide;
+  ExpressionImpl _rightHandSide;
 
   /**
    * The element associated with the operator based on the static type of the
@@ -825,7 +823,7 @@
 
   @override
   void set leftHandSide(Expression expression) {
-    _leftHandSide = _becomeParentOf(expression as AstNodeImpl);
+    _leftHandSide = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -836,7 +834,7 @@
 
   @override
   void set rightHandSide(Expression expression) {
-    _rightHandSide = _becomeParentOf(expression as AstNodeImpl);
+    _rightHandSide = _becomeParentOf(expression as ExpressionImpl);
   }
 
   /**
@@ -1020,7 +1018,7 @@
   /**
    * Make this node the parent of the given [child] node. Return the child node.
    */
-  AstNode _becomeParentOf(AstNodeImpl child) {
+  T _becomeParentOf<T extends AstNodeImpl>(T child) {
     if (child != null) {
       child._parent = this;
     }
@@ -1044,7 +1042,7 @@
   /**
    * The expression whose value is being waited on.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * Initialize a newly created await expression.
@@ -1073,7 +1071,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -1098,7 +1096,7 @@
   /**
    * The expression used to compute the left operand.
    */
-  Expression _leftOperand;
+  ExpressionImpl _leftOperand;
 
   /**
    * The binary operator being applied.
@@ -1109,7 +1107,7 @@
   /**
    * The expression used to compute the right operand.
    */
-  Expression _rightOperand;
+  ExpressionImpl _rightOperand;
 
   /**
    * The element associated with the operator based on the static type of the
@@ -1161,7 +1159,7 @@
 
   @override
   void set leftOperand(Expression expression) {
-    _leftOperand = _becomeParentOf(expression as AstNodeImpl);
+    _leftOperand = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -1172,7 +1170,7 @@
 
   @override
   void set rightOperand(Expression expression) {
-    _rightOperand = _becomeParentOf(expression as AstNodeImpl);
+    _rightOperand = _becomeParentOf(expression as ExpressionImpl);
   }
 
   /**
@@ -1244,7 +1242,7 @@
   /**
    * The block representing the body of the function.
    */
-  Block _block;
+  BlockImpl _block;
 
   /**
    * Initialize a newly created function body consisting of a block of
@@ -1269,7 +1267,7 @@
 
   @override
   void set block(Block block) {
-    _block = _becomeParentOf(block as AstNodeImpl);
+    _block = _becomeParentOf(block as BlockImpl);
   }
 
   @override
@@ -1414,7 +1412,7 @@
   /**
    * The label associated with the statement, or `null` if there is no label.
    */
-  SimpleIdentifier _label;
+  SimpleIdentifierImpl _label;
 
   /**
    * The semicolon terminating the statement.
@@ -1458,7 +1456,7 @@
 
   @override
   void set label(SimpleIdentifier identifier) {
-    _label = _becomeParentOf(identifier as AstNodeImpl);
+    _label = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -1491,7 +1489,7 @@
   /**
    * The target of the cascade sections.
    */
-  Expression _target;
+  ExpressionImpl _target;
 
   /**
    * The cascade sections sharing the common target.
@@ -1530,7 +1528,7 @@
 
   @override
   void set target(Expression target) {
-    _target = _becomeParentOf(target as AstNodeImpl);
+    _target = _becomeParentOf(target as ExpressionImpl);
   }
 
   @override
@@ -1565,7 +1563,7 @@
    * The type of exceptions caught by this catch clause, or `null` if this catch
    * clause catches every type of exception.
    */
-  TypeAnnotation _exceptionType;
+  TypeAnnotationImpl _exceptionType;
 
   /**
    * The token representing the 'catch' keyword, or `null` if there is no
@@ -1584,7 +1582,7 @@
    * The parameter whose value will be the exception that was thrown, or `null`
    * if there is no 'catch' keyword.
    */
-  SimpleIdentifier _exceptionParameter;
+  SimpleIdentifierImpl _exceptionParameter;
 
   /**
    * The comma separating the exception parameter from the stack trace
@@ -1597,7 +1595,7 @@
    * The parameter whose value will be the stack trace associated with the
    * exception, or `null` if there is no stack trace parameter.
    */
-  SimpleIdentifier _stackTraceParameter;
+  SimpleIdentifierImpl _stackTraceParameter;
 
   /**
    * The right parenthesis, or `null` if there is no 'catch' keyword.
@@ -1608,7 +1606,7 @@
   /**
    * The body of the catch block.
    */
-  Block _body;
+  BlockImpl _body;
 
   /**
    * Initialize a newly created catch clause. The [onKeyword] and
@@ -1645,7 +1643,7 @@
 
   @override
   void set body(Block block) {
-    _body = _becomeParentOf(block as AstNodeImpl);
+    _body = _becomeParentOf(block as BlockImpl);
   }
 
   @override
@@ -1668,7 +1666,7 @@
 
   @override
   void set exceptionParameter(SimpleIdentifier parameter) {
-    _exceptionParameter = _becomeParentOf(parameter as AstNodeImpl);
+    _exceptionParameter = _becomeParentOf(parameter as SimpleIdentifierImpl);
   }
 
   @override
@@ -1676,7 +1674,7 @@
 
   @override
   void set exceptionType(TypeAnnotation exceptionType) {
-    _exceptionType = _becomeParentOf(exceptionType as AstNodeImpl);
+    _exceptionType = _becomeParentOf(exceptionType as TypeAnnotationImpl);
   }
 
   @override
@@ -1684,7 +1682,7 @@
 
   @override
   void set stackTraceParameter(SimpleIdentifier parameter) {
-    _stackTraceParameter = _becomeParentOf(parameter as AstNodeImpl);
+    _stackTraceParameter = _becomeParentOf(parameter as SimpleIdentifierImpl);
   }
 
   @override
@@ -1759,31 +1757,31 @@
    * The type parameters for the class, or `null` if the class does not have any
    * type parameters.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   /**
    * The extends clause for the class, or `null` if the class does not extend
    * any other class.
    */
-  ExtendsClause _extendsClause;
+  ExtendsClauseImpl _extendsClause;
 
   /**
    * The with clause for the class, or `null` if the class does not have a with
    * clause.
    */
-  WithClause _withClause;
+  WithClauseImpl _withClause;
 
   /**
    * The implements clause for the class, or `null` if the class does not
    * implement any interfaces.
    */
-  ImplementsClause _implementsClause;
+  ImplementsClauseImpl _implementsClause;
 
   /**
    * The native clause for the class, or `null` if the class does not have a
    * native clause.
    */
-  NativeClause _nativeClause;
+  NativeClauseImpl _nativeClause;
 
   /**
    * The left curly bracket.
@@ -1813,7 +1811,7 @@
    * not have any members.
    */
   ClassDeclarationImpl(
-      Comment comment,
+      CommentImpl comment,
       List<Annotation> metadata,
       this.abstractKeyword,
       this.classKeyword,
@@ -1858,7 +1856,7 @@
 
   @override
   void set extendsClause(ExtendsClause extendsClause) {
-    _extendsClause = _becomeParentOf(extendsClause as AstNodeImpl);
+    _extendsClause = _becomeParentOf(extendsClause as ExtendsClauseImpl);
   }
 
   @override
@@ -1874,7 +1872,8 @@
 
   @override
   void set implementsClause(ImplementsClause implementsClause) {
-    _implementsClause = _becomeParentOf(implementsClause as AstNodeImpl);
+    _implementsClause =
+        _becomeParentOf(implementsClause as ImplementsClauseImpl);
   }
 
   @override
@@ -1888,7 +1887,7 @@
 
   @override
   void set nativeClause(NativeClause nativeClause) {
-    _nativeClause = _becomeParentOf(nativeClause as AstNodeImpl);
+    _nativeClause = _becomeParentOf(nativeClause as NativeClauseImpl);
   }
 
   @override
@@ -1896,7 +1895,7 @@
 
   @override
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   @override
@@ -1904,7 +1903,7 @@
 
   @override
   void set withClause(WithClause withClause) {
-    _withClause = _becomeParentOf(withClause as AstNodeImpl);
+    _withClause = _becomeParentOf(withClause as WithClauseImpl);
   }
 
   @override
@@ -1989,7 +1988,7 @@
    * [comment] and [metadata] can be `null` if the member does not have the
    * corresponding attribute.
    */
-  ClassMemberImpl(Comment comment, List<Annotation> metadata)
+  ClassMemberImpl(CommentImpl comment, List<Annotation> metadata)
       : super(comment, metadata);
 }
 
@@ -2007,7 +2006,7 @@
    * The type parameters for the class, or `null` if the class does not have any
    * type parameters.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   /**
    * The token for the '=' separating the name from the definition.
@@ -2025,18 +2024,18 @@
   /**
    * The name of the superclass of the class being declared.
    */
-  TypeName _superclass;
+  TypeNameImpl _superclass;
 
   /**
    * The with clause for this class.
    */
-  WithClause _withClause;
+  WithClauseImpl _withClause;
 
   /**
    * The implements clause for this class, or `null` if there is no implements
    * clause.
    */
-  ImplementsClause _implementsClause;
+  ImplementsClauseImpl _implementsClause;
 
   /**
    * Initialize a newly created class type alias. Either or both of the
@@ -2093,7 +2092,8 @@
 
   @override
   void set implementsClause(ImplementsClause implementsClause) {
-    _implementsClause = _becomeParentOf(implementsClause as AstNodeImpl);
+    _implementsClause =
+        _becomeParentOf(implementsClause as ImplementsClauseImpl);
   }
 
   @override
@@ -2104,7 +2104,7 @@
 
   @override
   void set superclass(TypeName superclass) {
-    _superclass = _becomeParentOf(superclass as AstNodeImpl);
+    _superclass = _becomeParentOf(superclass as TypeNameImpl);
   }
 
   @override
@@ -2112,7 +2112,7 @@
 
   @override
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   @override
@@ -2120,7 +2120,7 @@
 
   @override
   void set withClause(WithClause withClause) {
-    _withClause = _becomeParentOf(withClause as AstNodeImpl);
+    _withClause = _becomeParentOf(withClause as WithClauseImpl);
   }
 
   @override
@@ -2283,7 +2283,7 @@
   /**
    * The identifier being referenced.
    */
-  Identifier _identifier;
+  IdentifierImpl _identifier;
 
   /**
    * Initialize a newly created reference to a Dart element. The [newKeyword]
@@ -2308,7 +2308,7 @@
 
   @override
   void set identifier(Identifier identifier) {
-    _identifier = _becomeParentOf(identifier as AstNodeImpl);
+    _identifier = _becomeParentOf(identifier as IdentifierImpl);
   }
 
   @override
@@ -2388,7 +2388,7 @@
    * The script tag at the beginning of the compilation unit, or `null` if there
    * is no script tag in this compilation unit.
    */
-  ScriptTag _scriptTag;
+  ScriptTagImpl _scriptTag;
 
   /**
    * The directives contained in this compilation unit.
@@ -2472,7 +2472,7 @@
 
   @override
   void set scriptTag(ScriptTag scriptTag) {
-    _scriptTag = _becomeParentOf(scriptTag as AstNodeImpl);
+    _scriptTag = _becomeParentOf(scriptTag as ScriptTagImpl);
   }
 
   @override
@@ -2535,7 +2535,7 @@
    * of the [comment] and [metadata] can be `null` if the member does not have
    * the corresponding attribute.
    */
-  CompilationUnitMemberImpl(Comment comment, List<Annotation> metadata)
+  CompilationUnitMemberImpl(CommentImpl comment, List<Annotation> metadata)
       : super(comment, metadata);
 }
 
@@ -2550,7 +2550,7 @@
   /**
    * The condition used to determine which of the expressions is executed next.
    */
-  Expression _condition;
+  ExpressionImpl _condition;
 
   /**
    * The token used to separate the condition from the then expression.
@@ -2561,7 +2561,7 @@
   /**
    * The expression that is executed if the condition evaluates to `true`.
    */
-  Expression _thenExpression;
+  ExpressionImpl _thenExpression;
 
   /**
    * The token used to separate the then expression from the else expression.
@@ -2572,7 +2572,7 @@
   /**
    * The expression that is executed if the condition evaluates to `false`.
    */
-  Expression _elseExpression;
+  ExpressionImpl _elseExpression;
 
   /**
    * Initialize a newly created conditional expression.
@@ -2604,7 +2604,7 @@
 
   @override
   void set condition(Expression expression) {
-    _condition = _becomeParentOf(expression as AstNodeImpl);
+    _condition = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -2612,7 +2612,7 @@
 
   @override
   void set elseExpression(Expression expression) {
-    _elseExpression = _becomeParentOf(expression as AstNodeImpl);
+    _elseExpression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -2626,7 +2626,7 @@
 
   @override
   void set thenExpression(Expression expression) {
-    _thenExpression = _becomeParentOf(expression as AstNodeImpl);
+    _thenExpression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -2660,17 +2660,17 @@
   @override
   Token leftParenthesis;
 
-  DottedName _name;
+  DottedNameImpl _name;
 
   @override
   Token equalToken;
 
-  StringLiteral _value;
+  StringLiteralImpl _value;
 
   @override
   Token rightParenthesis;
 
-  StringLiteral _uri;
+  StringLiteralImpl _uri;
 
   @override
   Source uriSource;
@@ -2711,7 +2711,7 @@
   @deprecated
   @override
   void set libraryUri(StringLiteral libraryUri) {
-    _uri = _becomeParentOf(libraryUri as AstNodeImpl);
+    _uri = _becomeParentOf(libraryUri as StringLiteralImpl);
   }
 
   @override
@@ -2719,7 +2719,7 @@
 
   @override
   void set name(DottedName name) {
-    _name = _becomeParentOf(name as AstNodeImpl);
+    _name = _becomeParentOf(name as DottedNameImpl);
   }
 
   @override
@@ -2727,7 +2727,7 @@
 
   @override
   void set uri(StringLiteral uri) {
-    _uri = _becomeParentOf(uri as AstNodeImpl);
+    _uri = _becomeParentOf(uri as StringLiteralImpl);
   }
 
   @override
@@ -2735,7 +2735,7 @@
 
   @override
   void set value(StringLiteral value) {
-    _value = _becomeParentOf(value as AstNodeImpl);
+    _value = _becomeParentOf(value as StringLiteralImpl);
   }
 
   @override
@@ -2829,7 +2829,7 @@
    * which the constructor is being declared if the constructor is the
    * implementation of a factory constructor.
    */
-  Identifier _returnType;
+  IdentifierImpl _returnType;
 
   /**
    * The token for the period before the constructor name, or `null` if the
@@ -2842,12 +2842,12 @@
    * The name of the constructor, or `null` if the constructor being declared is
    * unnamed.
    */
-  SimpleIdentifier _name;
+  SimpleIdentifierImpl _name;
 
   /**
    * The parameters associated with the constructor.
    */
-  FormalParameterList _parameters;
+  FormalParameterListImpl _parameters;
 
   /**
    * The token for the separator (colon or equals) before the initializer list
@@ -2865,13 +2865,13 @@
    * The name of the constructor to which this constructor will be redirected,
    * or `null` if this is not a redirecting factory constructor.
    */
-  ConstructorName _redirectedConstructor;
+  ConstructorNameImpl _redirectedConstructor;
 
   /**
    * The body of the constructor, or `null` if the constructor does not have a
    * body.
    */
-  FunctionBody _body;
+  FunctionBodyImpl _body;
 
   /**
    * The element associated with this constructor, or `null` if the AST
@@ -2925,7 +2925,7 @@
 
   @override
   void set body(FunctionBody functionBody) {
-    _body = _becomeParentOf(functionBody as AstNodeImpl);
+    _body = _becomeParentOf(functionBody as FunctionBodyImpl);
   }
 
   @override
@@ -2970,7 +2970,7 @@
 
   @override
   void set name(SimpleIdentifier identifier) {
-    _name = _becomeParentOf(identifier as AstNodeImpl);
+    _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -2978,7 +2978,7 @@
 
   @override
   void set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as AstNodeImpl);
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
   @override
@@ -2987,7 +2987,7 @@
   @override
   void set redirectedConstructor(ConstructorName redirectedConstructor) {
     _redirectedConstructor =
-        _becomeParentOf(redirectedConstructor as AstNodeImpl);
+        _becomeParentOf(redirectedConstructor as ConstructorNameImpl);
   }
 
   @override
@@ -2995,7 +2995,7 @@
 
   @override
   void set returnType(Identifier typeName) {
-    _returnType = _becomeParentOf(typeName as AstNodeImpl);
+    _returnType = _becomeParentOf(typeName as IdentifierImpl);
   }
 
   @override
@@ -3038,7 +3038,7 @@
   /**
    * The name of the field being initialized.
    */
-  SimpleIdentifier _fieldName;
+  SimpleIdentifierImpl _fieldName;
 
   /**
    * The token for the equal sign between the field name and the expression.
@@ -3049,7 +3049,7 @@
   /**
    * The expression computing the value to which the field will be initialized.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * Initialize a newly created field initializer to initialize the field with
@@ -3086,7 +3086,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -3094,7 +3094,7 @@
 
   @override
   void set fieldName(SimpleIdentifier identifier) {
-    _fieldName = _becomeParentOf(identifier as AstNodeImpl);
+    _fieldName = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -3129,7 +3129,7 @@
   /**
    * The name of the type defining the constructor.
    */
-  TypeName _type;
+  TypeNameImpl _type;
 
   /**
    * The token for the period before the constructor name, or `null` if the
@@ -3142,7 +3142,7 @@
    * The name of the constructor, or `null` if the specified constructor is the
    * unnamed constructor.
    */
-  SimpleIdentifier _name;
+  SimpleIdentifierImpl _name;
 
   /**
    * The element associated with this constructor name based on static type
@@ -3182,7 +3182,7 @@
 
   @override
   void set name(SimpleIdentifier name) {
-    _name = _becomeParentOf(name as AstNodeImpl);
+    _name = _becomeParentOf(name as SimpleIdentifierImpl);
   }
 
   @override
@@ -3190,7 +3190,7 @@
 
   @override
   void set type(TypeName type) {
-    _type = _becomeParentOf(type as AstNodeImpl);
+    _type = _becomeParentOf(type as TypeNameImpl);
   }
 
   @override
@@ -3219,7 +3219,7 @@
   /**
    * The label associated with the statement, or `null` if there is no label.
    */
-  SimpleIdentifier _label;
+  SimpleIdentifierImpl _label;
 
   /**
    * The semicolon terminating the statement.
@@ -3261,7 +3261,7 @@
 
   @override
   void set label(SimpleIdentifier identifier) {
-    _label = _becomeParentOf(identifier as AstNodeImpl);
+    _label = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -3284,7 +3284,7 @@
    * [metadata] can be `null` if the declaration does not have the corresponding
    * attribute.
    */
-  DeclarationImpl(Comment comment, List<Annotation> metadata)
+  DeclarationImpl(CommentImpl comment, List<Annotation> metadata)
       : super(comment, metadata);
 }
 
@@ -3307,12 +3307,12 @@
    * The name of the declared type of the parameter, or `null` if the parameter
    * does not have a declared type.
    */
-  TypeAnnotation _type;
+  TypeAnnotationImpl _type;
 
   /**
    * The name of the variable being declared.
    */
-  SimpleIdentifier _identifier;
+  SimpleIdentifierImpl _identifier;
 
   /**
    * Initialize a newly created formal parameter. Either or both of the
@@ -3357,7 +3357,7 @@
 
   @override
   void set identifier(SimpleIdentifier identifier) {
-    _identifier = _becomeParentOf(identifier as AstNodeImpl);
+    _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -3371,7 +3371,7 @@
 
   @override
   void set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as AstNodeImpl);
+    _type = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -3419,7 +3419,7 @@
   /**
    * The formal parameter with which the default value is associated.
    */
-  NormalFormalParameter _parameter;
+  NormalFormalParameterImpl _parameter;
 
   /**
    * The kind of this parameter.
@@ -3438,7 +3438,7 @@
    * The expression computing the default value for the parameter, or `null` if
    * there is no default value.
    */
-  Expression _defaultValue;
+  ExpressionImpl _defaultValue;
 
   /**
    * Initialize a newly created default formal parameter. The [separator] and
@@ -3465,7 +3465,7 @@
 
   @override
   void set defaultValue(Expression expression) {
-    _defaultValue = _becomeParentOf(expression as AstNodeImpl);
+    _defaultValue = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -3493,7 +3493,7 @@
 
   @override
   void set parameter(NormalFormalParameter formalParameter) {
-    _parameter = _becomeParentOf(formalParameter as AstNodeImpl);
+    _parameter = _becomeParentOf(formalParameter as NormalFormalParameterImpl);
   }
 
   @override
@@ -3529,7 +3529,7 @@
    * [metadata] can be `null` if the directive does not have the corresponding
    * attribute.
    */
-  DirectiveImpl(Comment comment, List<Annotation> metadata)
+  DirectiveImpl(CommentImpl comment, List<Annotation> metadata)
       : super(comment, metadata);
 
   @override
@@ -3559,7 +3559,7 @@
   /**
    * The body of the loop.
    */
-  Statement _body;
+  StatementImpl _body;
 
   /**
    * The token representing the 'while' keyword.
@@ -3575,7 +3575,7 @@
   /**
    * The condition that determines when the loop will terminate.
    */
-  Expression _condition;
+  ExpressionImpl _condition;
 
   /**
    * The right parenthesis.
@@ -3612,7 +3612,7 @@
 
   @override
   void set body(Statement statement) {
-    _body = _becomeParentOf(statement as AstNodeImpl);
+    _body = _becomeParentOf(statement as StatementImpl);
   }
 
   @override
@@ -3630,7 +3630,7 @@
 
   @override
   void set condition(Expression expression) {
-    _condition = _becomeParentOf(expression as AstNodeImpl);
+    _condition = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -3822,7 +3822,7 @@
   /**
    * The name of the constant.
    */
-  SimpleIdentifier _name;
+  SimpleIdentifierImpl _name;
 
   /**
    * Initialize a newly created enum constant declaration. Either or both of the
@@ -3854,7 +3854,7 @@
 
   @override
   void set name(SimpleIdentifier name) {
-    _name = _becomeParentOf(name as AstNodeImpl);
+    _name = _becomeParentOf(name as SimpleIdentifierImpl);
   }
 
   @override
@@ -3906,10 +3906,10 @@
    * value.
    */
   EnumDeclarationImpl(
-      Comment comment,
+      CommentImpl comment,
       List<Annotation> metadata,
       this.enumKeyword,
-      SimpleIdentifier name,
+      SimpleIdentifierImpl name,
       this.leftBracket,
       List<EnumConstantDeclaration> constants,
       this.rightBracket)
@@ -3975,10 +3975,10 @@
    * are no combinators.
    */
   ExportDirectiveImpl(
-      Comment comment,
+      CommentImpl comment,
       List<Annotation> metadata,
       Token keyword,
-      StringLiteral libraryUri,
+      StringLiteralImpl libraryUri,
       List<Configuration> configurations,
       List<Combinator> combinators,
       Token semicolon)
@@ -4037,7 +4037,7 @@
   /**
    * The expression representing the body of the function.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The semicolon terminating the statement.
@@ -4083,7 +4083,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -4268,7 +4268,7 @@
   /**
    * The expression that comprises the statement.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The semicolon terminating the statement, or `null` if the expression is a
@@ -4304,7 +4304,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -4335,7 +4335,7 @@
   /**
    * The name of the class that is being extended.
    */
-  TypeName _superclass;
+  TypeNameImpl _superclass;
 
   /**
    * Initialize a newly created extends clause.
@@ -4359,7 +4359,7 @@
 
   @override
   void set superclass(TypeName name) {
-    _superclass = _becomeParentOf(name as AstNodeImpl);
+    _superclass = _becomeParentOf(name as TypeNameImpl);
   }
 
   @override
@@ -4394,7 +4394,7 @@
   /**
    * The fields being declared.
    */
-  VariableDeclarationList _fieldList;
+  VariableDeclarationListImpl _fieldList;
 
   /**
    * The semicolon terminating the declaration.
@@ -4434,7 +4434,7 @@
 
   @override
   void set fields(VariableDeclarationList fields) {
-    _fieldList = _becomeParentOf(fields as AstNodeImpl);
+    _fieldList = _becomeParentOf(fields as VariableDeclarationListImpl);
   }
 
   @override
@@ -4480,7 +4480,7 @@
    * The name of the declared type of the parameter, or `null` if the parameter
    * does not have a declared type.
    */
-  TypeAnnotation _type;
+  TypeAnnotationImpl _type;
 
   /**
    * The token representing the 'this' keyword.
@@ -4498,13 +4498,13 @@
    * The type parameters associated with the method, or `null` if the method is
    * not a generic method.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   /**
    * The parameters of the function-typed parameter, or `null` if this is not a
    * function-typed field formal parameter.
    */
-  FormalParameterList _parameters;
+  FormalParameterListImpl _parameters;
 
   /**
    * Initialize a newly created formal parameter. Either or both of the
@@ -4575,7 +4575,7 @@
 
   @override
   void set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as AstNodeImpl);
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
   @override
@@ -4583,7 +4583,7 @@
 
   @override
   void set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as AstNodeImpl);
+    _type = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -4591,7 +4591,7 @@
 
   @override
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   @override
@@ -4638,12 +4638,12 @@
    * The declaration of the loop variable, or `null` if the loop variable is a
    * simple identifier.
    */
-  DeclaredIdentifier _loopVariable;
+  DeclaredIdentifierImpl _loopVariable;
 
   /**
    * The loop variable, or `null` if the loop variable is declared in the 'for'.
    */
-  SimpleIdentifier _identifier;
+  SimpleIdentifierImpl _identifier;
 
   /**
    * The token representing the 'in' keyword.
@@ -4654,7 +4654,7 @@
   /**
    * The expression evaluated to produce the iterator.
    */
-  Expression _iterable;
+  ExpressionImpl _iterable;
 
   /**
    * The right parenthesis.
@@ -4665,7 +4665,7 @@
   /**
    * The body of the loop.
    */
-  Statement _body;
+  StatementImpl _body;
 
   /**
    * Initialize a newly created for-each statement whose loop control variable
@@ -4713,7 +4713,7 @@
 
   @override
   void set body(Statement statement) {
-    _body = _becomeParentOf(statement as AstNodeImpl);
+    _body = _becomeParentOf(statement as StatementImpl);
   }
 
   @override
@@ -4736,7 +4736,7 @@
 
   @override
   void set identifier(SimpleIdentifier identifier) {
-    _identifier = _becomeParentOf(identifier as AstNodeImpl);
+    _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -4744,7 +4744,7 @@
 
   @override
   void set iterable(Expression expression) {
-    _iterable = _becomeParentOf(expression as AstNodeImpl);
+    _iterable = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -4752,7 +4752,7 @@
 
   @override
   void set loopVariable(DeclaredIdentifier variable) {
-    _loopVariable = _becomeParentOf(variable as AstNodeImpl);
+    _loopVariable = _becomeParentOf(variable as DeclaredIdentifierImpl);
   }
 
   @override
@@ -4958,14 +4958,14 @@
    * Note that a for statement cannot have both a variable list and an
    * initialization expression, but can validly have neither.
    */
-  VariableDeclarationList _variableList;
+  VariableDeclarationListImpl _variableList;
 
   /**
    * The initialization expression, or `null` if there is no initialization
    * expression. Note that a for statement cannot have both a variable list and
    * an initialization expression, but can validly have neither.
    */
-  Expression _initialization;
+  ExpressionImpl _initialization;
 
   /**
    * The semicolon separating the initializer and the condition.
@@ -4977,7 +4977,7 @@
    * The condition used to determine when to terminate the loop, or `null` if
    * there is no condition.
    */
-  Expression _condition;
+  ExpressionImpl _condition;
 
   /**
    * The semicolon separating the condition and the updater.
@@ -4999,7 +4999,7 @@
   /**
    * The body of the loop.
    */
-  Statement _body;
+  StatementImpl _body;
 
   /**
    * Initialize a newly created for statement. Either the [variableList] or the
@@ -5033,7 +5033,7 @@
 
   @override
   void set body(Statement statement) {
-    _body = _becomeParentOf(statement as AstNodeImpl);
+    _body = _becomeParentOf(statement as StatementImpl);
   }
 
   @override
@@ -5054,7 +5054,7 @@
 
   @override
   void set condition(Expression expression) {
-    _condition = _becomeParentOf(expression as AstNodeImpl);
+    _condition = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -5065,7 +5065,7 @@
 
   @override
   void set initialization(Expression initialization) {
-    _initialization = _becomeParentOf(initialization as AstNodeImpl);
+    _initialization = _becomeParentOf(initialization as ExpressionImpl);
   }
 
   @override
@@ -5076,7 +5076,8 @@
 
   @override
   void set variables(VariableDeclarationList variableList) {
-    _variableList = _becomeParentOf(variableList as AstNodeImpl);
+    _variableList =
+        _becomeParentOf(variableList as VariableDeclarationListImpl);
   }
 
   @override
@@ -5179,7 +5180,7 @@
   /**
    * The return type of the function, or `null` if no return type was declared.
    */
-  TypeAnnotation _returnType;
+  TypeAnnotationImpl _returnType;
 
   /**
    * The token representing the 'get' or 'set' keyword, or `null` if this is a
@@ -5191,7 +5192,7 @@
   /**
    * The function expression being wrapped.
    */
-  FunctionExpression _functionExpression;
+  FunctionExpressionImpl _functionExpression;
 
   /**
    * Initialize a newly created function declaration. Either or both of the
@@ -5247,7 +5248,8 @@
 
   @override
   void set functionExpression(FunctionExpression functionExpression) {
-    _functionExpression = _becomeParentOf(functionExpression as AstNodeImpl);
+    _functionExpression =
+        _becomeParentOf(functionExpression as FunctionExpressionImpl);
   }
 
   @override
@@ -5261,7 +5263,7 @@
 
   @override
   void set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as AstNodeImpl);
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -5284,7 +5286,7 @@
   /**
    * The function declaration being wrapped.
    */
-  FunctionDeclaration _functionDeclaration;
+  FunctionDeclarationImpl _functionDeclaration;
 
   /**
    * Initialize a newly created function declaration statement.
@@ -5309,7 +5311,8 @@
 
   @override
   void set functionDeclaration(FunctionDeclaration functionDeclaration) {
-    _functionDeclaration = _becomeParentOf(functionDeclaration as AstNodeImpl);
+    _functionDeclaration =
+        _becomeParentOf(functionDeclaration as FunctionDeclarationImpl);
   }
 
   @override
@@ -5334,17 +5337,17 @@
    * The type parameters associated with the method, or `null` if the method is
    * not a generic method.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   /**
    * The parameters associated with the function.
    */
-  FormalParameterList _parameters;
+  FormalParameterListImpl _parameters;
 
   /**
    * The body of the function, or `null` if this is an external function.
    */
-  FunctionBody _body;
+  FunctionBodyImpl _body;
 
   /**
    * The element associated with the function, or `null` if the AST structure
@@ -5382,7 +5385,7 @@
 
   @override
   void set body(FunctionBody functionBody) {
-    _body = _becomeParentOf(functionBody as AstNodeImpl);
+    _body = _becomeParentOf(functionBody as FunctionBodyImpl);
   }
 
   @override
@@ -5406,7 +5409,7 @@
 
   @override
   void set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as AstNodeImpl);
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
   @override
@@ -5417,7 +5420,7 @@
 
   @override
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   @override
@@ -5445,7 +5448,7 @@
   /**
    * The expression producing the function being invoked.
    */
-  Expression _function;
+  ExpressionImpl _function;
 
   /**
    * The element associated with the function being invoked based on static type
@@ -5496,7 +5499,7 @@
 
   @override
   void set function(Expression expression) {
-    _function = _becomeParentOf(expression as AstNodeImpl);
+    _function = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -5528,18 +5531,18 @@
    * The name of the return type of the function type being defined, or `null`
    * if no return type was given.
    */
-  TypeAnnotation _returnType;
+  TypeAnnotationImpl _returnType;
 
   /**
    * The type parameters for the function type, or `null` if the function type
    * does not have any type parameters.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   /**
    * The parameters associated with the function type.
    */
-  FormalParameterList _parameters;
+  FormalParameterListImpl _parameters;
 
   /**
    * Initialize a newly created function type alias. Either or both of the
@@ -5581,7 +5584,7 @@
 
   @override
   void set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as AstNodeImpl);
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
   @override
@@ -5589,7 +5592,7 @@
 
   @override
   void set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as AstNodeImpl);
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -5597,7 +5600,7 @@
 
   @override
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   @override
@@ -5625,18 +5628,18 @@
    * The return type of the function, or `null` if the function does not have a
    * return type.
    */
-  TypeAnnotation _returnType;
+  TypeAnnotationImpl _returnType;
 
   /**
    * The type parameters associated with the function, or `null` if the function
    * is not a generic function.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   /**
    * The parameters of the function-typed parameter.
    */
-  FormalParameterList _parameters;
+  FormalParameterListImpl _parameters;
 
   @override
   Token question;
@@ -5687,7 +5690,7 @@
 
   @override
   void set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as AstNodeImpl);
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
   @override
@@ -5695,7 +5698,7 @@
 
   @override
   void set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as AstNodeImpl);
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -5703,7 +5706,7 @@
 
   @override
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   @override
@@ -5755,7 +5758,7 @@
    * The name of the return type of the function type being defined, or
    * `null` if no return type was given.
    */
-  TypeAnnotation _returnType;
+  TypeAnnotationImpl _returnType;
 
   @override
   Token functionKeyword;
@@ -5764,12 +5767,12 @@
    * The type parameters for the function type, or `null` if the function type
    * does not have any type parameters.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   /**
    * The parameters associated with the function type.
    */
-  FormalParameterList _parameters;
+  FormalParameterListImpl _parameters;
 
   @override
   DartType type;
@@ -5806,7 +5809,7 @@
 
   @override
   void set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as AstNodeImpl);
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
   @override
@@ -5814,7 +5817,7 @@
 
   @override
   void set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as AstNodeImpl);
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   /**
@@ -5828,7 +5831,7 @@
    * [typeParameters].
    */
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   // TODO: implement type
@@ -5856,7 +5859,7 @@
    * The type parameters for the function type, or `null` if the function
    * type does not have any type parameters.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   @override
   Token equals;
@@ -5864,7 +5867,7 @@
   /**
    * The type of function being defined by the alias.
    */
-  GenericFunctionType _functionType;
+  GenericFunctionTypeImpl _functionType;
 
   /**
    * Returns a newly created generic type alias. Either or both of the
@@ -5873,10 +5876,10 @@
    * are no type parameters.
    */
   GenericTypeAliasImpl(
-      Comment comment,
+      CommentImpl comment,
       List<Annotation> metadata,
       Token typedefToken,
-      SimpleIdentifier name,
+      SimpleIdentifierImpl name,
       TypeParameterListImpl typeParameters,
       this.equals,
       GenericFunctionTypeImpl functionType,
@@ -5903,7 +5906,7 @@
 
   @override
   void set functionType(GenericFunctionType functionType) {
-    _functionType = _becomeParentOf(functionType as AstNodeImpl);
+    _functionType = _becomeParentOf(functionType as GenericFunctionTypeImpl);
   }
 
   @override
@@ -5911,7 +5914,7 @@
 
   @override
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   @override
@@ -6012,7 +6015,7 @@
   /**
    * The condition used to determine which of the statements is executed next.
    */
-  Expression _condition;
+  ExpressionImpl _condition;
 
   /**
    * The right parenthesis.
@@ -6023,7 +6026,7 @@
   /**
    * The statement that is executed if the condition evaluates to `true`.
    */
-  Statement _thenStatement;
+  StatementImpl _thenStatement;
 
   /**
    * The token representing the 'else' keyword, or `null` if there is no else
@@ -6036,7 +6039,7 @@
    * The statement that is executed if the condition evaluates to `false`, or
    * `null` if there is no else statement.
    */
-  Statement _elseStatement;
+  StatementImpl _elseStatement;
 
   /**
    * Initialize a newly created if statement. The [elseKeyword] and
@@ -6073,7 +6076,7 @@
 
   @override
   void set condition(Expression expression) {
-    _condition = _becomeParentOf(expression as AstNodeImpl);
+    _condition = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -6081,7 +6084,7 @@
 
   @override
   void set elseStatement(Statement statement) {
-    _elseStatement = _becomeParentOf(statement as AstNodeImpl);
+    _elseStatement = _becomeParentOf(statement as StatementImpl);
   }
 
   @override
@@ -6097,7 +6100,7 @@
 
   @override
   void set thenStatement(Statement statement) {
-    _thenStatement = _becomeParentOf(statement as AstNodeImpl);
+    _thenStatement = _becomeParentOf(statement as StatementImpl);
   }
 
   @override
@@ -6186,7 +6189,7 @@
    * The prefix to be used with the imported names, or `null` if the imported
    * names are not prefixed.
    */
-  SimpleIdentifier _prefix;
+  SimpleIdentifierImpl _prefix;
 
   /**
    * Initialize a newly created import directive. Either or both of the
@@ -6229,7 +6232,7 @@
 
   @override
   void set prefix(SimpleIdentifier identifier) {
-    _prefix = _becomeParentOf(identifier as AstNodeImpl);
+    _prefix = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -6263,7 +6266,7 @@
    * The expression used to compute the object being indexed, or `null` if this
    * index expression is part of a cascade expression.
    */
-  Expression _target;
+  ExpressionImpl _target;
 
   /**
    * The period ("..") before a cascaded index expression, or `null` if this
@@ -6281,7 +6284,7 @@
   /**
    * The expression used to compute the index.
    */
-  Expression _index;
+  ExpressionImpl _index;
 
   /**
    * The right square bracket.
@@ -6364,7 +6367,7 @@
 
   @override
   void set index(Expression expression) {
-    _index = _becomeParentOf(expression as AstNodeImpl);
+    _index = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -6396,7 +6399,7 @@
 
   @override
   void set target(Expression expression) {
-    _target = _becomeParentOf(expression as AstNodeImpl);
+    _target = _becomeParentOf(expression as ExpressionImpl);
   }
 
   /**
@@ -6491,12 +6494,12 @@
   /**
    * The name of the constructor to be invoked.
    */
-  ConstructorName _constructorName;
+  ConstructorNameImpl _constructorName;
 
   /**
    * The list of arguments to the constructor.
    */
-  ArgumentList _argumentList;
+  ArgumentListImpl _argumentList;
 
   /**
    * The element associated with the constructor based on static type
@@ -6520,7 +6523,7 @@
 
   @override
   void set argumentList(ArgumentList argumentList) {
-    _argumentList = _becomeParentOf(argumentList as AstNodeImpl);
+    _argumentList = _becomeParentOf(argumentList as ArgumentListImpl);
   }
 
   @override
@@ -6537,7 +6540,7 @@
 
   @override
   void set constructorName(ConstructorName name) {
-    _constructorName = _becomeParentOf(name as AstNodeImpl);
+    _constructorName = _becomeParentOf(name as ConstructorNameImpl);
   }
 
   @override
@@ -6790,7 +6793,7 @@
   /**
    * The expression to be evaluated for the value to be converted into a string.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The right curly bracket, or `null` if the expression is an identifier
@@ -6829,7 +6832,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -6907,13 +6910,13 @@
   /**
    * The list of arguments to the function.
    */
-  ArgumentList _argumentList;
+  ArgumentListImpl _argumentList;
 
   /**
    * The type arguments to be applied to the method being invoked, or `null` if
    * no type arguments were provided.
    */
-  TypeArgumentList _typeArguments;
+  TypeArgumentListImpl _typeArguments;
 
   @override
   DartType propagatedInvokeType;
@@ -6934,14 +6937,14 @@
   ArgumentList get argumentList => _argumentList;
 
   void set argumentList(ArgumentList argumentList) {
-    _argumentList = _becomeParentOf(argumentList as AstNodeImpl);
+    _argumentList = _becomeParentOf(argumentList as ArgumentListImpl);
   }
 
   @override
   TypeArgumentList get typeArguments => _typeArguments;
 
   void set typeArguments(TypeArgumentList typeArguments) {
-    _typeArguments = _becomeParentOf(typeArguments as AstNodeImpl);
+    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
   }
 }
 
@@ -6955,7 +6958,7 @@
   /**
    * The expression used to compute the value whose type is being tested.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The is operator.
@@ -6972,7 +6975,7 @@
   /**
    * The name of the type being tested for.
    */
-  TypeAnnotation _type;
+  TypeAnnotationImpl _type;
 
   /**
    * Initialize a newly created is expression. The [notOperator] can be `null`
@@ -7002,7 +7005,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -7013,7 +7016,7 @@
 
   @override
   void set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as AstNodeImpl);
+    _type = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -7041,7 +7044,7 @@
   /**
    * The statement with which the labels are being associated.
    */
-  Statement _statement;
+  StatementImpl _statement;
 
   /**
    * Initialize a newly created labeled statement.
@@ -7075,7 +7078,7 @@
 
   @override
   void set statement(Statement statement) {
-    _statement = _becomeParentOf(statement as AstNodeImpl);
+    _statement = _becomeParentOf(statement as StatementImpl);
   }
 
   @override
@@ -7101,7 +7104,7 @@
   /**
    * The label being associated with the statement.
    */
-  SimpleIdentifier _label;
+  SimpleIdentifierImpl _label;
 
   /**
    * The colon that separates the label from the statement.
@@ -7131,7 +7134,7 @@
 
   @override
   void set label(SimpleIdentifier label) {
-    _label = _becomeParentOf(label as AstNodeImpl);
+    _label = _becomeParentOf(label as SimpleIdentifierImpl);
   }
 
   @override
@@ -7159,7 +7162,7 @@
   /**
    * The name of the library being defined.
    */
-  LibraryIdentifier _name;
+  LibraryIdentifierImpl _name;
 
   /**
    * The semicolon terminating the directive.
@@ -7196,7 +7199,7 @@
 
   @override
   void set name(LibraryIdentifier name) {
-    _name = _becomeParentOf(name as AstNodeImpl);
+    _name = _becomeParentOf(name as LibraryIdentifierImpl);
   }
 
   @override
@@ -7311,7 +7314,7 @@
    * type arguments were declared. The list of [elements] can be `null` if the
    * list is empty.
    */
-  ListLiteralImpl(Token constKeyword, TypeArgumentList typeArguments,
+  ListLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
       this.leftBracket, List<Expression> elements, this.rightBracket)
       : super(constKeyword, typeArguments) {
     _elements = new NodeListImpl<Expression>(this, elements);
@@ -7399,7 +7402,7 @@
   /**
    * The expression computing the key with which the value will be associated.
    */
-  Expression _key;
+  ExpressionImpl _key;
 
   /**
    * The colon that separates the key from the value.
@@ -7410,7 +7413,7 @@
   /**
    * The expression computing the value that will be associated with the key.
    */
-  Expression _value;
+  ExpressionImpl _value;
 
   /**
    * Initialize a newly created map literal entry.
@@ -7436,7 +7439,7 @@
 
   @override
   void set key(Expression string) {
-    _key = _becomeParentOf(string as AstNodeImpl);
+    _key = _becomeParentOf(string as ExpressionImpl);
   }
 
   @override
@@ -7444,7 +7447,7 @@
 
   @override
   void set value(Expression expression) {
-    _value = _becomeParentOf(expression as AstNodeImpl);
+    _value = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -7487,7 +7490,7 @@
    * the literal is not a constant. The [typeArguments] can be `null` if no type
    * arguments were declared. The [entries] can be `null` if the map is empty.
    */
-  MapLiteralImpl(Token constKeyword, TypeArgumentList typeArguments,
+  MapLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
       this.leftBracket, List<MapLiteralEntry> entries, this.rightBracket)
       : super(constKeyword, typeArguments) {
     _entries = new NodeListImpl<MapLiteralEntry>(this, entries);
@@ -7561,7 +7564,7 @@
   /**
    * The return type of the method, or `null` if no return type was declared.
    */
-  TypeAnnotation _returnType;
+  TypeAnnotationImpl _returnType;
 
   /**
    * The token representing the 'get' or 'set' keyword, or `null` if this is a
@@ -7580,24 +7583,24 @@
   /**
    * The name of the method.
    */
-  SimpleIdentifier _name;
+  SimpleIdentifierImpl _name;
 
   /**
    * The type parameters associated with the method, or `null` if the method is
    * not a generic method.
    */
-  TypeParameterList _typeParameters;
+  TypeParameterListImpl _typeParameters;
 
   /**
    * The parameters associated with the method, or `null` if this method
    * declares a getter.
    */
-  FormalParameterList _parameters;
+  FormalParameterListImpl _parameters;
 
   /**
    * The body of the method.
    */
-  FunctionBody _body;
+  FunctionBodyImpl _body;
 
   /**
    * Initialize a newly created method declaration. Either or both of the
@@ -7635,7 +7638,7 @@
 
   @override
   void set body(FunctionBody functionBody) {
-    _body = _becomeParentOf(functionBody as AstNodeImpl);
+    _body = _becomeParentOf(functionBody as FunctionBodyImpl);
   }
 
   @override
@@ -7702,7 +7705,7 @@
 
   @override
   void set name(SimpleIdentifier identifier) {
-    _name = _becomeParentOf(identifier as AstNodeImpl);
+    _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -7710,7 +7713,7 @@
 
   @override
   void set parameters(FormalParameterList parameters) {
-    _parameters = _becomeParentOf(parameters as AstNodeImpl);
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
   @override
@@ -7718,7 +7721,7 @@
 
   @override
   void set returnType(TypeAnnotation type) {
-    _returnType = _becomeParentOf(type as AstNodeImpl);
+    _returnType = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -7726,7 +7729,7 @@
 
   @override
   void set typeParameters(TypeParameterList typeParameters) {
-    _typeParameters = _becomeParentOf(typeParameters as AstNodeImpl);
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
 
   @override
@@ -7758,7 +7761,7 @@
    * The expression producing the object on which the method is defined, or
    * `null` if there is no target (that is, the target is implicitly `this`).
    */
-  Expression _target;
+  ExpressionImpl _target;
 
   /**
    * The operator that separates the target from the method name, or `null`
@@ -7772,7 +7775,7 @@
   /**
    * The name of the method being invoked.
    */
-  SimpleIdentifier _methodName;
+  SimpleIdentifierImpl _methodName;
 
   /**
    * Initialize a newly created method invocation. The [target] and [operator]
@@ -7821,7 +7824,7 @@
 
   @override
   void set methodName(SimpleIdentifier identifier) {
-    _methodName = _becomeParentOf(identifier as AstNodeImpl);
+    _methodName = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -7847,7 +7850,7 @@
 
   @override
   void set target(Expression expression) {
-    _target = _becomeParentOf(expression as AstNodeImpl);
+    _target = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -7870,7 +7873,7 @@
   /**
    * The name of the member being declared.
    */
-  SimpleIdentifier _name;
+  SimpleIdentifierImpl _name;
 
   /**
    * Initialize a newly created compilation unit member with the given [name].
@@ -7888,7 +7891,7 @@
 
   @override
   void set name(SimpleIdentifier identifier) {
-    _name = _becomeParentOf(identifier as AstNodeImpl);
+    _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 }
 
@@ -7903,12 +7906,12 @@
   /**
    * The name associated with the expression.
    */
-  Label _name;
+  LabelImpl _name;
 
   /**
    * The expression with which the name is associated.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * Initialize a newly created named expression..
@@ -7942,7 +7945,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -7950,7 +7953,7 @@
 
   @override
   void set name(Label identifier) {
-    _name = _becomeParentOf(identifier as AstNodeImpl);
+    _name = _becomeParentOf(identifier as LabelImpl);
   }
 
   @override
@@ -8011,10 +8014,10 @@
    * are no combinators.
    */
   NamespaceDirectiveImpl(
-      Comment comment,
+      CommentImpl comment,
       List<Annotation> metadata,
       this.keyword,
-      StringLiteral libraryUri,
+      StringLiteralImpl libraryUri,
       List<Configuration> configurations,
       List<Combinator> combinators,
       this.semicolon)
@@ -8065,7 +8068,7 @@
   /**
    * The name of the native object that implements the class.
    */
-  StringLiteral _name;
+  StringLiteralImpl _name;
 
   /**
    * Initialize a newly created native clause.
@@ -8089,7 +8092,7 @@
 
   @override
   void set name(StringLiteral name) {
-    _name = _becomeParentOf(name as AstNodeImpl);
+    _name = _becomeParentOf(name as StringLiteralImpl);
   }
 
   @override
@@ -8119,7 +8122,7 @@
   /**
    * The string literal, after the 'native' token.
    */
-  StringLiteral _stringLiteral;
+  StringLiteralImpl _stringLiteral;
 
   /**
    * The token representing the semicolon that marks the end of the function
@@ -8154,7 +8157,7 @@
 
   @override
   void set stringLiteral(StringLiteral stringLiteral) {
-    _stringLiteral = _becomeParentOf(stringLiteral as AstNodeImpl);
+    _stringLiteral = _becomeParentOf(stringLiteral as StringLiteralImpl);
   }
 
   @override
@@ -8330,7 +8333,7 @@
    * The documentation comment associated with this parameter, or `null` if this
    * parameter does not have a documentation comment associated with it.
    */
-  Comment _comment;
+  CommentImpl _comment;
 
   /**
    * The annotations associated with this parameter.
@@ -8345,7 +8348,7 @@
   /**
    * The name of the parameter being declared.
    */
-  SimpleIdentifier _identifier;
+  SimpleIdentifierImpl _identifier;
 
   /**
    * Initialize a newly created formal parameter. Either or both of the
@@ -8364,7 +8367,7 @@
 
   @override
   void set documentationComment(Comment comment) {
-    _comment = _becomeParentOf(comment as AstNodeImpl);
+    _comment = _becomeParentOf(comment as CommentImpl);
   }
 
   @override
@@ -8372,7 +8375,7 @@
 
   @override
   void set identifier(SimpleIdentifier identifier) {
-    _identifier = _becomeParentOf(identifier as AstNodeImpl);
+    _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @deprecated
@@ -8499,7 +8502,7 @@
   /**
    * The expression within the parentheses.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The right parenthesis.
@@ -8531,7 +8534,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -8582,8 +8585,8 @@
    * and [metadata] can be `null` if the directive does not have the
    * corresponding attribute.
    */
-  PartDirectiveImpl(Comment comment, List<Annotation> metadata,
-      this.partKeyword, StringLiteral partUri, this.semicolon)
+  PartDirectiveImpl(CommentImpl comment, List<Annotation> metadata,
+      this.partKeyword, StringLiteralImpl partUri, this.semicolon)
       : super(comment, metadata, partUri);
 
   @override
@@ -8634,7 +8637,7 @@
    * The name of the library that the containing compilation unit is part of, or
    * `null` if no name was given (typically because a library URI was provided).
    */
-  LibraryIdentifier _libraryName;
+  LibraryIdentifierImpl _libraryName;
 
   /**
    * The semicolon terminating the directive.
@@ -8682,7 +8685,7 @@
 
   @override
   void set libraryName(LibraryIdentifier libraryName) {
-    _libraryName = _becomeParentOf(libraryName as AstNodeImpl);
+    _libraryName = _becomeParentOf(libraryName as LibraryIdentifierImpl);
   }
 
   @override
@@ -8690,7 +8693,7 @@
 
   @override
   void set uri(StringLiteral uri) {
-    _uri = _becomeParentOf(uri as AstNodeImpl);
+    _uri = _becomeParentOf(uri as StringLiteralImpl);
   }
 
   @override
@@ -8715,7 +8718,7 @@
   /**
    * The expression computing the operand for the operator.
    */
-  Expression _operand;
+  ExpressionImpl _operand;
 
   /**
    * The postfix operator being applied to the operand.
@@ -8771,7 +8774,7 @@
 
   @override
   void set operand(Expression expression) {
-    _operand = _becomeParentOf(expression as AstNodeImpl);
+    _operand = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -8832,7 +8835,7 @@
   /**
    * The prefix associated with the library in which the identifier is defined.
    */
-  SimpleIdentifier _prefix;
+  SimpleIdentifierImpl _prefix;
 
   /**
    * The period used to separate the prefix from the identifier.
@@ -8842,7 +8845,7 @@
   /**
    * The identifier being prefixed.
    */
-  SimpleIdentifier _identifier;
+  SimpleIdentifierImpl _identifier;
 
   /**
    * Initialize a newly created prefixed identifier.
@@ -8883,7 +8886,7 @@
 
   @override
   void set identifier(SimpleIdentifier identifier) {
-    _identifier = _becomeParentOf(identifier as AstNodeImpl);
+    _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -8911,7 +8914,7 @@
 
   @override
   void set prefix(SimpleIdentifier identifier) {
-    _prefix = _becomeParentOf(identifier as AstNodeImpl);
+    _prefix = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -8955,7 +8958,7 @@
   /**
    * The expression computing the operand for the operator.
    */
-  Expression _operand;
+  ExpressionImpl _operand;
 
   /**
    * The element associated with the operator based on the static type of the
@@ -9002,7 +9005,7 @@
 
   @override
   void set operand(Expression expression) {
-    _operand = _becomeParentOf(expression as AstNodeImpl);
+    _operand = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -9065,7 +9068,7 @@
   /**
    * The expression computing the object defining the property being accessed.
    */
-  Expression _target;
+  ExpressionImpl _target;
 
   /**
    * The property access operator.
@@ -9075,7 +9078,7 @@
   /**
    * The name of the property being accessed.
    */
-  SimpleIdentifier _propertyName;
+  SimpleIdentifierImpl _propertyName;
 
   /**
    * Initialize a newly created property access expression.
@@ -9116,7 +9119,7 @@
 
   @override
   void set propertyName(SimpleIdentifier identifier) {
-    _propertyName = _becomeParentOf(identifier as AstNodeImpl);
+    _propertyName = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -9139,7 +9142,7 @@
 
   @override
   void set target(Expression expression) {
-    _target = _becomeParentOf(expression as AstNodeImpl);
+    _target = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -9176,12 +9179,12 @@
    * The name of the constructor that is being invoked, or `null` if the unnamed
    * constructor is being invoked.
    */
-  SimpleIdentifier _constructorName;
+  SimpleIdentifierImpl _constructorName;
 
   /**
    * The list of arguments to the constructor.
    */
-  ArgumentList _argumentList;
+  ArgumentListImpl _argumentList;
 
   /**
    * The element associated with the constructor based on static type
@@ -9206,7 +9209,7 @@
 
   @override
   void set argumentList(ArgumentList argumentList) {
-    _argumentList = _becomeParentOf(argumentList as AstNodeImpl);
+    _argumentList = _becomeParentOf(argumentList as ArgumentListImpl);
   }
 
   @override
@@ -9224,7 +9227,7 @@
 
   @override
   void set constructorName(SimpleIdentifier identifier) {
-    _constructorName = _becomeParentOf(identifier as AstNodeImpl);
+    _constructorName = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -9297,7 +9300,7 @@
    * The expression computing the value to be returned, or `null` if no explicit
    * value was provided.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The semicolon terminating the statement.
@@ -9328,7 +9331,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -9435,7 +9438,7 @@
    * The name of the declared type of the parameter, or `null` if the parameter
    * does not have a declared type.
    */
-  TypeAnnotation _type;
+  TypeAnnotationImpl _type;
 
   @override
   ParameterElement element;
@@ -9490,7 +9493,7 @@
 
   @override
   void set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as AstNodeImpl);
+    _type = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -10058,12 +10061,12 @@
    * The name of the constructor that is being invoked, or `null` if the unnamed
    * constructor is being invoked.
    */
-  SimpleIdentifier _constructorName;
+  SimpleIdentifierImpl _constructorName;
 
   /**
    * The list of arguments to the constructor.
    */
-  ArgumentList _argumentList;
+  ArgumentListImpl _argumentList;
 
   /**
    * The element associated with the constructor based on static type
@@ -10089,7 +10092,7 @@
 
   @override
   void set argumentList(ArgumentList argumentList) {
-    _argumentList = _becomeParentOf(argumentList as AstNodeImpl);
+    _argumentList = _becomeParentOf(argumentList as ArgumentListImpl);
   }
 
   @override
@@ -10107,7 +10110,7 @@
 
   @override
   void set constructorName(SimpleIdentifier identifier) {
-    _constructorName = _becomeParentOf(identifier as AstNodeImpl);
+    _constructorName = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -10173,7 +10176,7 @@
   /**
    * The expression controlling whether the statements will be executed.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * Initialize a newly created switch case. The list of [labels] can be `null`
@@ -10198,7 +10201,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -10326,7 +10329,7 @@
    * The expression used to determine which of the switch members will be
    * selected.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The right parenthesis.
@@ -10385,7 +10388,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -10498,7 +10501,7 @@
   /**
    * The expression computing the exception to be thrown.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * Initialize a newly created throw expression.
@@ -10527,7 +10530,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -10554,7 +10557,7 @@
   /**
    * The top-level variables being declared.
    */
-  VariableDeclarationList _variableList;
+  VariableDeclarationListImpl _variableList;
 
   /**
    * The semicolon terminating the declaration.
@@ -10593,7 +10596,7 @@
 
   @override
   void set variables(VariableDeclarationList variables) {
-    _variableList = _becomeParentOf(variables as AstNodeImpl);
+    _variableList = _becomeParentOf(variables as VariableDeclarationListImpl);
   }
 
   @override
@@ -10625,7 +10628,7 @@
   /**
    * The body of the statement.
    */
-  Block _body;
+  BlockImpl _body;
 
   /**
    * The catch clauses contained in the try statement.
@@ -10642,7 +10645,7 @@
    * The finally block contained in the try statement, or `null` if the
    * statement does not contain a finally clause.
    */
-  Block _finallyBlock;
+  BlockImpl _finallyBlock;
 
   /**
    * Initialize a newly created try statement. The list of [catchClauses] can be
@@ -10668,7 +10671,7 @@
 
   @override
   void set body(Block block) {
-    _body = _becomeParentOf(block as AstNodeImpl);
+    _body = _becomeParentOf(block as BlockImpl);
   }
 
   @override
@@ -10699,7 +10702,7 @@
 
   @override
   void set finallyBlock(Block block) {
-    _finallyBlock = _becomeParentOf(block as AstNodeImpl);
+    _finallyBlock = _becomeParentOf(block as BlockImpl);
   }
 
   @override
@@ -10740,8 +10743,8 @@
    * [metadata] can be `null` if the declaration does not have the corresponding
    * attribute.
    */
-  TypeAliasImpl(Comment comment, List<Annotation> metadata, this.typedefKeyword,
-      SimpleIdentifier name, this.semicolon)
+  TypeAliasImpl(CommentImpl comment, List<Annotation> metadata,
+      this.typedefKeyword, SimpleIdentifierImpl name, this.semicolon)
       : super(comment, metadata, name);
 
   @override
@@ -10834,7 +10837,7 @@
    * The type argument associated with this literal, or `null` if no type
    * arguments were declared.
    */
-  TypeArgumentList _typeArguments;
+  TypeArgumentListImpl _typeArguments;
 
   /**
    * Initialize a newly created typed literal. The [constKeyword] can be `null`\
@@ -10855,7 +10858,7 @@
 
   @override
   void set typeArguments(TypeArgumentList typeArguments) {
-    _typeArguments = _becomeParentOf(typeArguments as AstNodeImpl);
+    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
   }
 
   ChildEntities get _childEntities =>
@@ -10877,13 +10880,13 @@
   /**
    * The name of the type.
    */
-  Identifier _name;
+  IdentifierImpl _name;
 
   /**
    * The type arguments associated with the type, or `null` if there are no type
    * arguments.
    */
-  TypeArgumentList _typeArguments;
+  TypeArgumentListImpl _typeArguments;
 
   @override
   Token question;
@@ -10935,7 +10938,7 @@
 
   @override
   void set name(Identifier identifier) {
-    _name = _becomeParentOf(identifier as AstNodeImpl);
+    _name = _becomeParentOf(identifier as IdentifierImpl);
   }
 
   @override
@@ -10943,7 +10946,7 @@
 
   @override
   void set typeArguments(TypeArgumentList typeArguments) {
-    _typeArguments = _becomeParentOf(typeArguments as AstNodeImpl);
+    _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
   }
 
   @override
@@ -10966,7 +10969,7 @@
   /**
    * The name of the type parameter.
    */
-  SimpleIdentifier _name;
+  SimpleIdentifierImpl _name;
 
   /**
    * The token representing the 'extends' keyword, or `null` if there is no
@@ -10978,7 +10981,7 @@
    * The name of the upper bound for legal arguments, or `null` if there is no
    * explicit upper bound.
    */
-  TypeAnnotation _bound;
+  TypeAnnotationImpl _bound;
 
   /**
    * Initialize a newly created type parameter. Either or both of the [comment]
@@ -10998,7 +11001,7 @@
 
   @override
   void set bound(TypeAnnotation type) {
-    _bound = _becomeParentOf(type as AstNodeImpl);
+    _bound = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -11025,7 +11028,7 @@
 
   @override
   void set name(SimpleIdentifier identifier) {
-    _name = _becomeParentOf(identifier as AstNodeImpl);
+    _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -11112,7 +11115,7 @@
   /**
    * The URI referenced by this directive.
    */
-  StringLiteral _uri;
+  StringLiteralImpl _uri;
 
   @override
   String uriContent;
@@ -11146,7 +11149,7 @@
 
   @override
   void set uri(StringLiteral uri) {
-    _uri = _becomeParentOf(uri as AstNodeImpl);
+    _uri = _becomeParentOf(uri as StringLiteralImpl);
   }
 
   UriValidationCode validate() {
@@ -11231,7 +11234,7 @@
   /**
    * The name of the variable being declared.
    */
-  SimpleIdentifier _name;
+  SimpleIdentifierImpl _name;
 
   /**
    * The equal sign separating the variable name from the initial value, or
@@ -11243,7 +11246,7 @@
    * The expression used to compute the initial value for the variable, or
    * `null` if the initial value was not specified.
    */
-  Expression _initializer;
+  ExpressionImpl _initializer;
 
   /**
    * Initialize a newly created variable declaration. The [equals] and
@@ -11296,7 +11299,7 @@
 
   @override
   void set initializer(Expression expression) {
-    _initializer = _becomeParentOf(expression as AstNodeImpl);
+    _initializer = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -11316,7 +11319,7 @@
 
   @override
   void set name(SimpleIdentifier identifier) {
-    _name = _becomeParentOf(identifier as AstNodeImpl);
+    _name = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
   @override
@@ -11353,7 +11356,7 @@
   /**
    * The type of the variables being declared, or `null` if no type was provided.
    */
-  TypeAnnotation _type;
+  TypeAnnotationImpl _type;
 
   /**
    * A list containing the individual variables being declared.
@@ -11408,7 +11411,7 @@
 
   @override
   void set type(TypeAnnotation type) {
-    _type = _becomeParentOf(type as AstNodeImpl);
+    _type = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
   @override
@@ -11438,7 +11441,7 @@
   /**
    * The variables being declared.
    */
-  VariableDeclarationList _variableList;
+  VariableDeclarationListImpl _variableList;
 
   /**
    * The semicolon terminating the statement.
@@ -11468,7 +11471,7 @@
 
   @override
   void set variables(VariableDeclarationList variables) {
-    _variableList = _becomeParentOf(variables as AstNodeImpl);
+    _variableList = _becomeParentOf(variables as VariableDeclarationListImpl);
   }
 
   @override
@@ -11501,7 +11504,7 @@
   /**
    * The expression used to determine whether to execute the body of the loop.
    */
-  Expression _condition;
+  ExpressionImpl _condition;
 
   /**
    * The right parenthesis.
@@ -11511,7 +11514,7 @@
   /**
    * The body of the loop.
    */
-  Statement _body;
+  StatementImpl _body;
 
   /**
    * Initialize a newly created while statement.
@@ -11530,7 +11533,7 @@
 
   @override
   void set body(Statement statement) {
-    _body = _becomeParentOf(statement as AstNodeImpl);
+    _body = _becomeParentOf(statement as StatementImpl);
   }
 
   @override
@@ -11546,7 +11549,7 @@
 
   @override
   void set condition(Expression expression) {
-    _condition = _becomeParentOf(expression as AstNodeImpl);
+    _condition = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
@@ -11630,7 +11633,7 @@
   /**
    * The expression whose value will be yielded.
    */
-  Expression _expression;
+  ExpressionImpl _expression;
 
   /**
    * The semicolon following the expression.
@@ -11674,7 +11677,7 @@
 
   @override
   void set expression(Expression expression) {
-    _expression = _becomeParentOf(expression as AstNodeImpl);
+    _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 5f3d53b..094a77b 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2,8 +2,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.
 
-library analyzer.src.dart.element.element;
-
 import 'dart:collection';
 import 'dart:math' show min;
 
@@ -802,6 +800,7 @@
         _interfaces = _unlinkedClass.interfaces
             .map((EntityRef t) => context.resolveTypeRef(this, t))
             .where(_isClassInterfaceType)
+            .cast<InterfaceType>()
             .toList(growable: false);
       }
     }
@@ -938,6 +937,7 @@
         _mixins = _unlinkedClass.mixins
             .map((EntityRef t) => context.resolveTypeRef(this, t))
             .where(_isClassInterfaceType)
+            .cast<InterfaceType>()
             .toList(growable: false);
       }
     }
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 083a05f..2ca77de 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1464,6 +1464,10 @@
     }
   }
 
+  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+    push(new _Modifiers()..externalKeyword = externalToken);
+  }
+
   void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
     // TODO(paulberry): set up scopes properly to resolve parameters and type
     // variables.
@@ -1995,6 +1999,14 @@
   }
 
   @override
+  void beginFactoryMethod(
+      Token lastConsumed, Token externalToken, Token constToken) {
+    push(new _Modifiers()
+      ..externalKeyword = externalToken
+      ..finalConstOrVarKeyword = constToken);
+  }
+
+  @override
   void endFactoryMethod(
       Token beginToken, Token factoryKeyword, Token endToken) {
     assert(optional('factory', factoryKeyword));
@@ -2083,7 +2095,6 @@
     FormalParameterList parameters = pop();
     SimpleIdentifier name = pop();
     TypeAnnotation returnType = pop();
-    pop(); // modifiers
     TypeParameterList typeParameters = pop();
     FunctionExpression functionExpression =
         ast.functionExpression(typeParameters, parameters, body);
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 06ce559..e8b2f1f 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -2,8 +2,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.
 
-library analyzer.src.generated.testing.test_type_provider;
-
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -732,6 +730,7 @@
     element.accessors = accessors;
     element.fields = accessors
         .map((PropertyAccessorElement accessor) => accessor.variable)
+        .cast<FieldElement>()
         .toList();
   }
 }
diff --git a/pkg/analyzer/lib/src/plugin/engine_plugin.dart b/pkg/analyzer/lib/src/plugin/engine_plugin.dart
index fb0599db4..fc652f0 100644
--- a/pkg/analyzer/lib/src/plugin/engine_plugin.dart
+++ b/pkg/analyzer/lib/src/plugin/engine_plugin.dart
@@ -2,8 +2,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.
 
-library analyzer.src.plugin.engine_plugin;
-
 import 'package:analyzer/error/error.dart' show AnalysisError;
 import 'package:analyzer/plugin/task.dart';
 import 'package:analyzer/src/generated/engine.dart'
@@ -90,7 +88,7 @@
    * descriptors for Dart sources.
    */
   @ExtensionPointId('DART_ERRORS_FOR_SOURCE_EXTENSION_POINT_ID')
-  List<ResultDescriptor> get dartErrorsForSource =>
+  List<ListResultDescriptor<AnalysisError>> get dartErrorsForSource =>
       dartErrorsForSourceExtensionPoint.extensions;
 
   /**
@@ -98,7 +96,7 @@
    * descriptors for Dart library specific units.
    */
   @ExtensionPointId('DART_ERRORS_FOR_UNIT_EXTENSION_POINT_ID')
-  List<ResultDescriptor> get dartErrorsForUnit =>
+  List<ListResultDescriptor<AnalysisError>> get dartErrorsForUnit =>
       dartErrorsForUnitExtensionPoint.extensions;
 
   /**
@@ -106,7 +104,8 @@
    * descriptors for HTML sources.
    */
   @ExtensionPointId('HTML_ERRORS_EXTENSION_POINT_ID')
-  List<ResultDescriptor> get htmlErrors => htmlErrorsExtensionPoint.extensions;
+  List<ListResultDescriptor<AnalysisError>> get htmlErrors =>
+      htmlErrorsExtensionPoint.extensions;
 
   @override
   String get uniqueIdentifier => UNIQUE_IDENTIFIER;
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 4f0d914..58fbf60 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -1371,7 +1371,11 @@
         } else {
           // For a type that refers to a generic executable, the type arguments are
           // not supposed to include the arguments to the executable itself.
-          numTypeArguments = enclosing?.numTypeParameters ?? 0;
+          if (element is MethodElementHandle && !element.isStatic) {
+            numTypeArguments = enclosing?.numTypeParameters ?? 0;
+          } else {
+            numTypeArguments = 0;
+          }
           computer = () => this.element as FunctionTypedElement;
         }
         // TODO(paulberry): Is it a bug that we have to pass `false` for
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index 75a487c..91b8015 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -2,8 +2,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.
 
-library serialization.summarize_const_expr;
-
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/type.dart' show DartType;
@@ -13,7 +11,7 @@
 /**
  * Serialize the given constructor initializer [node].
  */
-UnlinkedConstructorInitializer serializeConstructorInitializer(
+UnlinkedConstructorInitializerBuilder serializeConstructorInitializer(
     ConstructorInitializer node,
     UnlinkedExprBuilder serializeConstExpr(Expression expr)) {
   if (node is ConstructorFieldInitializer) {
@@ -175,6 +173,13 @@
   List<int> serializeFunctionExpression(FunctionExpression functionExpression);
 
   /**
+   * Return [EntityRefBuilder] that corresponds to the [type], which is defined
+   * using generic function type syntax. These may appear as the type arguments
+   * of a const list, etc.
+   */
+  EntityRefBuilder serializeGenericFunctionType(GenericFunctionType type);
+
+  /**
    * Return [EntityRefBuilder] that corresponds to the given [identifier].
    */
   EntityRefBuilder serializeIdentifier(Identifier identifier);
@@ -193,22 +198,6 @@
   }
 
   /**
-   * Return [EntityRefBuilder] that corresponds to the [type] with the given
-   * [name] and [arguments].  It is expected that [type] corresponds to the
-   * given [name] and [arguments].  The parameter [type] might be `null` if the
-   * type is not resolved.
-   */
-  EntityRefBuilder serializeTypeName(
-      DartType type, Identifier name, TypeArgumentList arguments);
-
-  /**
-   * Return [EntityRefBuilder] that corresponds to the [type], which is defined
-   * using generic function type syntax. These may appear as the type arguments
-   * of a const list, etc.
-   */
-  EntityRefBuilder serializeGenericFunctionType(GenericFunctionType type);
-
-  /**
    * Return [EntityRefBuilder] that corresponds to the given [type].
    */
   EntityRefBuilder serializeType(TypeAnnotation type) {
@@ -223,6 +212,15 @@
   }
 
   /**
+   * Return [EntityRefBuilder] that corresponds to the [type] with the given
+   * [name] and [arguments].  It is expected that [type] corresponds to the
+   * given [name] and [arguments].  The parameter [type] might be `null` if the
+   * type is not resolved.
+   */
+  EntityRefBuilder serializeTypeName(
+      DartType type, Identifier name, TypeArgumentList arguments);
+
+  /**
    * Return the [UnlinkedExprBuilder] that corresponds to the state of this
    * serializer.
    */
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index aa309b2..3fed1de 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -2,8 +2,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.
 
-library analyzer.src.task.dart;
-
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -1077,7 +1075,7 @@
     ConstantFinder constantFinder = new ConstantFinder();
     unit.accept(constantFinder);
     List<ConstantEvaluationTarget> constants =
-        constantFinder.constantsToCompute.toList();
+        constantFinder.constantsToCompute;
     //
     // Record outputs.
     //
@@ -2262,9 +2260,9 @@
           component.expand((l) => l.units).map(unitToLSU).toList();
       outputs[LIBRARY_CYCLE_DEPENDENCIES] = deps.map(unitToLSU).toList();
     } else {
-      outputs[LIBRARY_CYCLE] = [];
-      outputs[LIBRARY_CYCLE_UNITS] = [];
-      outputs[LIBRARY_CYCLE_DEPENDENCIES] = [];
+      outputs[LIBRARY_CYCLE] = <LibraryElement>[];
+      outputs[LIBRARY_CYCLE_UNITS] = <LibrarySpecificUnit>[];
+      outputs[LIBRARY_CYCLE_DEPENDENCIES] = <LibrarySpecificUnit>[];
     }
   }
 
@@ -2530,18 +2528,20 @@
     inputs[IGNORE_INFO_INPUT] = IGNORE_INFO.of(source);
     EnginePlugin enginePlugin = AnalysisEngine.instance.enginePlugin;
     // for Source
-    List<ResultDescriptor> errorsForSource = enginePlugin.dartErrorsForSource;
+    List<ListResultDescriptor<AnalysisError>> errorsForSource =
+        enginePlugin.dartErrorsForSource;
     int sourceLength = errorsForSource.length;
     for (int i = 0; i < sourceLength; i++) {
-      ResultDescriptor result = errorsForSource[i];
+      ListResultDescriptor<AnalysisError> result = errorsForSource[i];
       String inputName = result.name + '_input';
       inputs[inputName] = result.of(source);
     }
     // for LibrarySpecificUnit
-    List<ResultDescriptor> errorsForUnit = enginePlugin.dartErrorsForUnit;
+    List<ListResultDescriptor<AnalysisError>> errorsForUnit =
+        enginePlugin.dartErrorsForUnit;
     int unitLength = errorsForUnit.length;
     for (int i = 0; i < unitLength; i++) {
-      ResultDescriptor result = errorsForUnit[i];
+      ListResultDescriptor<AnalysisError> result = errorsForUnit[i];
       String inputName = result.name + '_input';
       inputs[inputName] =
           CONTAINING_LIBRARIES.of(source).toMap((Source library) {
diff --git a/pkg/analyzer/lib/src/task/inputs.dart b/pkg/analyzer/lib/src/task/inputs.dart
index 678bc1f..66650c3 100644
--- a/pkg/analyzer/lib/src/task/inputs.dart
+++ b/pkg/analyzer/lib/src/task/inputs.dart
@@ -2,8 +2,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.
 
-library analyzer.src.task.inputs;
-
 import 'dart:collection';
 
 import 'package:analyzer/task/model.dart';
@@ -109,7 +107,7 @@
   }
 
   MapTaskInput<AnalysisTarget, V> toMapOf<V>(ResultDescriptor<V> valueResult) {
-    return (this as ListTaskInputImpl<AnalysisTarget>).toMap(valueResult.of);
+    return (this as ListTaskInputImpl<AnalysisTarget>).toMap<V>(valueResult.of);
   }
 }
 
@@ -651,6 +649,10 @@
       throw new StateError(
           'Cannot set the result value when there is no current result');
     }
+    if (value is! V) {
+      throw new StateError(
+          'Cannot build $input: computed ${value.runtimeType}, needed $V');
+    }
     _resultValue = value as V;
     _resultSet = true;
   }
diff --git a/pkg/analyzer/lib/src/util/yaml.dart b/pkg/analyzer/lib/src/util/yaml.dart
index 06308c7..89b6156 100644
--- a/pkg/analyzer/lib/src/util/yaml.dart
+++ b/pkg/analyzer/lib/src/util/yaml.dart
@@ -2,8 +2,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.
 
-library analyzer.src.util.yaml;
-
 import 'dart:collection';
 
 /// If all of the elements of [list] are strings, return a list of strings
@@ -55,13 +53,16 @@
   }
 
   /// Merge lists, avoiding duplicates.
-  List mergeList(List l1, List l2) =>
-      new List()..addAll(l1)..addAll(l2.where((item) => !l1.contains(item)));
+  List<E> mergeList<E>(List<E> l1, List<E> l2) =>
+      new List<E>()..addAll(l1)..addAll(l2.where((item) => !l1.contains(item)));
 
   /// Merge maps (recursively).
-  Map mergeMap(Map m1, Map m2) {
-    Map merged = new HashMap()..addAll(m1);
+  Map<K, V> mergeMap<K, V>(Map<K, V> m1, Map<K, V> m2) {
+    Map<K, V> merged = new HashMap<K, V>()..addAll(m1);
     m2.forEach((k, v) {
+      // TODO(brianwilkerson) This fails when merging two Map<String, YamlNode>
+      // objects and the result of `merge` is a HashMap (because the YamlNodes
+      // were YamlMaps.
       merged[k] = merge(merged[k], v);
     });
     return merged;
diff --git a/pkg/analyzer/lib/task/model.dart b/pkg/analyzer/lib/task/model.dart
index b522c98..0ba6aec 100644
--- a/pkg/analyzer/lib/task/model.dart
+++ b/pkg/analyzer/lib/task/model.dart
@@ -2,8 +2,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.
 
-library analyzer.task.model;
-
 import 'dart:collection';
 import 'dart:developer';
 
@@ -180,6 +178,10 @@
     if (inputs == null || !inputs.containsKey(name)) {
       throw new AnalysisException("Could not $description: missing $name");
     }
+    if (inputs[name] is! E) {
+      throw new AnalysisException(
+          "Could not $description: $name is a ${inputs[name].runtimeType} rather than a $E");
+    }
     return inputs[name] as E;
   }
 
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 4d2f038..48ec171 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -26,5 +26,4 @@
   cli_util: ^0.1.0
 dev_dependencies:
   test_reflective_loader: ^0.1.0
-  mockito: ^2.0.2
   test: ^0.12.0
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 23eb3b0..a14fde5 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -2,8 +2,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.
 
-library analyzer.test.generated.all_the_rest_test;
-
 import 'dart:async';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -33,7 +31,6 @@
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:mockito/mockito.dart' show Mock, when;
 import 'package:path/path.dart' as path;
 import 'package:source_span/source_span.dart';
 import 'package:test/test.dart';
@@ -151,17 +148,17 @@
   }
 
   void test_restoreAbsolute_library() {
-    Source source = new _SourceMock();
+    _SourceMock source = new _SourceMock();
     Uri fileUri = resourceProvider.pathContext.toUri(coreCorePath);
-    when(source.uri).thenReturn(fileUri);
+    source.uri = fileUri;
     Uri dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core');
   }
 
   void test_restoreAbsolute_part() {
-    Source source = new _SourceMock();
+    _SourceMock source = new _SourceMock();
     Uri fileUri = resourceProvider.pathContext.toUri(coreIntPath);
-    when(source.uri).thenReturn(fileUri);
+    source.uri = fileUri;
     Uri dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core/int.dart');
   }
@@ -2089,4 +2086,12 @@
   }
 }
 
-class _SourceMock extends Mock implements Source {}
+class _SourceMock implements Source {
+  @override
+  Uri uri;
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analyzer/test/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index d608785..5f02ed3 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -2,8 +2,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.
 
-library analyzer.test.generated.analysis_context_factory;
-
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -303,6 +301,7 @@
     ];
     canvasElement.fields = canvasElement.accessors
         .map((PropertyAccessorElement accessor) => accessor.variable)
+        .cast<FieldElement>()
         .toList();
     ClassElementImpl documentElement =
         ElementFactory.classElement("Document", elementType);
diff --git a/pkg/analyzer/test/generated/bazel_test.dart b/pkg/analyzer/test/generated/bazel_test.dart
index c5a3367..290f45f 100644
--- a/pkg/analyzer/test/generated/bazel_test.dart
+++ b/pkg/analyzer/test/generated/bazel_test.dart
@@ -2,12 +2,9 @@
 // for 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 analyzer.test.generated.bazel_test;
-
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/bazel.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -669,7 +666,14 @@
   String _p(String path) => provider.convertPath(path);
 }
 
-class _MockSource extends Mock implements Source {
+class _MockSource implements Source {
+  @override
   final String fullName;
+
   _MockSource(this.fullName);
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
 }
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 349d2ad..cf19032 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -206,8 +206,9 @@
   }
 
   @override
-  void beginFactoryMethod(Token lastConsumed) {
-    super.beginFactoryMethod(lastConsumed);
+  void beginFactoryMethod(
+      Token lastConsumed, Token externalToken, Token constToken) {
+    super.beginFactoryMethod(lastConsumed, externalToken, constToken);
     begin('FactoryMethod');
   }
 
@@ -480,8 +481,8 @@
   }
 
   @override
-  void beginTopLevelMethod(Token lastConsumed) {
-    super.beginTopLevelMethod(lastConsumed);
+  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+    super.beginTopLevelMethod(lastConsumed, externalToken);
     begin('TopLevelMethod');
   }
 
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 775f942..0194fd9 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -3899,6 +3899,15 @@
     expectStaticInvokeType('m();', '() → T');
   }
 
+  test_issue32396() async {
+    await resolveTestUnit(r'''
+class C<E> {
+  static T g<T>(T e) => null;
+  static final h = g;
+}
+''');
+  }
+
   test_notInstantiatedBound_direct_class_class() async {
     String code = r'''
 class A<T extends int> {}
diff --git a/pkg/analyzer/test/src/context/cache_test.dart b/pkg/analyzer/test/src/context/cache_test.dart
index 06f3fd7..235e254 100644
--- a/pkg/analyzer/test/src/context/cache_test.dart
+++ b/pkg/analyzer/test/src/context/cache_test.dart
@@ -2,8 +2,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.
 
-library analyzer.test.src.context.cache_test;
-
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
@@ -16,7 +14,6 @@
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/task/model.dart';
 import 'package:analyzer/task/model.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -39,14 +36,14 @@
 }
 
 class AbstractCacheTest {
-  InternalAnalysisContext context;
+  _InternalAnalysisContextMock context;
   AnalysisCache cache;
 
   void setUp() {
     context = new _InternalAnalysisContextMock();
-    when(context.prioritySources).thenReturn([]);
+    context.prioritySources = [];
     cache = createCache(context: context);
-    when(context.analysisCache).thenReturn(cache);
+    context.analysisCache = cache;
   }
 }
 
@@ -812,7 +809,7 @@
     expect(entry2.getState(descriptor2), CacheState.VALID);
 
     // Make source1 priority, so result2 is flushed instead.
-    when(context.prioritySources).thenReturn([source1]);
+    context.prioritySources = <Source>[source1];
     entry3.setValue(descriptor3, 3, TargetedResult.EMPTY_LIST);
     expect(entry1.getState(descriptor1), CacheState.VALID);
     expect(entry2.getState(descriptor2), CacheState.FLUSHED);
@@ -1250,11 +1247,11 @@
   }
 
   test_dispose() {
-    InternalAnalysisContext context = new _InternalAnalysisContextMock();
+    _InternalAnalysisContextMock context = new _InternalAnalysisContextMock();
     CachePartition partition1 = new UniversalCachePartition(context);
     CachePartition partition2 = new UniversalCachePartition(context);
     AnalysisCache cache = new AnalysisCache([partition1, partition2]);
-    when(context.analysisCache).thenReturn(cache);
+    context.analysisCache = cache;
     // configure
     // prepare entries
     ResultDescriptor<int> descriptor1 =
@@ -1283,10 +1280,20 @@
   }
 }
 
-class _InternalAnalysisContextMock extends Mock
-    implements InternalAnalysisContext {
+class _InternalAnalysisContextMock implements InternalAnalysisContext {
   @override
   final AnalysisOptions analysisOptions = new AnalysisOptionsImpl();
+
+  @override
+  AnalysisCache analysisCache;
+
+  @override
+  List<Source> prioritySources = <Source>[];
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
 }
 
 /**
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 4b98b46..cb6b92c 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 
 import '../../context/mock_sdk.dart';
@@ -54,7 +53,8 @@
   final StringBuffer logBuffer = new StringBuffer();
   PerformanceLog logger;
 
-  final UriResolver generatedUriResolver = new _GeneratedUriResolverMock();
+  final _GeneratedUriResolverMock generatedUriResolver =
+      new _GeneratedUriResolverMock();
   AnalysisDriverScheduler scheduler;
   AnalysisDriver driver;
   final List<AnalysisStatus> allStatuses = <AnalysisStatus>[];
@@ -65,13 +65,13 @@
   String testFile;
   String testCode;
 
-  bool get disableChangesAndCacheAllResults => false;
-
   /**
    * Whether to enable the Dart 2.0 Common Front End.
    */
   bool useCFE = false;
 
+  bool get disableChangesAndCacheAllResults => false;
+
   void addTestFile(String content, {bool priority: false}) {
     testCode = content;
     provider.newFile(testFile, content);
@@ -169,4 +169,29 @@
   }
 }
 
-class _GeneratedUriResolverMock extends Mock implements UriResolver {}
+class _GeneratedUriResolverMock implements UriResolver {
+  Source Function(Uri, Uri) resolveAbsoluteFunction;
+
+  Uri Function(Source) restoreAbsoluteFunction;
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (resolveAbsoluteFunction != null) {
+      return resolveAbsoluteFunction(uri, actualUri);
+    }
+    return null;
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    if (restoreAbsoluteFunction != null) {
+      return restoreAbsoluteFunction(source);
+    }
+    return null;
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index bb2cba2..32df76a 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -30,7 +30,6 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -6726,6 +6725,26 @@
     expect(x.constantValue.toIntValue(), 1);
   }
 
+  test_currentSession() async {
+    var a = _p('/a.dart');
+
+    provider.newFile(a, 'var V = 1;');
+    await driver.getResult(a);
+
+    var session1 = driver.currentSession;
+    expect(session1, isNotNull);
+
+    provider.updateFile(a, 'var V = 2;');
+    driver.changeFile(a);
+    await driver.getResult(a);
+
+    var session2 = driver.currentSession;
+    expect(session2, isNotNull);
+
+    // We get a new session.
+    expect(session2, isNot(session1));
+  }
+
   test_errors_uriDoesNotExist_export() async {
     addTestFile(r'''
 export 'foo.dart';
@@ -6869,22 +6888,18 @@
 bbb() {}
 ''');
 
-    Source generatedSource = new _SourceMock();
-    when(generatedSource.uri).thenReturn(uri);
-    when(generatedSource.fullName).thenReturn(generatedPath);
+    Source generatedSource = new _SourceMock(generatedPath, uri);
 
-    when(generatedUriResolver.resolveAbsolute(uri, uri))
-        .thenReturn(generatedSource);
-    when(generatedUriResolver.restoreAbsolute(any))
-        .thenAnswer((Invocation invocation) {
-      Source source = invocation.positionalArguments[0];
+    generatedUriResolver.resolveAbsoluteFunction =
+        (uri, actualUri) => generatedSource;
+    generatedUriResolver.restoreAbsoluteFunction = (Source source) {
       String path = source.fullName;
       if (path == templatePath || path == generatedPath) {
         return uri;
       } else {
         return null;
       }
-    });
+    };
 
     driver.addFile(templatePath);
 
@@ -8797,4 +8812,17 @@
   String _p(String path) => provider.convertPath(path);
 }
 
-class _SourceMock extends Mock implements Source {}
+class _SourceMock implements Source {
+  @override
+  final String fullName;
+
+  @override
+  final Uri uri;
+
+  _SourceMock(this.fullName, this.uri);
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 11815d5..3cae769 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -17,7 +17,6 @@
 import 'package:crypto/crypto.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -38,7 +37,8 @@
   final FileContentOverlay contentOverlay = new FileContentOverlay();
 
   final StringBuffer logBuffer = new StringBuffer();
-  final UriResolver generatedUriResolver = new _GeneratedUriResolverMock();
+  final _GeneratedUriResolverMock generatedUriResolver =
+      new _GeneratedUriResolverMock();
   SourceFactory sourceFactory;
   PerformanceLog logger;
 
@@ -493,12 +493,10 @@
     String templatePath = _p('/aaa/lib/foo.dart');
     String generatedPath = _p('/generated/aaa/lib/foo.dart');
 
-    Source generatedSource = new _SourceMock();
-    when(generatedSource.fullName).thenReturn(generatedPath);
-    when(generatedSource.uri).thenReturn(uri);
+    Source generatedSource = new _SourceMock(generatedPath, uri);
 
-    when(generatedUriResolver.resolveAbsolute(uri, uri))
-        .thenReturn(generatedSource);
+    generatedUriResolver.resolveAbsoluteFunction =
+        (uri, actualUri) => generatedSource;
 
     expect(fileSystemState.hasUri(templatePath), isFalse);
     expect(fileSystemState.hasUri(generatedPath), isTrue);
@@ -792,6 +790,44 @@
   }
 }
 
-class _GeneratedUriResolverMock extends Mock implements UriResolver {}
+class _GeneratedUriResolverMock implements UriResolver {
+  Source Function(Uri, Uri) resolveAbsoluteFunction;
 
-class _SourceMock extends Mock implements Source {}
+  Uri Function(Source) restoreAbsoluteFunction;
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (resolveAbsoluteFunction != null) {
+      return resolveAbsoluteFunction(uri, actualUri);
+    }
+    return null;
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    if (restoreAbsoluteFunction != null) {
+      return restoreAbsoluteFunction(source);
+    }
+    return null;
+  }
+}
+
+class _SourceMock implements Source {
+  @override
+  final String fullName;
+
+  @override
+  final Uri uri;
+
+  _SourceMock(this.fullName, this.uri);
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index fff33da..f49208d 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -42,9 +42,16 @@
 
   test_getLibraryByUri() async {
     String uri = 'uri';
-    LibraryElement element = new LibraryElementImpl(null, null, null, null);
-    driver.libraryMap[uri] = element;
-    expect(await session.getLibraryByUri(uri), element);
+
+    var source = new _SourceMock(Uri.parse(uri));
+    var unit = new CompilationUnitElementImpl('')
+      ..librarySource = source
+      ..source = source;
+    var library = new LibraryElementImpl(null, null, null, null)
+      ..definingCompilationUnit = unit;
+
+    driver.libraryMap[uri] = library;
+    expect(await session.getLibraryByUri(uri), library);
   }
 
   test_getParsedAst() async {
@@ -204,3 +211,15 @@
     return parseResult;
   }
 }
+
+class _SourceMock implements Source {
+  @override
+  final Uri uri;
+
+  _SourceMock(this.uri);
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart b/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
index 73266b9..db16be7 100644
--- a/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
+++ b/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/task/dart.dart';
 import 'package:analyzer/task/general.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -26,15 +25,15 @@
     const _ConflictingSummaryException();
 
 UnlinkedPublicNamespace _namespaceWithParts(List<String> parts) {
-  UnlinkedPublicNamespace namespace = new _UnlinkedPublicNamespaceMock();
-  when(namespace.parts).thenReturn(parts);
+  _UnlinkedPublicNamespaceMock namespace = new _UnlinkedPublicNamespaceMock();
+  namespace.parts = parts;
   return namespace;
 }
 
 @reflectiveTest
 class ResynthesizerResultProviderTest {
-  SourceFactory sourceFactory = new _SourceFactoryMock();
-  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  _SourceFactoryMock sourceFactory = new _SourceFactoryMock();
+  _InternalAnalysisContextMock context = new _InternalAnalysisContextMock();
   UniversalCachePartition cachePartition;
 
   Source source1 = new _SourceMock('package:p1/u1.dart', '/p1/lib/u1.dart');
@@ -44,10 +43,10 @@
   CacheEntry entry2;
   CacheEntry entry3;
 
-  PackageBundle bundle = new _PackageBundleMock();
-  UnlinkedUnit unlinkedUnit1 = new _UnlinkedUnitMock();
-  UnlinkedUnit unlinkedUnit2 = new _UnlinkedUnitMock();
-  LinkedLibrary linkedLibrary = new _LinkedLibraryMock();
+  _PackageBundleMock bundle = new _PackageBundleMock();
+  _UnlinkedUnitMock unlinkedUnit1 = new _UnlinkedUnitMock();
+  _UnlinkedUnitMock unlinkedUnit2 = new _UnlinkedUnitMock();
+  _LinkedLibraryMock linkedLibrary = new _LinkedLibraryMock();
 
   SummaryDataStore dataStore = new SummaryDataStore(<String>[]);
   _TestResynthesizerResultProvider provider;
@@ -61,27 +60,26 @@
     cachePartition.put(entry2);
     cachePartition.put(entry3);
 
-    when(sourceFactory.resolveUri(any, 'package:p1/u1.dart'))
-        .thenReturn(source1);
-    when(sourceFactory.resolveUri(any, 'package:p1/u2.dart'))
-        .thenReturn(source2);
-    when(context.sourceFactory).thenReturn(sourceFactory);
+    sourceFactory.resolvedUriMap['package:p1/u1.dart'] = source1;
+    sourceFactory.resolvedUriMap['package:p1/u2.dart'] = source2;
+    context.sourceFactory = sourceFactory;
 
-    when(bundle.unlinkedUnitUris)
-        .thenReturn(<String>['package:p1/u1.dart', 'package:p1/u2.dart']);
-    when(bundle.unlinkedUnits)
-        .thenReturn(<UnlinkedUnit>[unlinkedUnit1, unlinkedUnit2]);
-    when(bundle.linkedLibraryUris).thenReturn(<String>['package:p1/u1.dart']);
-    when(bundle.linkedLibraries).thenReturn(<LinkedLibrary>[linkedLibrary]);
+    bundle.unlinkedUnitUris = <String>[
+      'package:p1/u1.dart',
+      'package:p1/u2.dart'
+    ];
+    bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit1, unlinkedUnit2];
+    bundle.linkedLibraryUris = <String>['package:p1/u1.dart'];
+    bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary];
     dataStore.addBundle('/p1.ds', bundle);
 
-    when(unlinkedUnit1.isPartOf).thenReturn(false);
-    when(unlinkedUnit2.isPartOf).thenReturn(true);
+    unlinkedUnit1.isPartOf = false;
+    unlinkedUnit2.isPartOf = true;
 
     var namespace1 = _namespaceWithParts(['package:p1/u2.dart']);
     var namespace2 = _namespaceWithParts([]);
-    when(unlinkedUnit1.publicNamespace).thenReturn(namespace1);
-    when(unlinkedUnit2.publicNamespace).thenReturn(namespace2);
+    unlinkedUnit1.publicNamespace = namespace1;
+    unlinkedUnit2.publicNamespace = namespace2;
 
     provider = new _TestResynthesizerResultProvider(context, dataStore);
     provider.sourcesWithResults.add(source1);
@@ -101,13 +99,13 @@
   }
 
   test_compute_LINE_INFO_emptyLineStarts() {
-    when(unlinkedUnit1.lineStarts).thenReturn(<int>[]);
+    unlinkedUnit1.lineStarts = <int>[];
     bool success = provider.compute(entry1, LINE_INFO);
     expect(success, isFalse);
   }
 
   test_compute_LINE_INFO_hasLineStarts() {
-    when(unlinkedUnit1.lineStarts).thenReturn(<int>[10, 20, 30]);
+    unlinkedUnit1.lineStarts = <int>[10, 20, 30];
     bool success = provider.compute(entry1, LINE_INFO);
     expect(success, isTrue);
     expect(entry1.getValue(LINE_INFO).lineStarts, <int>[10, 20, 30]);
@@ -132,7 +130,7 @@
   }
 
   test_compute_SOURCE_KIND_librarySource_isPartOf() {
-    when(unlinkedUnit1.isPartOf).thenReturn(true);
+    unlinkedUnit1.isPartOf = true;
     bool success = provider.compute(entry1, SOURCE_KIND);
     expect(success, isTrue);
     expect(entry1.getValue(SOURCE_KIND), SourceKind.PART);
@@ -156,13 +154,13 @@
   SummaryDataStore dataStore =
       new SummaryDataStore(<String>[], disallowOverlappingSummaries: true);
 
-  PackageBundle bundle1 = new _PackageBundleMock();
-  PackageBundle bundle2 = new _PackageBundleMock();
-  UnlinkedUnit unlinkedUnit11 = new _UnlinkedUnitMock();
-  UnlinkedUnit unlinkedUnit12 = new _UnlinkedUnitMock();
-  UnlinkedUnit unlinkedUnit21 = new _UnlinkedUnitMock();
-  LinkedLibrary linkedLibrary1 = new _LinkedLibraryMock();
-  LinkedLibrary linkedLibrary2 = new _LinkedLibraryMock();
+  _PackageBundleMock bundle1 = new _PackageBundleMock();
+  _PackageBundleMock bundle2 = new _PackageBundleMock();
+  _UnlinkedUnitMock unlinkedUnit11 = new _UnlinkedUnitMock();
+  _UnlinkedUnitMock unlinkedUnit12 = new _UnlinkedUnitMock();
+  _UnlinkedUnitMock unlinkedUnit21 = new _UnlinkedUnitMock();
+  _LinkedLibraryMock linkedLibrary1 = new _LinkedLibraryMock();
+  _LinkedLibraryMock linkedLibrary2 = new _LinkedLibraryMock();
 
   void setUp() {
     _setupDataStore(dataStore);
@@ -189,36 +187,38 @@
   }
 
   test_addBundle_dartUris() {
-    PackageBundle bundle = new _PackageBundleMock();
-    when(bundle.unlinkedUnitUris).thenReturn(<String>['dart:core']);
-    when(bundle.unlinkedUnits).thenReturn(<UnlinkedUnit>[unlinkedUnit11]);
-    when(bundle.linkedLibraryUris).thenReturn(<String>['dart:core']);
-    when(bundle.linkedLibraries).thenReturn(<LinkedLibrary>[linkedLibrary1]);
-    when(bundle.apiSignature).thenReturn('signature');
+    _PackageBundleMock bundle = new _PackageBundleMock();
+    bundle.unlinkedUnitUris = <String>['dart:core'];
+    bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit11];
+    bundle.linkedLibraryUris = <String>['dart:core'];
+    bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary1];
+    bundle.apiSignature = 'signature';
     dataStore.addBundle('/p3.ds', bundle);
   }
 
   test_addBundle_fileUris() {
-    PackageBundle bundle = new _PackageBundleMock();
-    when(bundle.unlinkedUnitUris).thenReturn(<String>['file:/foo.dart']);
-    when(bundle.unlinkedUnits).thenReturn(<UnlinkedUnit>[unlinkedUnit11]);
-    when(bundle.linkedLibraryUris).thenReturn(<String>['file:/foo.dart']);
-    when(bundle.linkedLibraries).thenReturn(<LinkedLibrary>[linkedLibrary1]);
-    when(bundle.apiSignature).thenReturn('signature');
+    _PackageBundleMock bundle = new _PackageBundleMock();
+    bundle.unlinkedUnitUris = <String>['file:/foo.dart'];
+    bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit11];
+    bundle.linkedLibraryUris = <String>['file:/foo.dart'];
+    bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary1];
+    bundle.apiSignature = 'signature';
     dataStore.addBundle('/p3.ds', bundle);
   }
 
   test_addBundle_multiProject() {
-    PackageBundle bundle = new _PackageBundleMock();
-    when(bundle.unlinkedUnitUris)
-        .thenReturn(<String>['package:p2/u1.dart', 'package:p1/u1.dart']);
-    when(bundle.unlinkedUnits)
-        .thenReturn(<UnlinkedUnit>[unlinkedUnit21, unlinkedUnit11]);
-    when(bundle.linkedLibraryUris)
-        .thenReturn(<String>['package:p2/u1.dart', 'package:p1/u1.dart']);
-    when(bundle.linkedLibraries)
-        .thenReturn(<LinkedLibrary>[linkedLibrary2, linkedLibrary1]);
-    when(bundle.apiSignature).thenReturn('signature');
+    _PackageBundleMock bundle = new _PackageBundleMock();
+    bundle.unlinkedUnitUris = <String>[
+      'package:p2/u1.dart',
+      'package:p1/u1.dart'
+    ];
+    bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit21, unlinkedUnit11];
+    bundle.linkedLibraryUris = <String>[
+      'package:p2/u1.dart',
+      'package:p1/u1.dart'
+    ];
+    bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary2, linkedLibrary1];
+    bundle.apiSignature = 'signature';
     // p3 conflicts (overlaps) with existing summaries.
     expect(() => dataStore.addBundle('/p3.ds', bundle),
         throwsA(isConflictingSummaryException));
@@ -229,16 +229,18 @@
         new SummaryDataStore(<String>[], disallowOverlappingSummaries: false);
     _setupDataStore(dataStore2);
 
-    PackageBundle bundle = new _PackageBundleMock();
-    when(bundle.unlinkedUnitUris)
-        .thenReturn(<String>['package:p2/u1.dart', 'package:p1/u1.dart']);
-    when(bundle.unlinkedUnits)
-        .thenReturn(<UnlinkedUnit>[unlinkedUnit21, unlinkedUnit11]);
-    when(bundle.linkedLibraryUris)
-        .thenReturn(<String>['package:p2/u1.dart', 'package:p1/u1.dart']);
-    when(bundle.linkedLibraries)
-        .thenReturn(<LinkedLibrary>[linkedLibrary2, linkedLibrary1]);
-    when(bundle.apiSignature).thenReturn('signature');
+    _PackageBundleMock bundle = new _PackageBundleMock();
+    bundle.unlinkedUnitUris = <String>[
+      'package:p2/u1.dart',
+      'package:p1/u1.dart'
+    ];
+    bundle.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit21, unlinkedUnit11];
+    bundle.linkedLibraryUris = <String>[
+      'package:p2/u1.dart',
+      'package:p1/u1.dart'
+    ];
+    bundle.linkedLibraries = <LinkedLibrary>[linkedLibrary2, linkedLibrary1];
+    bundle.apiSignature = 'signature';
     // p3 conflicts (overlaps) with existing summaries, but now allowed.
     dataStore2.addBundle('/p3.ds', bundle);
   }
@@ -265,23 +267,24 @@
     var namespace1 = _namespaceWithParts(['package:p1/u2.dart']);
     var namespace2 = _namespaceWithParts([]);
     // bundle1
-    when(unlinkedUnit11.publicNamespace).thenReturn(namespace1);
-    when(unlinkedUnit12.publicNamespace).thenReturn(namespace2);
-    when(bundle1.unlinkedUnitUris)
-        .thenReturn(<String>['package:p1/u1.dart', 'package:p1/u2.dart']);
-    when(bundle1.unlinkedUnits)
-        .thenReturn(<UnlinkedUnit>[unlinkedUnit11, unlinkedUnit12]);
-    when(bundle1.linkedLibraryUris).thenReturn(<String>['package:p1/u1.dart']);
-    when(bundle1.linkedLibraries).thenReturn(<LinkedLibrary>[linkedLibrary1]);
-    when(bundle1.apiSignature).thenReturn('signature1');
+    unlinkedUnit11.publicNamespace = namespace1;
+    unlinkedUnit12.publicNamespace = namespace2;
+    bundle1.unlinkedUnitUris = <String>[
+      'package:p1/u1.dart',
+      'package:p1/u2.dart'
+    ];
+    bundle1.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit11, unlinkedUnit12];
+    bundle1.linkedLibraryUris = <String>['package:p1/u1.dart'];
+    bundle1.linkedLibraries = <LinkedLibrary>[linkedLibrary1];
+    bundle1.apiSignature = 'signature1';
     store.addBundle('/p1.ds', bundle1);
     // bundle2
-    when(unlinkedUnit21.publicNamespace).thenReturn(namespace2);
-    when(bundle2.unlinkedUnitUris).thenReturn(<String>['package:p2/u1.dart']);
-    when(bundle2.unlinkedUnits).thenReturn(<UnlinkedUnit>[unlinkedUnit21]);
-    when(bundle2.linkedLibraryUris).thenReturn(<String>['package:p2/u1.dart']);
-    when(bundle2.linkedLibraries).thenReturn(<LinkedLibrary>[linkedLibrary2]);
-    when(bundle2.apiSignature).thenReturn('signature2');
+    unlinkedUnit21.publicNamespace = namespace2;
+    bundle2.unlinkedUnitUris = <String>['package:p2/u1.dart'];
+    bundle2.unlinkedUnits = <UnlinkedUnit>[unlinkedUnit21];
+    bundle2.linkedLibraryUris = <String>['package:p2/u1.dart'];
+    bundle2.linkedLibraries = <LinkedLibrary>[linkedLibrary2];
+    bundle2.apiSignature = 'signature2';
     store.addBundle('/p2.ds', bundle2);
   }
 }
@@ -291,17 +294,64 @@
   bool matches(item, Map matchState) => item is ConflictingSummaryException;
 }
 
-class _InternalAnalysisContextMock extends Mock
-    implements InternalAnalysisContext {}
+class _InternalAnalysisContextMock implements InternalAnalysisContext {
+  @override
+  SourceFactory sourceFactory;
 
-class _LinkedLibraryMock extends Mock implements LinkedLibrary {}
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
 
-class _PackageBundleMock extends Mock implements PackageBundle {}
+class _LinkedLibraryMock implements LinkedLibrary {
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
 
-class _SourceFactoryMock extends Mock implements SourceFactory {}
+class _PackageBundleMock implements PackageBundle {
+  @override
+  String apiSignature;
+
+  @override
+  List<LinkedLibrary> linkedLibraries;
+
+  @override
+  List<String> linkedLibraryUris;
+
+  @override
+  List<UnlinkedUnit> unlinkedUnits;
+
+  @override
+  List<String> unlinkedUnitUris;
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
+
+class _SourceFactoryMock implements SourceFactory {
+  Map<String, Source> resolvedUriMap = <String, Source>{};
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
+  @override
+  Source resolveUri(Source containingSource, String containedUri) {
+    return resolvedUriMap[containedUri];
+  }
+}
 
 class _SourceMock implements Source {
+  @override
   final Uri uri;
+
+  @override
   final String fullName;
 
   _SourceMock(String uriStr, this.fullName) : uri = Uri.parse(uriStr);
@@ -331,7 +381,28 @@
   }
 }
 
-class _UnlinkedPublicNamespaceMock extends Mock
-    implements UnlinkedPublicNamespace {}
+class _UnlinkedPublicNamespaceMock implements UnlinkedPublicNamespace {
+  @override
+  List<String> parts;
 
-class _UnlinkedUnitMock extends Mock implements UnlinkedUnit {}
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
+
+class _UnlinkedUnitMock implements UnlinkedUnit {
+  @override
+  bool isPartOf;
+
+  @override
+  List<int> lineStarts;
+
+  @override
+  UnlinkedPublicNamespace publicNamespace;
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 6dfd98c..3763f67 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -9917,6 +9917,7 @@
   }
 
   test_unused_type_parameter() async {
+    shouldCompareLibraryElements = false;
     var library = await checkLibrary('''
 class C<T> {
   void f() {}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 0774634..707aa7e 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -29,9 +29,11 @@
 import 'resynthesize_common.dart';
 
 main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ResynthesizeKernelStrongTest);
-  });
+  // TODO(brianwilkerson) Either remove the following test, or uncomment it if
+  // we get it working under Dart2 semantics.
+//  defineReflectiveSuite(() {
+//    defineReflectiveTests(ResynthesizeKernelStrongTest);
+//  });
 }
 
 /// Tests marked with this annotation fail because they test features that
diff --git a/pkg/analyzer/test/src/task/dart_work_manager_test.dart b/pkg/analyzer/test/src/task/dart_work_manager_test.dart
index 40b9e23..cc4fa43 100644
--- a/pkg/analyzer/test/src/task/dart_work_manager_test.dart
+++ b/pkg/analyzer/test/src/task/dart_work_manager_test.dart
@@ -2,8 +2,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.
 
-library analyzer.test.src.task.dart_work_manager_test;
-
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart' show AnalysisError;
 import 'package:analyzer/exception/exception.dart';
@@ -11,6 +9,8 @@
 import 'package:analyzer/src/dart/scanner/scanner.dart' show ScannerErrorCode;
 import 'package:analyzer/src/generated/engine.dart'
     show
+        AnalysisContext,
+        AnalysisErrorInfo,
         AnalysisErrorInfoImpl,
         AnalysisOptions,
         AnalysisOptionsImpl,
@@ -25,7 +25,6 @@
 import 'package:analyzer/task/dart.dart';
 import 'package:analyzer/task/general.dart';
 import 'package:analyzer/task/model.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -39,7 +38,7 @@
 
 @reflectiveTest
 class DartWorkManagerTest {
-  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  _InternalAnalysisContextMock context = new _InternalAnalysisContextMock();
   AnalysisCache cache;
   DartWorkManager manager;
 
@@ -226,8 +225,8 @@
   }
 
   void test_applyPriorityTargets_isLibrary_computeErrors() {
-    when(context.shouldErrorsBeAnalyzed(source2)).thenReturn(true);
-    when(context.shouldErrorsBeAnalyzed(source3)).thenReturn(true);
+    context.setShouldErrorsBeAnalyzed(source2, true);
+    context.setShouldErrorsBeAnalyzed(source3, true);
     entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
     entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
     entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
@@ -250,8 +249,8 @@
   }
 
   void test_applyPriorityTargets_isLibrary_computeUnit() {
-    when(context.shouldErrorsBeAnalyzed(source2)).thenReturn(false);
-    when(context.shouldErrorsBeAnalyzed(source3)).thenReturn(false);
+    context.setShouldErrorsBeAnalyzed(source2, false);
+    context.setShouldErrorsBeAnalyzed(source3, false);
     entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
     entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
     entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
@@ -276,8 +275,7 @@
     entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
     entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
     // +source2 +source3
-    when(context.getLibrariesContaining(source1))
-        .thenReturn([source2, source3]);
+    context.getLibrariesContainingMap[source1] = <Source>[source2, source3];
     manager.applyPriorityTargets([source1]);
     expect(
         manager.priorityResultQueue,
@@ -310,7 +308,7 @@
         new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
     AnalysisError error2 =
         new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
-    when(context.getLibrariesContaining(source1)).thenReturn([source2]);
+    context.getLibrariesContainingMap[source1] = <Source>[source2];
     entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
     context
         .getCacheEntry(new LibrarySpecificUnit(source2, source1))
@@ -324,14 +322,14 @@
         new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
     AnalysisError error2 =
         new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
-    when(context.getLibrariesContaining(source1)).thenReturn([source2]);
+    context.getLibrariesContainingMap[source1] = <Source>[source2];
     entry1.setValue(DART_ERRORS, <AnalysisError>[error1, error2], []);
     List<AnalysisError> errors = manager.getErrors(source1);
     expect(errors, unorderedEquals([error1, error2]));
   }
 
   void test_getLibrariesContainingPart() {
-    when(context.aboutToComputeResult(any, any)).thenReturn(false);
+    context.aboutToComputeEverything = false;
     Source part1 = new TestSource('part1.dart');
     Source part2 = new TestSource('part2.dart');
     Source part3 = new TestSource('part3.dart');
@@ -356,10 +354,8 @@
     Source library1 = new TestSource('library1.dart');
     Source library2 = new TestSource('library2.dart');
     // configure AnalysisContext mock
-    when(context.aboutToComputeResult(any, CONTAINING_LIBRARIES))
-        .thenAnswer((invocation) {
-      CacheEntry entry = invocation.positionalArguments[0];
-      ResultDescriptor result = invocation.positionalArguments[1];
+    context.aboutToComputeResultMap[CONTAINING_LIBRARIES] =
+        (CacheEntry entry, ResultDescriptor result) {
       if (entry.target == part1) {
         entry.setValue(result as ResultDescriptor<List<Source>>,
             <Source>[library1, library2], []);
@@ -371,7 +367,7 @@
         return true;
       }
       return false;
-    });
+    };
     // getLibrariesContainingPart
     expect(manager.getLibrariesContainingPart(part1),
         unorderedEquals([library1, library2]));
@@ -381,26 +377,29 @@
   }
 
   void test_getLibrariesContainingPart_inSDK() {
-    Source part = new _SourceMock('part.dart');
-    when(part.isInSystemLibrary).thenReturn(true);
+    _SourceMock part = new _SourceMock('part.dart');
+    part.isInSystemLibrary = true;
     // SDK work manager
-    DartWorkManager sdkDartWorkManagerMock = new _DartWorkManagerMock();
-    when(sdkDartWorkManagerMock.getLibrariesContainingPart(part))
-        .thenReturn([source2, source3]);
+    _DartWorkManagerMock sdkDartWorkManagerMock = new _DartWorkManagerMock();
+    sdkDartWorkManagerMock.librariesContainingPartMap[part] = <Source>[
+      source2,
+      source3
+    ];
     // SDK context mock
-    InternalAnalysisContext sdkContextMock = new _InternalAnalysisContextMock();
-    when(sdkContextMock.workManagers).thenReturn([sdkDartWorkManagerMock]);
+    _InternalAnalysisContextMock sdkContextMock =
+        new _InternalAnalysisContextMock();
+    sdkContextMock.workManagers = <WorkManager>[sdkDartWorkManagerMock];
     // SDK mock
-    DartSdk sdkMock = new _DartSdkMock();
-    when(sdkMock.context).thenReturn(sdkContextMock);
+    _DartSdkMock sdkMock = new _DartSdkMock();
+    sdkMock.context = sdkContextMock;
     // SourceFactory mock
-    SourceFactory sourceFactory = new _SourceFactoryMock();
-    when(sourceFactory.dartSdk).thenReturn(sdkMock);
-    when(context.sourceFactory).thenReturn(sourceFactory);
+    _SourceFactoryMock sourceFactory = new _SourceFactoryMock();
+    sourceFactory.dartSdk = sdkMock;
+    context.sourceFactory = sourceFactory;
     // SDK source mock
-    Source source = new _SourceMock('test.dart');
-    when(source.source).thenReturn(source);
-    when(source.isInSystemLibrary).thenReturn(true);
+    _SourceMock source = new _SourceMock('test.dart');
+    source.source = source;
+    source.isInSystemLibrary = true;
     // validate
     expect(manager.getLibrariesContainingPart(part),
         unorderedEquals([source2, source3]));
@@ -531,7 +530,7 @@
   }
 
   void test_onAnalysisOptionsChanged() {
-    when(context.exists(any)).thenReturn(true);
+    context.everythingExists = true;
     // set cache values
     entry1.setValue(PARSED_UNIT, AstTestFactory.compilationUnit(), []);
     entry1.setValue(IMPORTED_LIBRARIES, <Source>[], []);
@@ -575,7 +574,7 @@
   }
 
   void test_onSourceFactoryChanged() {
-    when(context.exists(any)).thenReturn(true);
+    context.everythingExists = true;
     // set cache values
     entry1.setValue(PARSED_UNIT, AstTestFactory.compilationUnit(), []);
     entry1.setValue(IMPORTED_LIBRARIES, <Source>[], []);
@@ -610,9 +609,9 @@
         new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
     AnalysisError error2 =
         new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
-    when(context.getLibrariesContaining(source1)).thenReturn([source2]);
-    when(context.getErrors(source1))
-        .thenReturn(new AnalysisErrorInfoImpl([error1, error2], lineInfo));
+    context.getLibrariesContainingMap[source1] = <Source>[source2];
+    context.errorsMap[source1] =
+        new AnalysisErrorInfoImpl([error1, error2], lineInfo);
     entry1.setValue(LINE_INFO, lineInfo, []);
     entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
     AnalysisTarget unitTarget = new LibrarySpecificUnit(source2, source1);
@@ -634,9 +633,9 @@
         new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
     AnalysisError error2 =
         new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
-    when(context.getLibrariesContaining(source1)).thenReturn([source2]);
-    when(context.getErrors(source1))
-        .thenReturn(new AnalysisErrorInfoImpl([error1, error2], lineInfo));
+    context.getLibrariesContainingMap[source1] = <Source>[source2];
+    context.errorsMap[source1] =
+        new AnalysisErrorInfoImpl([error1, error2], lineInfo);
     entry1.setValue(LINE_INFO, lineInfo, []);
     entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
     entry1.setValue(PARSE_ERRORS, <AnalysisError>[error2], []);
@@ -658,8 +657,8 @@
     _getOrCreateEntry(part1).setValue(CONTAINING_LIBRARIES, [], []);
     expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.VALID);
     // configure AnalysisContext mock
-    when(context.prioritySources).thenReturn(<Source>[]);
-    when(context.shouldErrorsBeAnalyzed(any)).thenReturn(false);
+    context.prioritySources = <Source>[];
+    context.analyzeAllErrors = false;
     // library1 parts
     manager.resultsComputed(library1, <ResultDescriptor, dynamic>{
       INCLUDED_PARTS: [part1, part2],
@@ -685,25 +684,28 @@
   }
 
   void test_resultsComputed_inSDK() {
-    DartWorkManager sdkDartWorkManagerMock = new _DartWorkManagerMock();
+    _DartWorkManagerMock sdkDartWorkManagerMock = new _DartWorkManagerMock();
     // SDK context mock
-    InternalAnalysisContext sdkContextMock = new _InternalAnalysisContextMock();
-    when(sdkContextMock.workManagers).thenReturn([sdkDartWorkManagerMock]);
+    _InternalAnalysisContextMock sdkContextMock =
+        new _InternalAnalysisContextMock();
+    sdkContextMock.workManagers = <WorkManager>[sdkDartWorkManagerMock];
     // SDK mock
-    DartSdk sdkMock = new _DartSdkMock();
-    when(sdkMock.context).thenReturn(sdkContextMock);
+    _DartSdkMock sdkMock = new _DartSdkMock();
+    sdkMock.context = sdkContextMock;
     // SourceFactory mock
-    SourceFactory sourceFactory = new _SourceFactoryMock();
-    when(sourceFactory.dartSdk).thenReturn(sdkMock);
-    when(context.sourceFactory).thenReturn(sourceFactory);
+    _SourceFactoryMock sourceFactory = new _SourceFactoryMock();
+    sourceFactory.dartSdk = sdkMock;
+    context.sourceFactory = sourceFactory;
     // SDK source mock
-    Source source = new _SourceMock('test.dart');
-    when(source.source).thenReturn(source);
-    when(source.isInSystemLibrary).thenReturn(true);
+    _SourceMock source = new _SourceMock('test.dart');
+    source.source = source;
+    source.isInSystemLibrary = true;
     // notify and validate
     Map<ResultDescriptor, dynamic> outputs = <ResultDescriptor, dynamic>{};
     manager.resultsComputed(source, outputs);
-    verify(sdkDartWorkManagerMock.resultsComputed(source, outputs)).called(1);
+    var bySourceMap = sdkDartWorkManagerMock.resultsComputedCounts[source];
+    expect(bySourceMap, isNotNull);
+    expect(bySourceMap[outputs], 1);
   }
 
   void test_resultsComputed_noSourceKind() {
@@ -722,9 +724,8 @@
 
   void test_resultsComputed_parsedUnit() {
     LineInfo lineInfo = new LineInfo([0]);
-    when(context.getLibrariesContaining(source1)).thenReturn([]);
-    when(context.getErrors(source1))
-        .thenReturn(new AnalysisErrorInfoImpl([], lineInfo));
+    context.getLibrariesContainingMap[source1] = <Source>[];
+    context.errorsMap[source1] = new AnalysisErrorInfoImpl([], lineInfo);
     entry1.setValue(LINE_INFO, lineInfo, []);
     CompilationUnit unit = AstTestFactory.compilationUnit();
     manager.resultsComputed(source1, {PARSED_UNIT: unit});
@@ -736,9 +737,8 @@
 
   void test_resultsComputed_resolvedUnit() {
     LineInfo lineInfo = new LineInfo([0]);
-    when(context.getLibrariesContaining(source2)).thenReturn([]);
-    when(context.getErrors(source2))
-        .thenReturn(new AnalysisErrorInfoImpl([], lineInfo));
+    context.getLibrariesContainingMap[source2] = <Source>[];
+    context.errorsMap[source2] = new AnalysisErrorInfoImpl([], lineInfo);
     entry2.setValue(LINE_INFO, lineInfo, []);
     CompilationUnit unit = AstTestFactory.compilationUnit();
     manager.resultsComputed(
@@ -751,8 +751,8 @@
 
   void test_resultsComputed_sourceKind_isLibrary() {
     manager.unknownSourceQueue.addAll([source1, source2, source3]);
-    when(context.prioritySources).thenReturn(<Source>[]);
-    when(context.shouldErrorsBeAnalyzed(source2)).thenReturn(true);
+    context.prioritySources = <Source>[];
+    context.shouldErrorsBeAnalyzedMap[source2] = true;
     manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
     expect_librarySourceQueue([source2]);
     expect_unknownSourceQueue([source1, source3]);
@@ -760,8 +760,8 @@
 
   void test_resultsComputed_sourceKind_isLibrary_isPriority_computeErrors() {
     manager.unknownSourceQueue.addAll([source1, source2, source3]);
-    when(context.prioritySources).thenReturn(<Source>[source2]);
-    when(context.shouldErrorsBeAnalyzed(source2)).thenReturn(true);
+    context.prioritySources = <Source>[source2];
+    context.shouldErrorsBeAnalyzedMap[source2] = true;
     manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
     expect_unknownSourceQueue([source1, source3]);
     expect(manager.priorityResultQueue,
@@ -770,8 +770,8 @@
 
   void test_resultsComputed_sourceKind_isLibrary_isPriority_computeUnit() {
     manager.unknownSourceQueue.addAll([source1, source2, source3]);
-    when(context.prioritySources).thenReturn(<Source>[source2]);
-    when(context.shouldErrorsBeAnalyzed(source2)).thenReturn(false);
+    context.prioritySources = <Source>[source2];
+    context.shouldErrorsBeAnalyzedMap[source2] = false;
     manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
     expect_unknownSourceQueue([source1, source3]);
     expect(
@@ -816,18 +816,74 @@
   }
 }
 
-class _DartSdkMock extends Mock implements DartSdk {}
+class _DartSdkMock implements DartSdk {
+  AnalysisContext context;
 
-class _DartWorkManagerMock extends Mock implements DartWorkManager {}
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
 
-class _InternalAnalysisContextMock extends Mock
-    implements InternalAnalysisContext {
+class _DartWorkManagerMock implements DartWorkManager {
+  Map<Source, List<Source>> librariesContainingPartMap =
+      <Source, List<Source>>{};
+
+  Map<Source, Map<Map<ResultDescriptor, dynamic>, int>> resultsComputedCounts =
+      <Source, Map<Map<ResultDescriptor, dynamic>, int>>{};
+
+  @override
+  List<Source> getLibrariesContainingPart(Source part) {
+    return librariesContainingPartMap[part] ?? <Source>[];
+  }
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
+  @override
+  void resultsComputed(
+      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {
+    Map<Map<ResultDescriptor, dynamic>, int> bySourceMap =
+        resultsComputedCounts.putIfAbsent(target, () => {});
+    bySourceMap[outputs] = (bySourceMap[outputs] ?? 0) + 1;
+  }
+}
+
+class _InternalAnalysisContextMock implements InternalAnalysisContext {
   @override
   CachePartition privateAnalysisCachePartition;
 
   @override
   AnalysisCache analysisCache;
 
+  @override
+  SourceFactory sourceFactory;
+
+  bool analyzeAllErrors;
+
+  bool everythingExists = false;
+
+  bool aboutToComputeEverything;
+
+  @override
+  List<Source> prioritySources = <Source>[];
+
+  @override
+  List<WorkManager> workManagers = <WorkManager>[];
+
+  Map<Source, List<Source>> getLibrariesContainingMap =
+      <Source, List<Source>>{};
+
+  Map<Source, bool> shouldErrorsBeAnalyzedMap = <Source, bool>{};
+
+  Map<ResultDescriptor, bool Function(CacheEntry entry, ResultDescriptor)>
+      aboutToComputeResultMap =
+      <ResultDescriptor, bool Function(CacheEntry entry, ResultDescriptor)>{};
+
+  Map<Source, AnalysisErrorInfo> errorsMap = <Source, AnalysisErrorInfo>{};
+
   Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
 
   @override
@@ -846,6 +902,24 @@
   }
 
   @override
+  bool aboutToComputeResult(CacheEntry entry, ResultDescriptor result) {
+    if (aboutToComputeEverything != null) {
+      return aboutToComputeEverything;
+    }
+    bool Function(CacheEntry entry, ResultDescriptor) function =
+        aboutToComputeResultMap[result];
+    if (function == null) {
+      return false;
+    }
+    return function(entry, result);
+  }
+
+  @override
+  bool exists(Source source) {
+    return everythingExists;
+  }
+
+  @override
   CacheEntry getCacheEntry(AnalysisTarget target) {
     CacheEntry entry = analysisCache.get(target);
     if (entry == null) {
@@ -856,19 +930,65 @@
   }
 
   @override
+  AnalysisErrorInfo getErrors(Source source) => errorsMap[source];
+
+  List<Source> getLibrariesContaining(Source source) {
+    return getLibrariesContainingMap[source];
+  }
+
+  @override
   ChangeNoticeImpl getNotice(Source source) {
     return _pendingNotices.putIfAbsent(
         source, () => new ChangeNoticeImpl(source));
   }
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
+  void setShouldErrorsBeAnalyzed(Source source, bool value) {
+    shouldErrorsBeAnalyzedMap[source] = value;
+  }
+
+  @override
+  bool shouldErrorsBeAnalyzed(Source source) {
+    if (analyzeAllErrors != null) {
+      return analyzeAllErrors;
+    }
+    return shouldErrorsBeAnalyzedMap[source];
+  }
 }
 
-class _SourceFactoryMock extends Mock implements SourceFactory {}
+class _SourceFactoryMock implements SourceFactory {
+  DartSdk dartSdk;
 
-class _SourceMock extends Mock implements Source {
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
+
+class _SourceMock implements Source {
+  @override
   final String shortName;
+
+  @override
+  bool isInSystemLibrary = false;
+
+  @override
+  Source source;
+
   _SourceMock(this.shortName);
+
   @override
   String get fullName => '/' + shortName;
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
   @override
   String toString() => fullName;
 }
diff --git a/pkg/analyzer/test/src/task/driver_test.dart b/pkg/analyzer/test/src/task/driver_test.dart
index 1c7c6ec..55a613d5 100644
--- a/pkg/analyzer/test/src/task/driver_test.dart
+++ b/pkg/analyzer/test/src/task/driver_test.dart
@@ -2,8 +2,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.
 
-library analyzer.test.src.task.driver_test;
-
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -11,7 +9,6 @@
 import 'package:analyzer/src/task/inputs.dart';
 import 'package:analyzer/src/task/manager.dart';
 import 'package:analyzer/task/model.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -30,20 +27,19 @@
 class AbstractDriverTest {
   TaskManager taskManager = new TaskManager();
   List<WorkManager> workManagers = <WorkManager>[];
-  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  _InternalAnalysisContextMock context = new _InternalAnalysisContextMock();
   AnalysisDriver analysisDriver;
 
   void setUp() {
     context = new _InternalAnalysisContextMock();
     analysisDriver = new AnalysisDriver(taskManager, workManagers, context);
-    when(context.aboutToComputeResult(any, any)).thenReturn(false);
   }
 }
 
 @reflectiveTest
 class AnalysisDriverTest extends AbstractDriverTest {
-  WorkManager workManager1 = new _WorkManagerMock();
-  WorkManager workManager2 = new _WorkManagerMock();
+  _WorkManagerMock workManager1 = new _WorkManagerMock();
+  _WorkManagerMock workManager2 = new _WorkManagerMock();
 
   AnalysisTarget target1 = new TestSource('/1.dart');
   AnalysisTarget target2 = new TestSource('/2.dart');
@@ -56,10 +52,8 @@
 
   void setUp() {
     super.setUp();
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NONE);
-    when(workManager2.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NONE);
+    workManager1.nextResultPriority = WorkOrderPriority.NONE;
+    workManager2.nextResultPriority = WorkOrderPriority.NONE;
 
     workManagers.add(workManager1);
     workManagers.add(workManager2);
@@ -87,12 +81,9 @@
 
   test_createNextWorkOrder_highLow() {
     _configureDescriptors12();
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.PRIORITY);
-    when(workManager2.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NORMAL);
-    when(workManager1.getNextResult())
-        .thenReturn(new TargetedResult(target1, result1));
+    workManager1.nextResultPriority = WorkOrderPriority.PRIORITY;
+    workManager2.nextResultPriority = WorkOrderPriority.NORMAL;
+    workManager1.nextResult = new TargetedResult(target1, result1);
     WorkOrder workOrder = analysisDriver.createNextWorkOrder();
     expect(workOrder, isNotNull);
     expect(workOrder.moveNext(), true);
@@ -102,12 +93,9 @@
 
   test_createNextWorkOrder_lowHigh() {
     _configureDescriptors12();
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NORMAL);
-    when(workManager2.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.PRIORITY);
-    when(workManager2.getNextResult())
-        .thenReturn(new TargetedResult(target1, result1));
+    workManager1.nextResultPriority = WorkOrderPriority.NORMAL;
+    workManager2.nextResultPriority = WorkOrderPriority.PRIORITY;
+    workManager2.nextResult = new TargetedResult(target1, result1);
     WorkOrder workOrder = analysisDriver.createNextWorkOrder();
     expect(workOrder, isNotNull);
     expect(workOrder.moveNext(), true);
@@ -117,10 +105,8 @@
 
   test_createNextWorkOrder_none() {
     _configureDescriptors12();
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NONE);
-    when(workManager2.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NONE);
+    workManager1.nextResultPriority = WorkOrderPriority.NONE;
+    workManager2.nextResultPriority = WorkOrderPriority.NONE;
     expect(analysisDriver.createNextWorkOrder(), isNull);
   }
 
@@ -136,14 +122,14 @@
     context.getCacheEntry(target).setState(result, CacheState.INVALID);
     // has result
     {
-      when(context.aboutToComputeResult(any, result)).thenReturn(true);
+      context.aboutToComputeResultMap[result] = true;
       WorkOrder workOrder =
           analysisDriver.createWorkOrderForResult(target, result);
       expect(workOrder, isNull);
     }
     // no result
     {
-      when(context.aboutToComputeResult(any, result)).thenReturn(false);
+      context.aboutToComputeResultMap[result] = false;
       WorkOrder workOrder =
           analysisDriver.createWorkOrderForResult(target, result);
       expect(workOrder, isNotNull);
@@ -230,16 +216,13 @@
 
   test_performAnalysisTask() {
     _configureDescriptors12();
-    when(workManager1.getNextResult())
-        .thenReturn(new TargetedResult(target1, result1));
+    workManager1.nextResult = new TargetedResult(target1, result1);
 
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NORMAL);
+    workManager1.nextResultPriority = WorkOrderPriority.NORMAL;
     expect(analysisDriver.performAnalysisTask(), true);
     expect(analysisDriver.performAnalysisTask(), true);
 
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NONE);
+    workManager1.nextResultPriority = WorkOrderPriority.NONE;
     expect(analysisDriver.performAnalysisTask(), false);
   }
 
@@ -273,14 +256,11 @@
     taskManager.addTaskDescriptor(descriptor1);
     taskManager.addTaskDescriptor(descriptor2);
     // configure WorkManager
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NORMAL);
-    when(workManager1.getNextResult())
-        .thenReturn(new TargetedResult(target, resultB));
+    workManager1.nextResultPriority = WorkOrderPriority.NORMAL;
+    workManager1.nextResult = new TargetedResult(target, resultB);
     // prepare work order
     while (analysisDriver.performAnalysisTask()) {
-      when(workManager1.getNextResultPriority())
-          .thenReturn(WorkOrderPriority.NONE);
+      workManager1.nextResultPriority = WorkOrderPriority.NONE;
     }
     Set<TaskDescriptor> expectedCycle = [descriptor1, descriptor2].toSet();
     expect(task1.dependencyCycle, isNotNull);
@@ -317,10 +297,8 @@
     taskManager.addTaskDescriptor(descriptor1);
     taskManager.addTaskDescriptor(descriptor2);
     // configure WorkManager
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NORMAL);
-    when(workManager1.getNextResult())
-        .thenReturn(new TargetedResult(target, resultB));
+    workManager1.nextResultPriority = WorkOrderPriority.NORMAL;
+    workManager1.nextResult = new TargetedResult(target, resultB);
     // prepare work order
     expect(analysisDriver.performAnalysisTask(), true);
     expect(analysisDriver.performAnalysisTask(), true);
@@ -350,10 +328,8 @@
     taskManager.addTaskDescriptor(descriptor1);
     taskManager.addTaskDescriptor(descriptor2);
     // configure WorkManager
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NORMAL);
-    when(workManager1.getNextResult())
-        .thenReturn(new TargetedResult(target, resultB));
+    workManager1.nextResultPriority = WorkOrderPriority.NORMAL;
+    workManager1.nextResult = new TargetedResult(target, resultB);
     // prepare work order
     expect(analysisDriver.performAnalysisTask(), true);
     expect(context.getCacheEntry(target).getValue(resultA), -1);
@@ -367,8 +343,7 @@
     expect(context.getCacheEntry(target).getValue(resultA), 10);
     expect(context.getCacheEntry(target).getValue(resultB), 20);
     // done
-    when(workManager1.getNextResultPriority())
-        .thenReturn(WorkOrderPriority.NONE);
+    workManager1.nextResultPriority = WorkOrderPriority.NONE;
     expect(analysisDriver.performAnalysisTask(), false);
   }
 
@@ -704,7 +679,7 @@
     taskManager.addTaskDescriptor(task1);
     taskManager.addTaskDescriptor(task2);
     // configure mocks
-    when(context.aboutToComputeResult(any, resultA)).thenReturn(true);
+    context.aboutToComputeResultMap[resultA] = true;
     // gather inputs
     WorkItem item = new WorkItem(context, target, task2, null, 0, null);
     WorkItem inputItem = item.gatherInputs(taskManager, []);
@@ -731,7 +706,7 @@
     taskManager.addTaskDescriptor(task2);
     // configure ResultProvider
     // configure mocks
-    when(context.aboutToComputeResult(any, resultA)).thenReturn(false);
+    context.aboutToComputeResultMap[resultA] = false;
     // gather inputs
     WorkItem item = new WorkItem(context, target, task2, null, 0, null);
     WorkItem inputItem = item.gatherInputs(taskManager, []);
@@ -824,10 +799,11 @@
  * A dummy [InternalAnalysisContext] that does not use [AnalysisDriver] itself,
  * but provides enough implementation for it to function.
  */
-class _InternalAnalysisContextMock extends Mock
-    implements InternalAnalysisContext {
+class _InternalAnalysisContextMock implements InternalAnalysisContext {
   AnalysisCache analysisCache;
 
+  Map<ResultDescriptor, bool> aboutToComputeResultMap = {};
+
   @override
   final AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
 
@@ -841,6 +817,12 @@
     analysisCache = new AnalysisCache([new UniversalCachePartition(this)]);
   }
 
+  String get name => 'mock';
+
+  @override
+  bool aboutToComputeResult(CacheEntry entry, ResultDescriptor result) =>
+      aboutToComputeResultMap[result] ?? false;
+
   @override
   CacheEntry getCacheEntry(AnalysisTarget target) {
     CacheEntry entry = analysisCache.get(target);
@@ -850,6 +832,11 @@
     }
     return entry;
   }
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
 }
 
 /**
@@ -875,4 +862,20 @@
   }
 }
 
-class _WorkManagerMock extends Mock implements WorkManager {}
+class _WorkManagerMock implements WorkManager {
+  WorkOrderPriority nextResultPriority;
+
+  TargetedResult nextResult;
+
+  TargetedResult getNextResult() => nextResult;
+
+  WorkOrderPriority getNextResultPriority() => nextResultPriority;
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
+  void resultsComputed(
+      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {}
+}
diff --git a/pkg/analyzer/test/src/task/general_test.dart b/pkg/analyzer/test/src/task/general_test.dart
index cb3eecb..0caea7e 100644
--- a/pkg/analyzer/test/src/task/general_test.dart
+++ b/pkg/analyzer/test/src/task/general_test.dart
@@ -2,14 +2,11 @@
 // for 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 analyzer.test.src.task.general_test;
-
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/general.dart';
 import 'package:analyzer/task/general.dart';
 import 'package:analyzer/task/model.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -55,11 +52,11 @@
   }
 
   test_perform() {
-    AnalysisContext context = new _MockContext();
+    _MockContext context = new _MockContext();
     Source target = new TestSource();
     GetContentTask task = new GetContentTask(context, target);
-    when(context.getContents(target))
-        .thenReturn(new TimestampedData<String>(42, 'foo'));
+    context.getContentsResponse[target] =
+        () => new TimestampedData<String>(42, 'foo');
     task.perform();
     expect(task.caughtException, isNull);
     expect(task.outputs, hasLength(2));
@@ -68,10 +65,10 @@
   }
 
   void test_perform_exception() {
-    AnalysisContext context = new _MockContext();
+    _MockContext context = new _MockContext();
     Source target = new TestSource();
     GetContentTask task = new GetContentTask(context, target);
-    when(context.getContents(target)).thenThrow('My exception!');
+    context.getContentsResponse[target] = () => throw 'My exception!';
     task.perform();
     expect(task.caughtException, isNull);
     expect(task.outputs, hasLength(2));
@@ -80,4 +77,23 @@
   }
 }
 
-class _MockContext extends Mock implements AnalysisContext {}
+class _MockContext implements AnalysisContext {
+  Map<Source, TimestampedData<String> Function()> getContentsResponse =
+      <Source, TimestampedData<String> Function()>{};
+
+  String get name => 'mock';
+
+  @override
+  TimestampedData<String> getContents(Source source) {
+    TimestampedData<String> Function() response = getContentsResponse[source];
+    if (response == null) {
+      fail('Unexpected invocation of getContents');
+    }
+    return response();
+  }
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    fail('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analyzer/test/src/task/html_work_manager_test.dart b/pkg/analyzer/test/src/task/html_work_manager_test.dart
index 0939d9f..b09a365 100644
--- a/pkg/analyzer/test/src/task/html_work_manager_test.dart
+++ b/pkg/analyzer/test/src/task/html_work_manager_test.dart
@@ -2,12 +2,11 @@
 // for 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 analyzer.test.src.task.html_work_manager_test;
-
 import 'package:analyzer/error/error.dart' show AnalysisError;
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/error/codes.dart' show HtmlErrorCode;
 import 'package:analyzer/src/generated/engine.dart'
     show
@@ -24,7 +23,6 @@
 import 'package:analyzer/task/general.dart';
 import 'package:analyzer/task/html.dart';
 import 'package:analyzer/task/model.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -63,7 +61,7 @@
     // the work manager was constructed. This used to create a failure
     // case for test_onResultInvalidated_scheduleInvalidLibraries so its
     // tested here.
-    context.sourceFactory = new _SourceFactoryMock();
+    context.sourceFactory = new SourceFactoryImpl(<UriResolver>[]);
 
     // now just do the same checks as
     // test_onResultInvalidated_scheduleInvalidLibraries
@@ -82,7 +80,7 @@
 
 @reflectiveTest
 class HtmlWorkManagerTest {
-  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  _InternalAnalysisContextMock context = new _InternalAnalysisContextMock();
   AnalysisCache cache;
   HtmlWorkManager manager;
 
@@ -155,8 +153,8 @@
   }
 
   void test_applyPriorityTargets() {
-    when(context.shouldErrorsBeAnalyzed(source2)).thenReturn(true);
-    when(context.shouldErrorsBeAnalyzed(source3)).thenReturn(true);
+    context.setShouldErrorsBeAnalyzed(source2, true);
+    context.setShouldErrorsBeAnalyzed(source3, true);
     manager.priorityResultQueue.add(new TargetedResult(source1, HTML_ERRORS));
     manager.priorityResultQueue.add(new TargetedResult(source2, HTML_ERRORS));
     // -source1 +source3
@@ -284,7 +282,7 @@
   }
 
   void test_onAnalysisOptionsChanged() {
-    when(context.exists(any)).thenReturn(true);
+    context.everythingExists = true;
     // set cache values
     entry1.setValue(DART_SCRIPTS, [], []);
     entry1.setValue(HTML_DOCUMENT, null, []);
@@ -314,7 +312,7 @@
   }
 
   void test_onSourceFactoryChanged() {
-    when(context.exists(any)).thenReturn(true);
+    context.everythingExists = true;
     // set cache values
     entry1.setValue(DART_SCRIPTS, [], []);
     entry1.setValue(HTML_DOCUMENT, null, []);
@@ -348,14 +346,17 @@
   }
 }
 
-class _InternalAnalysisContextMock extends Mock
-    implements InternalAnalysisContext {
+class _InternalAnalysisContextMock implements InternalAnalysisContext {
   @override
   CachePartition privateAnalysisCachePartition;
 
   @override
   AnalysisCache analysisCache;
 
+  bool everythingExists = false;
+
+  Map<Source, bool> shouldErrorsBeAnalyzedMap = <Source, bool>{};
+
   // The production version is a stream that carries messages from the cache
   // since the cache changes. Here, we can just pass the inner stream because
   // it doesn't change.
@@ -370,6 +371,11 @@
   get onResultInvalidated => analysisCache.onResultInvalidated;
 
   @override
+  bool exists(Source source) {
+    return everythingExists;
+  }
+
+  @override
   CacheEntry getCacheEntry(AnalysisTarget target) {
     CacheEntry entry = analysisCache.get(target);
     if (entry == null) {
@@ -397,6 +403,18 @@
     return _pendingNotices.putIfAbsent(
         source, () => new ChangeNoticeImpl(source));
   }
-}
 
-class _SourceFactoryMock extends Mock implements SourceFactory {}
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
+  void setShouldErrorsBeAnalyzed(Source source, bool value) {
+    shouldErrorsBeAnalyzedMap[source] = value;
+  }
+
+  @override
+  bool shouldErrorsBeAnalyzed(Source source) {
+    return shouldErrorsBeAnalyzedMap[source];
+  }
+}
diff --git a/pkg/analyzer/test/src/task/inputs_test.dart b/pkg/analyzer/test/src/task/inputs_test.dart
index e2bd0fa..bdbf9ae 100644
--- a/pkg/analyzer/test/src/task/inputs_test.dart
+++ b/pkg/analyzer/test/src/task/inputs_test.dart
@@ -2,8 +2,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.
 
-library analyzer.test.src.task.inputs_test;
-
 import 'package:analyzer/src/task/inputs.dart';
 import 'package:analyzer/src/task/model.dart';
 import 'package:analyzer/task/model.dart';
@@ -141,30 +139,30 @@
 
   test_toList() {
     var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
-    TaskInput<List> input2 =
-        input.toList((target) => new SimpleTaskInput(target, null));
+    ListTaskInput<String> input2 =
+        input.toList((target) => new SimpleTaskInput<String>(target, null));
     expect(input2,
         new isInstanceOf<ListToListTaskInput<AnalysisTarget, String>>());
   }
 
   test_toListOf() {
     var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
-    TaskInput<List> input2 = input.toListOf(result2);
+    ListTaskInput<int> input2 = input.toListOf(result2);
     expect(
         input2, new isInstanceOf<ListToListTaskInput<AnalysisTarget, int>>());
   }
 
   test_toMap() {
     var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
-    TaskInput<Map> input2 =
-        input.toMap((target) => new SimpleTaskInput(target, null));
+    MapTaskInput<AnalysisTarget, String> input2 =
+        input.toMap((target) => new SimpleTaskInput<String>(target, null));
     expect(
         input2, new isInstanceOf<ListToMapTaskInput<AnalysisTarget, String>>());
   }
 
   test_toMapOf() {
     var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
-    TaskInput<Map> input2 = input.toMapOf(result2);
+    MapTaskInput<AnalysisTarget, int> input2 = input.toMapOf(result2);
     expect(input2, new isInstanceOf<ListToMapTaskInput<AnalysisTarget, int>>());
   }
 }
diff --git a/pkg/analyzer/test/src/task/options_work_manager_test.dart b/pkg/analyzer/test/src/task/options_work_manager_test.dart
index 5092f5d..d8a0ec7 100644
--- a/pkg/analyzer/test/src/task/options_work_manager_test.dart
+++ b/pkg/analyzer/test/src/task/options_work_manager_test.dart
@@ -2,8 +2,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.
 
-library analyzer.test.src.task.options_work_manager_test;
-
 import 'package:analyzer/error/error.dart' show AnalysisError;
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/context/cache.dart';
@@ -22,7 +20,6 @@
 import 'package:analyzer/task/dart.dart';
 import 'package:analyzer/task/general.dart';
 import 'package:analyzer/task/model.dart';
-import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -46,7 +43,7 @@
 }
 
 abstract class OptionsWorkManagerTest {
-  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  _InternalAnalysisContextMock context = new _InternalAnalysisContextMock();
   AnalysisCache cache;
   OptionsWorkManager manager;
 
@@ -125,8 +122,8 @@
   }
 
   void test_applyPriorityTargets() {
-    when(context.shouldErrorsBeAnalyzed(source2)).thenReturn(true);
-    when(context.shouldErrorsBeAnalyzed(source3)).thenReturn(true);
+    context.setShouldErrorsBeAnalyzed(source2, true);
+    context.setShouldErrorsBeAnalyzed(source3, true);
     manager.priorityResultQueue
         .add(new TargetedResult(source1, ANALYSIS_OPTIONS_ERRORS));
     manager.priorityResultQueue
@@ -258,14 +255,15 @@
   }
 }
 
-class _InternalAnalysisContextMock extends Mock
-    implements InternalAnalysisContext {
+class _InternalAnalysisContextMock implements InternalAnalysisContext {
   @override
   CachePartition privateAnalysisCachePartition;
 
   @override
   AnalysisCache analysisCache;
 
+  Map<Source, bool> shouldErrorsBeAnalyzedMap = <Source, bool>{};
+
   Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
 
   _InternalAnalysisContextMock() {
@@ -296,4 +294,18 @@
   @override
   ChangeNoticeImpl getNotice(Source source) =>
       _pendingNotices.putIfAbsent(source, () => new ChangeNoticeImpl(source));
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+
+  void setShouldErrorsBeAnalyzed(Source source, bool value) {
+    shouldErrorsBeAnalyzedMap[source] = value;
+  }
+
+  @override
+  bool shouldErrorsBeAnalyzed(Source source) {
+    return shouldErrorsBeAnalyzedMap[source];
+  }
 }
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 d9f803c..b30d121 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -2,8 +2,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.
 
-library analyzer.test.src.task.strong.inferred_type_test;
-
 import 'dart:async';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -4071,7 +4069,7 @@
 
   @failingTest
   test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr1() async {
-    // Note: (f/*<dynamic>*/) is nort properly resulting in an instantiated
+    // Note: (f<dynamic>) is not properly resulting in an instantiated
     // function type due to dartbug.com/25824.
     var mainUnit = await checkFileElement('''
 List<T> f<T>(T g()) => <T>[g()];
@@ -4104,11 +4102,11 @@
 
   @failingTest
   test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr1() async {
-    // TODO(paulberry): for some reason (f/*<int>) is nort properly resulting
+    // TODO(paulberry): for some reason (f<int>) is not properly resulting
     // in an instantiated function type.
     var mainUnit = await checkFileElement('''
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f/int>)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
+var v = (f<int>)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
 ''');
     var v = mainUnit.topLevelVariables[0];
     expect(v.name, 'v');
@@ -4337,7 +4335,7 @@
   @override
   Future<CompilationUnitElement> checkFileElement(String content) async {
     CompilationUnit unit = await checkFile(content);
-    return (unit).element;
+    return unit.element;
   }
 }
 
diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
index b27ef2e..9b51a72 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -4,8 +4,6 @@
 
 // TODO(jmesserly): this file needs to be refactored, it's a port from
 // package:dev_compiler's tests
-library analyzer.test.src.task.strong.strong_test_helper;
-
 import 'dart:async';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -371,7 +369,7 @@
       List<String> nonnullableTypes: AnalysisOptionsImpl.NONNULLABLE_TYPES,
       bool superMixins: false}) async {
     addFile(content);
-    return check(
+    return await check(
         declarationCasts: declarationCasts,
         implicitCasts: implicitCasts,
         implicitDynamic: implicitDynamic,
diff --git a/pkg/analyzer/test/src/task/strong_mode_test.dart b/pkg/analyzer/test/src/task/strong_mode_test.dart
index 6753adc..8aaff8e 100644
--- a/pkg/analyzer/test/src/task/strong_mode_test.dart
+++ b/pkg/analyzer/test/src/task/strong_mode_test.dart
@@ -2,8 +2,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.
 
-library analyzer.test.src.task.strong_mode_test;
-
 import 'dart:async';
 
 import 'package:analyzer/dart/element/element.dart';
@@ -468,7 +466,7 @@
     VariableFilter filter = (variable) => true;
     VariableGatherer gatherer = new VariableGatherer(filter);
     expect(gatherer, isNotNull);
-    expect(gatherer.filter, filter);
+    expect(gatherer.filter, same(filter));
   }
 
   test_creation_withoutFilter() async {
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 76bc78f..285f328 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -393,15 +393,13 @@
           defaultsTo: false,
           negatable: false,
           hide: hide)
-      ..addOption('build-summary-input',
+      ..addMultiOption('build-summary-input',
           help: 'Path to a linked summary file that contains information from '
               'a previous analysis run; may be specified multiple times.',
-          allowMultiple: true,
           hide: hide)
-      ..addOption('build-summary-unlinked-input',
+      ..addMultiOption('build-summary-unlinked-input',
           help: 'Path to an unlinked summary file that contains information '
               'from a previous analysis run; may be specified multiple times.',
-          allowMultiple: true,
           hide: hide)
       ..addOption('build-summary-output',
           help: 'Specifies the path to the file where the full summary '
@@ -508,11 +506,10 @@
           defaultsTo: false,
           negatable: false,
           hide: hide)
-      ..addOption('url-mapping',
+      ..addMultiOption('url-mapping',
           help: '--url-mapping=libraryUri,/path/to/library.dart directs the '
               'analyzer to use "library.dart" as the source for an import '
               'of "libraryUri".',
-          allowMultiple: true,
           splitCommas: false,
           hide: hide)
       ..addFlag('use-cfe',
diff --git a/pkg/compiler/lib/src/elements/resolution_types.dart b/pkg/compiler/lib/src/elements/resolution_types.dart
index 4ecaf3b..e2f677a 100644
--- a/pkg/compiler/lib/src/elements/resolution_types.dart
+++ b/pkg/compiler/lib/src/elements/resolution_types.dart
@@ -132,6 +132,9 @@
   @override
   bool get isFunctionTypeVariable => false;
 
+  @override
+  bool get isFutureOr => false;
+
   /// Is [: true :] if this type is a malformed type.
   bool get isMalformed => false;
 
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 13514a2..3da214e 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -65,6 +65,9 @@
   ///     void Function<T>(T t)
   bool get isFunctionTypeVariable => false;
 
+  /// Is `true` if this type is a `FutureOr` type.
+  bool get isFutureOr => false;
+
   /// Is `true` if this type is a malformed type.
   bool get isMalformed => false;
 
@@ -188,7 +191,7 @@
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! InterfaceType) return false;
-    return _equals(other, null);
+    return _equalsInternal(other, null);
   }
 
   bool _equals(DartType other, _Assumptions assumptions) {
@@ -425,7 +428,7 @@
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! FunctionTypeVariable) return false;
-    return _equals(other, null);
+    return false;
   }
 
   @override
@@ -728,6 +731,52 @@
   }
 }
 
+class FutureOrType extends DartType {
+  final DartType typeArgument;
+
+  FutureOrType(this.typeArgument);
+
+  @override
+  bool get isFutureOr => true;
+
+  @override
+  DartType subst(List<DartType> arguments, List<DartType> parameters) {
+    DartType newTypeArgument = typeArgument.subst(arguments, parameters);
+    if (identical(typeArgument, newTypeArgument)) return this;
+    return new FutureOrType(newTypeArgument);
+  }
+
+  R accept<R, A>(DartTypeVisitor<R, A> visitor, A argument) =>
+      visitor.visitFutureOrType(this, argument);
+
+  int get hashCode => typeArgument.hashCode * 13;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! FutureOrType) return false;
+    return _equalsInternal(other, null);
+  }
+
+  bool _equals(DartType other, _Assumptions assumptions) {
+    if (identical(this, other)) return true;
+    if (other is! FutureOrType) return false;
+    return _equalsInternal(other, assumptions);
+  }
+
+  bool _equalsInternal(FutureOrType other, _Assumptions assumptions) {
+    return typeArgument._equals(other.typeArgument, assumptions);
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('FutureOr');
+    sb.write('<');
+    sb.write(typeArgument);
+    sb.write('>');
+    return sb.toString();
+  }
+}
+
 /// Helper method for performing substitution of a list of types.
 ///
 /// If no types are changed by the substitution, the [types] is returned
@@ -778,6 +827,8 @@
   R visitTypedefType(covariant TypedefType type, A argument) => null;
 
   R visitDynamicType(covariant DynamicType type, A argument) => null;
+
+  R visitFutureOrType(covariant FutureOrType type, A argument) => null;
 }
 
 abstract class BaseDartTypeVisitor<R, A> extends DartTypeVisitor<R, A> {
@@ -809,6 +860,10 @@
   @override
   R visitDynamicType(covariant DynamicType type, A argument) =>
       visitType(type, argument);
+
+  @override
+  R visitFutureOrType(covariant FutureOrType type, A argument) =>
+      visitType(type, argument);
 }
 
 /// Abstract visitor for determining relations between types.
@@ -1078,13 +1133,31 @@
   bool invalidCallableType(covariant DartType callType, covariant DartType s) {
     return !isMoreSpecific(callType, s);
   }
+
+  bool visitFutureOrType(FutureOrType t, covariant DartType s) {
+    return false;
+  }
 }
 
 /// Type visitor that determines the subtype relation two types.
 abstract class SubtypeVisitor<T extends DartType>
     extends MoreSpecificVisitor<T> {
-  bool isSubtype(T t, T s) {
-    return t.treatAsDynamic || isMoreSpecific(t, s);
+  bool isSubtype(DartType t, DartType s) {
+    if (t.treatAsDynamic) return true;
+    if (s.isFutureOr) {
+      FutureOrType sFutureOr = s;
+      if (isSubtype(t, sFutureOr.typeArgument)) {
+        return true;
+      } else if (t.isInterfaceType) {
+        InterfaceType tInterface = t;
+        if (tInterface.element == commonElements.futureClass &&
+            isSubtype(
+                tInterface.typeArguments.single, sFutureOr.typeArgument)) {
+          return true;
+        }
+      }
+    }
+    return isMoreSpecific(t, s);
   }
 
   bool isAssignable(T t, T s) {
@@ -1110,6 +1183,14 @@
   bool invalidCallableType(covariant DartType callType, covariant DartType s) {
     return !isSubtype(callType, s);
   }
+
+  bool visitFutureOrType(FutureOrType t, covariant DartType s) {
+    if (s.isFutureOr) {
+      FutureOrType sFutureOr = s;
+      return isSubtype(t.typeArgument, sFutureOr.typeArgument);
+    }
+    return false;
+  }
 }
 
 /// Type visitor that determines one type could a subtype of another given the
@@ -1117,7 +1198,7 @@
 /// `false` only if we are sure no such substitution exists.
 abstract class PotentialSubtypeVisitor<T extends DartType>
     extends SubtypeVisitor<T> {
-  bool isSubtype(T t, T s) {
+  bool isSubtype(DartType t, DartType s) {
     if (t is TypeVariableType || s is TypeVariableType) {
       return true;
     }
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index 04f691f..a4fbfd7 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -334,6 +334,9 @@
       }
     } else if (annotation.isTypedef || annotation.isFunctionType) {
       otherType = functionType.type;
+    } else if (annotation.isFutureOr) {
+      // TODO(johnniwinther): Support narrowing of FutureOr.
+      return type;
     } else {
       assert(annotation.isTypeVariable);
       // TODO(ngeoffray): Narrow to bound.
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index e67afa3..9b357d1 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -2100,6 +2100,12 @@
       return finish(visit(unaliasedType, emitter));
     }
   }
+
+  @override
+  jsAst.Expression visitFutureOrType(FutureOrType type, Emitter argument) {
+    // TODO(johnniwinther,sigmund): Implement runtime semantics for `FutureOr`.
+    return getDynamicValue();
+  }
 }
 
 class TypeCheckMapping implements TypeChecks {
diff --git a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
index b945d93..f7489b2 100644
--- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
@@ -74,6 +74,8 @@
 
     ParameterStructure parameterStructure = member.parameterStructure;
     int positionalArgumentCount = callStructure.positionalArgumentCount;
+    assert(callStructure.typeArgumentCount == 0 ||
+        callStructure.typeArgumentCount == parameterStructure.typeParameters);
     bool needsTypeArguments =
         callStructure.typeArgumentCount != parameterStructure.typeParameters;
     if (positionalArgumentCount == parameterStructure.totalParameters &&
@@ -109,7 +111,7 @@
     List<jsAst.Expression> argumentsBuffer = new List<jsAst.Expression>(
         parameterStructure.totalParameters +
             extraArgumentCount +
-            parameterStructure.typeParameters);
+            (needsTypeArguments ? parameterStructure.typeParameters : 0));
 
     int count = 0;
     if (isInterceptedMethod) {
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index c6e9710..3e762b9 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -285,6 +285,11 @@
   DartType visitVoidType(VoidType type, EntityConverter converter) {
     return const VoidType();
   }
+
+  @override
+  DartType visitFutureOrType(FutureOrType type, EntityConverter converter) {
+    return new FutureOrType(visit(type.typeArgument, converter));
+  }
 }
 
 const String jsElementPrefix = 'j:';
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index cc058e6..48a25e7 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -130,7 +130,7 @@
   ///
   /// The main method of the first component is used as the main method for the
   /// compilation.
-  void addProgram(ir.Component component);
+  void addComponent(ir.Component component);
 
   /// Returns the [ConstructorEntity] corresponding to a super initializer in
   /// [constructor].
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index ccec600..e00692e 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1220,8 +1220,8 @@
   ///
   /// The main method of the first component is used as the main method for the
   /// compilation.
-  void addProgram(ir.Component component) {
-    _env.addProgram(component);
+  void addComponent(ir.Component component) {
+    _env.addComponent(component);
   }
 
   @override
@@ -1706,10 +1706,12 @@
   @override
   DartType visitInterfaceType(ir.InterfaceType node) {
     ClassEntity cls = elementMap.getClass(node.classNode);
-    // TODO(johnniwinther): We currently encode 'FutureOr' as a dynamic type.
-    // Update the subtyping implementations to handle 'FutureOr' correctly.
     if (cls.name == 'FutureOr' &&
         cls.library == elementMap.commonElements.asyncLibrary) {
+      if (elementMap.options.strongMode) {
+        return new FutureOrType(visitTypes(node.typeArguments).single);
+      }
+      // In Dart 1 we encode 'FutureOr' as a dynamic type.
       return const DynamicType();
     }
     return new InterfaceType(cls, visitTypes(node.typeArguments));
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 0870b99..37d3e65 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -25,15 +25,15 @@
 
 /// Environment for fast lookup of component libraries.
 class ProgramEnv {
-  final Set<ir.Component> _programs = new Set<ir.Component>();
+  final Set<ir.Component> _components = new Set<ir.Component>();
 
   Map<Uri, LibraryEnv> _libraryMap;
 
   /// TODO(johnniwinther): Handle arbitrary load order if needed.
-  ir.Member get mainMethod => _programs.first?.mainMethod;
+  ir.Member get mainMethod => _components.first?.mainMethod;
 
-  void addProgram(ir.Component component) {
-    if (_programs.add(component)) {
+  void addComponent(ir.Component component) {
+    if (_components.add(component)) {
       if (_libraryMap != null) {
         _addLibraries(component);
       }
@@ -49,7 +49,7 @@
   void _ensureLibraryMap() {
     if (_libraryMap == null) {
       _libraryMap = <Uri, LibraryEnv>{};
-      for (ir.Component component in _programs) {
+      for (ir.Component component in _components) {
         _addLibraries(component);
       }
     }
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index ace0223..e6e2ea8 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -884,7 +884,7 @@
 
   // Only visible for unit testing.
   LoadedLibraries createLoadedLibraries(ir.Component component) {
-    _elementMap.addProgram(component);
+    _elementMap.addComponent(component);
     LibraryEntity rootLibrary = null;
     Iterable<ir.Library> libraries = component.libraries;
     if (component.mainMethod != null) {
diff --git a/pkg/compiler/lib/src/old_to_new_api.dart b/pkg/compiler/lib/src/old_to_new_api.dart
index 160739d..78f85d1 100644
--- a/pkg/compiler/lib/src/old_to_new_api.dart
+++ b/pkg/compiler/lib/src/old_to_new_api.dart
@@ -8,6 +8,7 @@
 library compiler.api.legacy;
 
 import 'dart:async' show EventSink, Future;
+import 'dart:convert' show utf8;
 
 import '../compiler.dart';
 import '../compiler_new.dart';
@@ -37,7 +38,7 @@
           return sourceFile;
         case InputKind.binary:
           if (data is String) {
-            data = data.codeUnits;
+            data = utf8.encode(data);
           }
           return new Binary(uri, data);
       }
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index 4a2634a..0658333 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -386,6 +386,18 @@
   }
 
   @override
+  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+    if (externalToken == null) {
+      pushNode(Modifiers.EMPTY);
+    } else {
+      Link<Node> poppedNodes = const Link<Node>();
+      poppedNodes = poppedNodes.prepend(new Identifier(externalToken));
+      NodeList modifierNodes = new NodeList(null, poppedNodes, null, ' ');
+      pushNode(new Modifiers(modifierNodes));
+    }
+  }
+
+  @override
   void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
     bool hasParseError = currentMemberHasParseError;
     memberErrors = memberErrors.tail;
diff --git a/pkg/compiler/lib/src/parser/node_listener.dart b/pkg/compiler/lib/src/parser/node_listener.dart
index 940a35b..54d308e 100644
--- a/pkg/compiler/lib/src/parser/node_listener.dart
+++ b/pkg/compiler/lib/src/parser/node_listener.dart
@@ -550,7 +550,7 @@
     // The name can be an identifier or a send in case of named constructors.
     Expression name = popNode();
     TypeAnnotation type = popNode();
-    Modifiers modifiers = popNode();
+    Modifiers modifiers = new Modifiers(new NodeList.empty());
     NodeList typeVariables = popNode();
     pushNode(new FunctionExpression(name, typeVariables, formals, body, type,
         modifiers, initializers, null, asyncModifier));
@@ -565,7 +565,7 @@
     // The name can be an identifier or a send in case of named constructors.
     Expression name = popNode();
     TypeAnnotation type = popNode();
-    Modifiers modifiers = popNode();
+    Modifiers modifiers = new Modifiers(new NodeList.empty());
     NodeList typeVariables = popNode();
     pushNode(new FunctionDeclaration(new FunctionExpression(name, typeVariables,
         formals, body, type, modifiers, initializers, null, asyncModifier)));
@@ -1009,6 +1009,27 @@
   }
 
   @override
+  void beginFactoryMethod(
+      Token lastConsumed, Token externalToken, Token constToken) {
+    if (externalToken != null) {
+      Link<Node> poppedNodes = const Link<Node>();
+      if (constToken != null) {
+        poppedNodes = poppedNodes.prepend(new Identifier(constToken));
+      }
+      poppedNodes = poppedNodes.prepend(new Identifier(externalToken));
+      NodeList modifierNodes = new NodeList(null, poppedNodes, null, ' ');
+      pushNode(new Modifiers(modifierNodes));
+    } else if (constToken != null) {
+      Link<Node> poppedNodes = const Link<Node>();
+      poppedNodes = poppedNodes.prepend(new Identifier(constToken));
+      NodeList modifierNodes = new NodeList(null, poppedNodes, null, ' ');
+      pushNode(new Modifiers(modifierNodes));
+    } else {
+      pushNode(Modifiers.EMPTY);
+    }
+  }
+
+  @override
   void endFactoryMethod(
       Token beginToken, Token factoryKeyword, Token endToken) {
     super.endFactoryMethod(beginToken, factoryKeyword, endToken);
diff --git a/pkg/compiler/lib/src/serialization/equivalence.dart b/pkg/compiler/lib/src/serialization/equivalence.dart
index 06b0dc3..65f12d5 100644
--- a/pkg/compiler/lib/src/serialization/equivalence.dart
+++ b/pkg/compiler/lib/src/serialization/equivalence.dart
@@ -723,6 +723,12 @@
       FunctionTypeVariable type, ResolutionDartType other) {
     throw new UnsupportedError("Function type variables are not supported.");
   }
+
+  @override
+  bool visitFutureOrType(
+      covariant FutureOrType type, covariant ResolutionDartType other) {
+    throw new UnsupportedError("FutureOr is not supported.");
+  }
 }
 
 /// Visitor that checks for structural equivalence of [ConstantExpression]s.
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 5033547..9bdd008 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -1348,6 +1348,9 @@
     if (type.isFunctionType || type.isMalformed) {
       return new HTypeConversion(type, kind,
           closedWorld.commonMasks.dynamicType, this, sourceInformation);
+    } else if (type.isFutureOr) {
+      // TODO(johnniwinther): Handle conversion to FutureOr.
+      return this;
     }
     assert(type.isInterfaceType);
     if (kind == HTypeConversion.BOOLEAN_CONVERSION_CHECK) {
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 239e873..43580d4 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -461,13 +461,23 @@
       e is PropertyInducingElement &&
           ((e.getter?.isExternal ?? false) || (e.setter?.isExternal ?? false));
 
-  bool _isJSElement(Element e) =>
+  /// Returns true iff this element is a JS interop member.
+  ///
+  /// The element's library must have `@JS(...)` annotation from `package:js`.
+  ///
+  /// If the element is a class, it must also be marked with `@JS`. Other
+  /// elements, such as class members and top-level functions/accessors, should
+  /// be marked `external`.
+  //
+  // TODO(jmesserly): if the element is a member, shouldn't we check that the
+  // class is a JS interop class?
+  bool _usesJSInterop(Element e) =>
       e?.library != null &&
-      _isJSNative(e.library) &&
-      (_isExternal(e) || e is ClassElement && _isJSNative(e));
+      _hasJSInteropAnnotation(e.library) &&
+      (_isExternal(e) || e is ClassElement && _hasJSInteropAnnotation(e));
 
   String _getJSNameWithoutGlobal(Element e) {
-    if (!_isJSElement(e)) return null;
+    if (!_usesJSInterop(e)) return null;
     var libraryJSName = getAnnotationName(e.library, isPublicJSAnnotation);
     var jsName =
         getAnnotationName(e, isPublicJSAnnotation) ?? _getElementName(e);
@@ -492,7 +502,7 @@
   }
 
   JS.Expression _emitJSInteropStaticMemberName(Element e) {
-    if (!_isJSElement(e)) return null;
+    if (!_usesJSInterop(e)) return null;
     var name = getAnnotationName(e, isPublicJSAnnotation);
     if (name != null) {
       if (name.contains('.')) {
@@ -873,7 +883,7 @@
   JS.Statement _emitClassDeclaration(Declaration classNode,
       ClassElement classElem, List<ClassMember> members) {
     // If this class is annotated with `@JS`, then there is nothing to emit.
-    if (findAnnotation(classElem, isPublicJSAnnotation) != null) return null;
+    if (_hasJSInteropAnnotation(classElem)) return null;
 
     // If this is a JavaScript type, emit it now and then exit.
     var jsTypeDef = _emitJSType(classElem);
@@ -921,7 +931,7 @@
     body.addAll(jsCtors);
 
     // Emit things that come after the ES6 `class ... { ... }`.
-    var jsPeerNames = _getJSPeerNames(classElem);
+    var jsPeerNames = _extensionTypes.getNativePeers(classElem);
     if (jsPeerNames.length == 1 && classElem.typeParameters.isNotEmpty) {
       // Special handling for JSArray<E>
       body.add(_callHelperStatement('setExtensionBaseClass(#, #.global.#);',
@@ -1466,7 +1476,7 @@
     var virtualFields = _classProperties.virtualFields;
 
     var jsMethods = <JS.Method>[];
-    bool hasJsPeer = findAnnotation(classElem, isJsPeerInterface) != null;
+    bool hasJsPeer = _extensionTypes.isNativeClass(classElem);
     bool hasIterator = false;
 
     if (type.isObject) {
@@ -1875,25 +1885,6 @@
     }
   }
 
-  /// Gets the JS peer for this Dart type if any, otherwise null.
-  ///
-  /// For example for dart:_interceptors `JSArray` this will return "Array",
-  /// referring to the JavaScript built-in `Array` type.
-  List<String> _getJSPeerNames(ClassElement classElem) {
-    var jsPeerNames = getAnnotationName(
-        classElem,
-        (a) =>
-            isJsPeerInterface(a) ||
-            isNativeAnnotation(a) && _extensionTypes.isNativeClass(classElem));
-    if (classElem.type.isObject) return ['Object'];
-    if (jsPeerNames == null) return [];
-
-    // Omit the special name "!nonleaf" and any future hacks starting with "!"
-    var result =
-        jsPeerNames.split(',').where((peer) => !peer.startsWith("!")).toList();
-    return result;
-  }
-
   void _registerExtensionType(
       ClassElement classElem, String jsPeerName, List<JS.Statement> body) {
     var className = _emitTopLevelName(classElem);
@@ -2015,7 +2006,7 @@
       var type = classElem.type;
       void addField(FieldElement e, JS.Expression value) {
         var args = [
-          _emitStaticAccess(classElem),
+          _emitStaticClassName(classElem),
           _declareMemberName(e.getter),
           value
         ];
@@ -2033,7 +2024,7 @@
         if (f.type != type) continue;
         // static const E id_i = const E(i);
         values.add(new JS.PropertyAccess(
-            _emitStaticAccess(classElem), _declareMemberName(f.getter)));
+            _emitStaticClassName(classElem), _declareMemberName(f.getter)));
         var enumValue = _callHelper('const(new (#.#)(#))', [
           _emitConstructorAccess(type),
           _constructorName(''),
@@ -2051,7 +2042,8 @@
         .map((f) => members[f] as VariableDeclaration)
         .toList();
     if (lazyStatics.isNotEmpty) {
-      body.add(_emitLazyFields(_emitTopLevelName(classElem), lazyStatics));
+      body.add(_emitLazyFields(_emitStaticClassName(classElem), lazyStatics,
+          (e) => _emitStaticMemberName(e.name, e)));
     }
   }
 
@@ -3105,12 +3097,20 @@
 
       // A static native element should just forward directly to the
       // JS type's member.
+      //
+      // TODO(jmesserly): this code path seems broken. It doesn't exist
+      // elsewhere, such as [_emitAccess], so it will only take affect for
+      // unqualified static access inside of the the same class.
+      //
+      // If we want this feature to work, we'll need to implement it in the
+      // standard [_emitStaticClassName] code path, which will need to know the
+      // member we're calling so it can determine whether to use the Dart class
+      // name or the native JS class name.
       if (isStatic && _isExternal(element)) {
-        var nativeName = getAnnotationName(classElem, isNativeAnnotation);
-        if (nativeName != null) {
+        var nativeName = _extensionTypes.getNativePeers(classElem);
+        if (nativeName.isNotEmpty) {
           var memberName = getAnnotationName(element, isJSName) ?? member;
-          return js
-              .call('#.#.#', [_callHelper('global'), nativeName, memberName]);
+          return _callHelper('global.#.#', [nativeName[0], memberName]);
         }
       }
 
@@ -3118,16 +3118,16 @@
       // For method tear-offs, we ensure it's a bound method.
       if (element is MethodElement &&
           !inInvocationContext(node) &&
-          !_isJSNative(classElem)) {
+          !_hasJSInteropAnnotation(classElem)) {
         if (isStatic) {
           // TODO(jmesserly): instead of looking up the function type, we could
           // simply emit it here.
           return _callHelper(
-              'tagStatic(#, #)', [_emitStaticAccess(classElem), member]);
+              'tagStatic(#, #)', [_emitStaticClassName(classElem), member]);
         }
         return _callHelper('bind(this, #)', member);
       }
-      var target = isStatic ? _emitStaticAccess(classElem) : new JS.This();
+      var target = isStatic ? _emitStaticClassName(classElem) : new JS.This();
       return new JS.PropertyAccess(target, member);
     }
 
@@ -3318,10 +3318,10 @@
     return _emitJSInterop(type.element) ?? _emitType(type, nameType: nameType);
   }
 
-  /// Emits an expression that lets you access statics on an [element] from code.
-  JS.Expression _emitStaticAccess(ClassElement element) {
-    _declareBeforeUse(element);
-    return _emitTopLevelName(element);
+  /// Emits an expression that lets you access statics on an [c] from code.
+  JS.Expression _emitStaticClassName(ClassElement c) {
+    _declareBeforeUse(c);
+    return _emitTopLevelName(c);
   }
 
   /// Emits a Dart [type] into code.
@@ -3406,9 +3406,17 @@
   }
 
   JS.PropertyAccess _emitTopLevelNameNoInterop(Element e, {String suffix: ''}) {
-    var name = getJSExportName(e) ?? _getElementName(e);
     return new JS.PropertyAccess(
-        emitLibraryName(e.library), _propertyName(name + suffix));
+        emitLibraryName(e.library), _emitTopLevelMemberName(e, suffix: suffix));
+  }
+
+  /// Emits the member name portion of a top-level member.
+  ///
+  /// NOTE: usually you should use [_emitTopLevelName] instead of this. This
+  /// function does not handle JS interop.
+  JS.Expression _emitTopLevelMemberName(Element e, {String suffix: ''}) {
+    var name = getJSExportName(e) ?? _getElementName(e);
+    return _propertyName(name + suffix);
   }
 
   @override
@@ -3592,7 +3600,7 @@
     var member = _emitMemberName(field.name,
         isStatic: isStatic, type: classElem.type, element: field.setter);
     jsTarget = isStatic
-        ? (new JS.PropertyAccess(_emitStaticAccess(classElem), member)
+        ? (new JS.PropertyAccess(_emitStaticClassName(classElem), member)
           ..sourceInformation = _nodeSpan(id))
         : _emitTargetAccess(jsTarget, member, field.setter, id);
     return _visitExpression(right).toAssignExpression(jsTarget);
@@ -3688,12 +3696,12 @@
       if (member is PropertyAccessorElement) {
         var field = member.variable;
         if (field is FieldElement) {
-          return _emitStaticAccess(field.enclosingElement)
+          return _emitStaticClassName(field.enclosingElement)
             ..sourceInformation = _nodeSpan(target);
         }
       }
       if (member is MethodElement) {
-        return _emitStaticAccess(member.enclosingElement)
+        return _emitStaticClassName(member.enclosingElement)
           ..sourceInformation = _nodeSpan(target);
       }
     }
@@ -4241,7 +4249,8 @@
 
   /// Emits a list of top-level field.
   void _emitTopLevelFields(List<VariableDeclaration> fields) {
-    _moduleItems.add(_emitLazyFields(emitLibraryName(currentLibrary), fields));
+    _moduleItems.add(_emitLazyFields(
+        emitLibraryName(currentLibrary), fields, _emitTopLevelMemberName));
   }
 
   /// Treat dart:_runtime fields as safe to eagerly evaluate.
@@ -4284,18 +4293,19 @@
   }
 
   JS.Statement _emitLazyFields(
-      JS.Expression objExpr, List<VariableDeclaration> fields) {
+      JS.Expression objExpr,
+      List<VariableDeclaration> fields,
+      JS.Expression Function(Element e) emitFieldName) {
     var accessors = <JS.Method>[];
 
     for (var node in fields) {
-      var name = node.name.name;
       var element = node.element;
-      var access = _emitStaticMemberName(name, element);
+      var access = emitFieldName(element);
       accessors.add(closureAnnotate(
           new JS.Method(
               access,
               js.call('function() { return #; }',
-                  _visitInitializer(node.initializer, node.element)) as JS.Fun,
+                  _visitInitializer(node.initializer, element)) as JS.Fun,
               isGetter: true)
             ..sourceInformation = _hoverComment(
                 new JS.PropertyAccess(objExpr, access), node.name),
@@ -4390,7 +4400,7 @@
       // Native factory constructors are JS constructors - use new here.
       var ctor = _emitConstructorName(element, type);
       if (ctorNode != null) ctor.sourceInformation = _nodeSpan(ctorNode);
-      return element.isFactory && !_isJSNative(classElem)
+      return element.isFactory && !_hasJSInteropAnnotation(classElem)
           ? new JS.Call(ctor, args)
           : new JS.New(ctor, args);
     }
@@ -4399,11 +4409,22 @@
   }
 
   bool _isObjectLiteral(Element classElem) {
-    return _isJSNative(classElem) &&
+    return _hasJSInteropAnnotation(classElem) &&
         findAnnotation(classElem, isJSAnonymousAnnotation) != null;
   }
 
-  bool _isJSNative(Element e) =>
+  /// Returns true iff the class has an `@JS(...)` annotation from `package:js`.
+  ///
+  /// Note: usually [_usesJSInterop] should be used instead of this.
+  //
+  // TODO(jmesserly): I think almost all uses of this should be replaced with
+  // [_usesJSInterop], which also checks that the library is marked with `@JS`.
+  //
+  // Right now we have inconsistencies: sometimes we'll respect `@JS` on the
+  // class itself, other places we require it on the library. Also members are
+  // inconsistent: sometimes they need to have `@JS` on them, other times they
+  // need to be `external` in an `@JS` class.
+  bool _hasJSInteropAnnotation(Element e) =>
       findAnnotation(e, isPublicJSAnnotation) != null;
 
   JS.Expression _emitObjectLiteral(ArgumentList argumentList) {
@@ -5219,7 +5240,7 @@
         result = _callHelper('#(#)', [memberName, jsTarget]);
       }
     } else if (accessor is MethodElement &&
-        !_isJSNative(accessor.enclosingElement)) {
+        !_hasJSInteropAnnotation(accessor.enclosingElement)) {
       if (isStatic) {
         result = _callHelper('tagStatic(#, #)', [jsTarget, jsName]);
       } else if (isSuper) {
diff --git a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
index e595819..1a0658c 100644
--- a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
@@ -246,3 +246,12 @@
   }
   return false;
 }
+
+bool isBuiltinAnnotation(
+    DartObjectImpl value, String libraryName, String annotationName) {
+  var e = value?.type?.element;
+  if (e?.name != annotationName) return false;
+  var uri = e.source.uri;
+  var path = uri.pathSegments[0];
+  return uri.scheme == 'dart' && path == libraryName;
+}
diff --git a/pkg/dev_compiler/lib/src/analyzer/extension_types.dart b/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
index 53463fa..b816065 100644
--- a/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
@@ -7,6 +7,7 @@
     show ClassElement, CompilationUnitElement, Element;
 import 'package:analyzer/dart/element/type.dart' show DartType, InterfaceType;
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
+import 'element_helpers.dart' show getAnnotationName, isBuiltinAnnotation;
 
 /// Contains information about native JS types (those types provided by the
 /// implementation) that are also provided by the Dart SDK.
@@ -150,4 +151,21 @@
 
   bool hasNativeSubtype(DartType type) =>
       isNativeInterface(type.element) || isNativeClass(type.element);
+
+  /// Gets the JS peer for this Dart type if any, otherwise null.
+  ///
+  /// For example for dart:_interceptors `JSArray` this will return "Array",
+  /// referring to the JavaScript built-in `Array` type.
+  List<String> getNativePeers(ClassElement classElem) {
+    if (classElem.type.isObject) return ['Object'];
+    var names = getAnnotationName(
+        classElem,
+        (a) =>
+            isBuiltinAnnotation(a, '_js_helper', 'JsPeerInterface') ||
+            isBuiltinAnnotation(a, '_js_helper', 'Native'));
+    if (names == null) return [];
+
+    // Omit the special name "!nonleaf" and any future hacks starting with "!"
+    return names.split(',').where((peer) => !peer.startsWith("!")).toList();
+  }
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/js_interop.dart b/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
index 4e76a27..f0ab80b9 100644
--- a/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
@@ -18,6 +18,8 @@
   var uri = e.source.uri;
   if (uri.scheme == 'package' && uri.path.startsWith('js/')) return true;
   if (uri.scheme == 'dart') {
+    // TODO(jmesserly): this needs cleanup: many of the annotations don't exist
+    // in these libraries.
     return uri.path == '_js_helper' || uri.path == '_foreign_helper';
   }
   return false;
@@ -47,15 +49,6 @@
 bool isJSAnonymousAnnotation(DartObjectImpl value) =>
     _isJsLibType('_Anonymous', value.type.element);
 
-bool isBuiltinAnnotation(
-    DartObjectImpl value, String libraryName, String annotationName) {
-  var e = value?.type?.element;
-  if (e?.name != annotationName) return false;
-  var uri = e.source.uri;
-  var path = uri.pathSegments[0];
-  return uri.scheme == 'dart' && path == libraryName;
-}
-
 /// Whether [value] is a `@JSExportName` (internal annotation used in SDK
 /// instead of `@JS` from `package:js`).
 bool isJSExportNameAnnotation(DartObjectImpl value) =>
@@ -64,12 +57,6 @@
 bool isJSName(DartObjectImpl value) =>
     isBuiltinAnnotation(value, '_js_helper', 'JSName');
 
-bool isJsPeerInterface(DartObjectImpl value) =>
-    isBuiltinAnnotation(value, '_js_helper', 'JsPeerInterface');
-
-bool isNativeAnnotation(DartObjectImpl value) =>
-    isBuiltinAnnotation(value, '_js_helper', 'Native');
-
 bool isNotNullAnnotation(DartObjectImpl value) =>
     isBuiltinAnnotation(value, '_js_helper', '_NotNull');
 
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index d3f8a9f..143c646 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -431,19 +431,27 @@
     assert(_currentLibrary == null);
     _currentLibrary = library;
 
-    // `dart:_runtime` uses a different order for bootstrapping.
-    bool bootstrap = isSdkInternalRuntime(library);
-    if (bootstrap) _emitLibraryProcedures(library);
-
-    library.classes.forEach(_emitClass);
-    library.typedefs.forEach(_emitTypedef);
-    if (bootstrap) {
-      _moduleItems.add(_emitInternalSdkFields(library.fields));
-    } else {
+    if (isSdkInternalRuntime(library)) {
+      // `dart:_runtime` uses a different order for bootstrapping.
+      //
+      // Functions are first because we use them to associate type info
+      // (such as `dart.fn`), then classes/typedefs, then fields
+      // (which instantiate classes).
+      //
+      // For other libraries, we start with classes/types, because functions
+      // often use classes/types from the library in their signature.
+      //
+      // TODO(jmesserly): we can merge these once we change signatures to be
+      // lazily associated at the tear-off point for top-level functions.
       _emitLibraryProcedures(library);
-      var fields = library.fields;
-      if (fields.isNotEmpty)
-        _moduleItems.add(_emitLazyFields(emitLibraryName(library), fields));
+      library.classes.forEach(_emitClass);
+      library.typedefs.forEach(_emitTypedef);
+      _emitTopLevelFields(library.fields);
+    } else {
+      library.classes.forEach(_emitClass);
+      library.typedefs.forEach(_emitTypedef);
+      _emitLibraryProcedures(library);
+      _emitTopLevelFields(library.fields);
     }
 
     _currentLibrary = null;
@@ -551,7 +559,7 @@
     body.addAll(jsCtors);
 
     // Emit things that come after the ES6 `class ... { ... }`.
-    var jsPeerNames = _getJSPeerNames(c);
+    var jsPeerNames = _extensionTypes.getNativePeers(c);
     if (jsPeerNames.length == 1 && c.typeParameters.isNotEmpty) {
       // Special handling for JSArray<E>
       body.add(_callHelperStatement('setExtensionBaseClass(#, #.global.#);',
@@ -1102,7 +1110,8 @@
             .toStatement());
       }
     } else if (fields.isNotEmpty) {
-      body.add(_emitLazyFields(_emitTopLevelName(c), fields));
+      body.add(_emitLazyFields(_emitTopLevelName(c), fields,
+          (n) => _emitStaticMemberName(n.name.name)));
     }
   }
 
@@ -1567,7 +1576,7 @@
     var virtualFields = _classProperties.virtualFields;
 
     var jsMethods = <JS.Method>[];
-    bool hasJsPeer = findAnnotation(c, isJsPeerInterface) != null;
+    bool hasJsPeer = _extensionTypes.isNativeClass(c);
     bool hasIterator = false;
 
     if (c == coreTypes.objectClass) {
@@ -2056,25 +2065,6 @@
   JS.Expression _instantiateAnnotation(Expression node) =>
       _visitExpression(node);
 
-  /// Gets the JS peer for this Dart type if any, otherwise null.
-  ///
-  /// For example for dart:_interceptors `JSArray` this will return "Array",
-  /// referring to the JavaScript built-in `Array` type.
-  List<String> _getJSPeerNames(Class c) {
-    var jsPeerNames = getAnnotationName(
-        c,
-        (a) =>
-            isJsPeerInterface(a) ||
-            isNativeAnnotation(a) && _extensionTypes.isNativeClass(c));
-    if (c == coreTypes.objectClass) return ['Object'];
-    if (jsPeerNames == null) return [];
-
-    // Omit the special name "!nonleaf" and any future hacks starting with "!"
-    var result =
-        jsPeerNames.split(',').where((peer) => !peer.startsWith("!")).toList();
-    return result;
-  }
-
   void _registerExtensionType(
       Class c, String jsPeerName, List<JS.Statement> body) {
     var className = _emitTopLevelName(c);
@@ -2115,50 +2105,55 @@
     _moduleItems.add(result);
   }
 
-  /// Treat dart:_runtime fields as safe to eagerly evaluate.
-  // TODO(jmesserly): it'd be nice to avoid this special case.
-  JS.Statement _emitInternalSdkFields(Iterable<Field> fields) {
-    var lazyFields = <Field>[];
-    var savedUri = _currentUri;
+  void _emitTopLevelFields(List<Field> fields) {
+    if (isSdkInternalRuntime(_currentLibrary)) {
+      /// Treat dart:_runtime fields as safe to eagerly evaluate.
+      // TODO(jmesserly): it'd be nice to avoid this special case.
+      var lazyFields = <Field>[];
+      var savedUri = _currentUri;
+      for (var field in fields) {
+        // Skip our magic undefined constant.
+        if (field.name.name == 'undefined') continue;
 
-    for (var field in fields) {
-      // Skip our magic undefined constant.
-      if (field.name.name == 'undefined') continue;
-
-      var init = field.initializer;
-      if (init == null ||
-          init is BasicLiteral ||
-          init is StaticInvocation && isInlineJS(init.target) ||
-          init is ConstructorInvocation &&
-              isSdkInternalRuntime(init.target.enclosingLibrary)) {
-        _currentUri = field.fileUri;
-        _moduleItems.add(js.statement('# = #;', [
-          _emitTopLevelName(field),
-          _visitInitializer(init, field.annotations)
-        ]));
-      } else {
-        lazyFields.add(field);
+        var init = field.initializer;
+        if (init == null ||
+            init is BasicLiteral ||
+            init is StaticInvocation && isInlineJS(init.target) ||
+            init is ConstructorInvocation &&
+                isSdkInternalRuntime(init.target.enclosingLibrary)) {
+          _currentUri = field.fileUri;
+          _moduleItems.add(js.statement('# = #;', [
+            _emitTopLevelName(field),
+            _visitInitializer(init, field.annotations)
+          ]));
+        } else {
+          lazyFields.add(field);
+        }
       }
+
+      _currentUri = savedUri;
+      fields = lazyFields;
     }
 
-    _currentUri = savedUri;
-    return _emitLazyFields(emitLibraryName(_currentLibrary), lazyFields);
+    if (fields.isEmpty) return;
+    _moduleItems.add(_emitLazyFields(
+        emitLibraryName(_currentLibrary), fields, _emitTopLevelMemberName));
   }
 
-  JS.Statement _emitLazyFields(JS.Expression objExpr, Iterable<Field> fields) {
+  JS.Statement _emitLazyFields(JS.Expression objExpr, Iterable<Field> fields,
+      JS.Expression Function(Field f) emitFieldName) {
     var accessors = <JS.Method>[];
     var savedUri = _currentUri;
 
     for (var field in fields) {
       _currentUri = field.fileUri;
-      var name = field.name.name;
-      var access = _emitStaticMemberName(name);
+      var access = emitFieldName(field);
       accessors.add(new JS.Method(access, _emitStaticFieldInitializer(field),
           isGetter: true)
         ..sourceInformation = _hoverComment(
             new JS.PropertyAccess(objExpr, access),
             field.fileOffset,
-            name.length));
+            field.name.name.length));
 
       // TODO(jmesserly): currently uses a dummy setter to indicate writable.
       if (!field.isFinal && !field.isConst) {
@@ -2415,7 +2410,7 @@
   }
 
   JS.Expression _emitJSInteropStaticMemberName(NamedNode n) {
-    if (!isJSElement(n)) return null;
+    if (!usesJSInterop(n)) return null;
     var name = getAnnotationName(n, isPublicJSAnnotation);
     if (name != null) {
       if (name.contains('.')) {
@@ -2431,13 +2426,21 @@
 
   JS.PropertyAccess _emitTopLevelNameNoInterop(NamedNode n,
       {String suffix: ''}) {
+    return new JS.PropertyAccess(emitLibraryName(getLibrary(n)),
+        _emitTopLevelMemberName(n, suffix: suffix));
+  }
+
+  /// Emits the member name portion of a top-level member.
+  ///
+  /// NOTE: usually you should use [_emitTopLevelName] instead of this. This
+  /// function does not handle JS interop.
+  JS.Expression _emitTopLevelMemberName(NamedNode n, {String suffix: ''}) {
     var name = getJSExportName(n) ?? getTopLevelName(n);
-    return new JS.PropertyAccess(
-        emitLibraryName(getLibrary(n)), _propertyName(name + suffix));
+    return _propertyName(name + suffix);
   }
 
   String _getJSNameWithoutGlobal(NamedNode n) {
-    if (!isJSElement(n)) return null;
+    if (!usesJSInterop(n)) return null;
     var libraryJSName = getAnnotationName(getLibrary(n), isPublicJSAnnotation);
     var jsName =
         getAnnotationName(n, isPublicJSAnnotation) ?? getTopLevelName(n);
@@ -2695,8 +2698,8 @@
             _emitConstructorAccess(type), _constructorName(c.name.name));
   }
 
-  /// Emits an expression that lets you access statics on an [element] from code.
-  JS.Expression _emitStaticAccess(Class c) {
+  /// Emits an expression that lets you access statics on an [c] from code.
+  JS.Expression _emitStaticClassName(Class c) {
     _declareBeforeUse(c);
     return _emitTopLevelName(c);
   }
@@ -3799,7 +3802,7 @@
       }
     } else if (member is Procedure &&
         !member.isAccessor &&
-        !_isJSNative(member.enclosingClass)) {
+        !hasJSInteropAnnotation(member.enclosingClass)) {
       return _callHelper('bind(#, #)', [jsReceiver, jsName]);
     } else {
       return new JS.PropertyAccess(jsReceiver, jsName);
@@ -3828,7 +3831,7 @@
     var jsTarget = _emitSuperTarget(target);
     if (target is Procedure &&
         !target.isAccessor &&
-        !_isJSNative(target.enclosingClass)) {
+        !hasJSInteropAnnotation(target.enclosingClass)) {
       return _callHelper('bind(this, #, #)', [jsTarget.selector, jsTarget]);
     }
     return jsTarget;
@@ -4329,7 +4332,7 @@
   JS.Expression _emitStaticTarget(Member target) {
     var c = target.enclosingClass;
     if (c != null) {
-      return new JS.PropertyAccess(_emitStaticAccess(c),
+      return new JS.PropertyAccess(_emitStaticClassName(c),
           _emitStaticMemberName(target.name.name, target));
     }
     return _emitTopLevelName(target);
@@ -4530,7 +4533,7 @@
     var args = node.arguments;
     var ctor = node.target;
     var ctorClass = ctor.enclosingClass;
-    if (ctor.isExternal && _isJSNative(ctorClass)) {
+    if (ctor.isExternal && hasJSInteropAnnotation(ctorClass)) {
       return _emitJSInteropNew(ctor, args);
     }
 
@@ -4607,7 +4610,7 @@
 
   JS.Expression _emitJSInteropNew(Member ctor, Arguments args) {
     var ctorClass = ctor.enclosingClass;
-    if (_isObjectLiteral(ctorClass)) return _emitObjectLiteral(args);
+    if (isJSAnonymousType(ctorClass)) return _emitObjectLiteral(args);
     return new JS.New(_emitConstructorName(ctorClass.rawType, ctor),
         _emitArgumentList(args, types: false));
   }
@@ -4628,12 +4631,6 @@
     return _emitType(new InterfaceType(c, typeArgs));
   }
 
-  bool _isObjectLiteral(Class c) {
-    return _isJSNative(c) && c.annotations.any(isJSAnonymousAnnotation);
-  }
-
-  bool _isJSNative(Class c) => c.annotations.any(isPublicJSAnnotation);
-
   JS.Expression _emitObjectLiteral(Arguments node) {
     var args = _emitArgumentList(node);
     if (args.isEmpty) return js.call('{}');
diff --git a/pkg/dev_compiler/lib/src/kernel/js_interop.dart b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
index 419823b..890edab 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
@@ -45,7 +45,7 @@
 bool isPublicJSAnnotation(Expression value) =>
     _annotationIsFromJSLibrary('JS', value);
 
-bool isJSAnonymousAnnotation(Expression value) =>
+bool _isJSAnonymousAnnotation(Expression value) =>
     _annotationIsFromJSLibrary('_Anonymous', value);
 
 bool _isBuiltinAnnotation(
@@ -80,21 +80,37 @@
     _isBuiltinAnnotation(value, '_js_helper', 'Native');
 
 bool isJSAnonymousType(Class namedClass) {
-  return _isJSNative(namedClass) &&
-      findAnnotation(namedClass, isJSAnonymousAnnotation) != null;
+  return hasJSInteropAnnotation(namedClass) &&
+      findAnnotation(namedClass, _isJSAnonymousAnnotation) != null;
 }
 
-// TODO(jmesserly): rename this after port
-bool isJSElement(NamedNode n) {
+/// Returns true iff the class has an `@JS(...)` annotation from `package:js`.
+///
+/// Note: usually [_usesJSInterop] should be used instead of this.
+//
+// TODO(jmesserly): I think almost all uses of this should be replaced with
+// [_usesJSInterop], which also checks that the library is marked with `@JS`.
+//
+// Right now we have inconsistencies: sometimes we'll respect `@JS` on the
+// class itself, other places we require it on the library. Also members are
+// inconsistent: sometimes they need to have `@JS` on them, other times they
+// need to be `external` in an `@JS` class.
+bool hasJSInteropAnnotation(Class c) => c.annotations.any(isPublicJSAnnotation);
+
+/// Returns true iff this element is a JS interop member.
+///
+/// The element's library must have `@JS(...)` annotation from `package:js`.
+/// If the element is a class, it must also be marked with `@JS`. Other
+/// elements, such as class members and top-level functions/accessors, should
+/// be marked `external`.
+bool usesJSInterop(NamedNode n) {
   var library = getLibrary(n);
   return library != null &&
-      _isJSNative(library) &&
-      (n is Procedure && n.isExternal || n is Class && _isJSNative(n));
+      library.annotations.any(isPublicJSAnnotation) &&
+      (n is Procedure && n.isExternal ||
+          n is Class && n.annotations.any(isPublicJSAnnotation));
 }
 
-bool _isJSNative(NamedNode n) =>
-    findAnnotation(n, isPublicJSAnnotation) != null;
-
 /// Returns the name value of the `JSExportName` annotation (when compiling
 /// the SDK), or `null` if there's none. This is used to control the name
 /// under which functions are compiled and exported.
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index 312116b..18fb1a3 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -92,6 +92,14 @@
 /// If [node] has annotation matching [test] and the first argument is a
 /// string, this returns the string value.
 ///
+/// Calls [findAnnotation] followed by [getNameFromAnnotation].
+String getAnnotationName(NamedNode node, bool test(Expression value)) {
+  return getNameFromAnnotation(findAnnotation(node, test));
+}
+
+/// If [node] is an annotation and the first argument is a string, this returns
+/// the string value.
+///
 /// For example
 ///
 ///     class MyAnnotation {
@@ -103,15 +111,11 @@
 ///     @MyAnnotation('FooBar')
 ///     main() { ... }
 ///
-/// If we match the annotation for the `@MyAnnotation('FooBar')` this will
-/// return the string `'FooBar'`.
-String getAnnotationName(NamedNode node, bool test(Expression value)) {
-  var match = findAnnotation(node, test);
-  if (match is ConstructorInvocation && match.arguments.positional.isNotEmpty) {
-    var first = _followConstFields(match.arguments.positional[0]);
-    if (first is StringLiteral) {
-      return first.value;
-    }
+/// Given teh node for `@MyAnnotation('FooBar')` this will return `'FooBar'`.
+String getNameFromAnnotation(ConstructorInvocation node) {
+  if (node != null && node.arguments.positional.isNotEmpty) {
+    var first = _followConstFields(node.arguments.positional[0]);
+    if (first is StringLiteral) return first.value;
   }
   return null;
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index e862eb9..1ac42bb 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -6,6 +6,7 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/library_index.dart';
+import 'kernel_helpers.dart' show getNameFromAnnotation;
 
 /// Contains information about native JS types (those types provided by the
 /// implementation) that are also provided by the Dart SDK.
@@ -64,18 +65,6 @@
     _addPendingExtensionTypes(sdk.getLibrary('dart:web_sql'));
   }
 
-  bool _isNative(Class c) {
-    for (var annotation in c.annotations) {
-      if (annotation is ConstructorInvocation) {
-        var c = annotation.target.enclosingClass;
-        if (c.name == 'Native' || c.name == 'JsPeerInterface') {
-          if (c.enclosingLibrary.importUri.scheme == 'dart') return true;
-        }
-      }
-    }
-    return false;
-  }
-
   void _addExtensionType(Class c, [bool mustBeNative = false]) {
     if (c == coreTypes.objectClass) return;
     if (_extensibleTypes.contains(c) || _nativeTypes.contains(c)) {
@@ -129,4 +118,32 @@
       _processPending(c) && _extensibleTypes.contains(c);
 
   bool hasNativeSubtype(Class c) => isNativeInterface(c) || isNativeClass(c);
+
+  /// Gets the JS peer for this Dart type if any, otherwise null.
+  ///
+  /// For example for dart:_interceptors `JSArray` this will return "Array",
+  /// referring to the JavaScript built-in `Array` type.
+  List<String> getNativePeers(Class c) {
+    if (c == coreTypes.objectClass) return ['Object'];
+    var names = getNameFromAnnotation(_getNativeAnnotation(c));
+    if (names == null) return const [];
+
+    // Omit the special name "!nonleaf" and any future hacks starting with "!"
+    return names.split(',').where((peer) => !peer.startsWith("!")).toList();
+  }
+}
+
+bool _isNative(Class c) => _getNativeAnnotation(c) != null;
+
+ConstructorInvocation _getNativeAnnotation(Class c) {
+  for (var annotation in c.annotations) {
+    if (annotation is ConstructorInvocation) {
+      var c = annotation.target.enclosingClass;
+      if ((c.name == 'Native' || c.name == 'JsPeerInterface') &&
+          c.enclosingLibrary.importUri.scheme == 'dart') {
+        return annotation;
+      }
+    }
+  }
+  return null;
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index de39cbb..3e7dd29 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -1118,7 +1118,7 @@
     unshiftedDigits[3] = 0x10 | (bits[6] & 0xF);
 
     var unshiftedBig = new _BigIntImpl._normalized(false, 4, unshiftedDigits);
-    _BigIntImpl absResult;
+    _BigIntImpl absResult = unshiftedBig;
     if (exponent < 0) {
       absResult = unshiftedBig >> -exponent;
     } else if (exponent > 0) {
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index cbe7ebc..f0a3761 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -102,7 +102,7 @@
   /// all method bodies are left out. In essence, it contains just API
   /// signatures and constants. When strong-mode is enabled, the summary already
   /// includes inferred types.
-  Component _sdkSummaryProgram;
+  Component _sdkSummaryComponent;
 
   /// The summary for each uri in `options.inputSummaries`.
   ///
@@ -110,9 +110,9 @@
   /// all method bodies are left out. In essence, it contains just API
   /// signatures and constants. When strong-mode is enabled, the summary already
   /// includes inferred types.
-  List<Component> _inputSummariesPrograms;
+  List<Component> _inputSummariesComponents;
 
-  /// Other programs that are meant to be linked and compiled with the input
+  /// Other components that are meant to be linked and compiled with the input
   /// sources.
   List<Component> _linkedDependencies;
 
@@ -282,6 +282,14 @@
           Severity.internalProblem);
       return false;
     }
+
+    for (Uri source in _raw.linkedDependencies) {
+      if (!await fileSystem.entityForUri(source).exists()) {
+        reportWithoutLocation(
+            templateInputFileNotFound.withArguments(source), Severity.error);
+        return false;
+      }
+    }
     return true;
   }
 
@@ -309,38 +317,38 @@
   /// Get an outline component that summarizes the SDK, if any.
   // TODO(sigmund): move, this doesn't feel like an "option".
   Future<Component> loadSdkSummary(CanonicalName nameRoot) async {
-    if (_sdkSummaryProgram == null) {
+    if (_sdkSummaryComponent == null) {
       if (sdkSummary == null) return null;
       var bytes = await loadSdkSummaryBytes();
-      _sdkSummaryProgram = loadComponent(bytes, nameRoot);
+      _sdkSummaryComponent = loadComponent(bytes, nameRoot);
     }
-    return _sdkSummaryProgram;
+    return _sdkSummaryComponent;
   }
 
   void set sdkSummaryComponent(Component platform) {
-    if (_sdkSummaryProgram != null) {
+    if (_sdkSummaryComponent != null) {
       throw new StateError("sdkSummary already loaded.");
     }
-    _sdkSummaryProgram = platform;
+    _sdkSummaryComponent = platform;
   }
 
   /// Get the summary programs for each of the underlying `inputSummaries`
   /// provided via [CompilerOptions].
   // TODO(sigmund): move, this doesn't feel like an "option".
   Future<List<Component>> loadInputSummaries(CanonicalName nameRoot) async {
-    if (_inputSummariesPrograms == null) {
+    if (_inputSummariesComponents == null) {
       var uris = _raw.inputSummaries;
       if (uris == null || uris.isEmpty) return const <Component>[];
       // TODO(sigmund): throttle # of concurrent opreations.
       var allBytes = await Future
           .wait(uris.map((uri) => fileSystem.entityForUri(uri).readAsBytes()));
-      _inputSummariesPrograms =
+      _inputSummariesComponents =
           allBytes.map((bytes) => loadComponent(bytes, nameRoot)).toList();
     }
-    return _inputSummariesPrograms;
+    return _inputSummariesComponents;
   }
 
-  /// Load each of the [CompilerOptions.linkedDependencies] programs.
+  /// Load each of the [CompilerOptions.linkedDependencies] components.
   // TODO(sigmund): move, this doesn't feel like an "option".
   Future<List<Component>> loadLinkDependencies(CanonicalName nameRoot) async {
     if (_linkedDependencies == null) {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index 2be3fcf..d033d7d 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -25,7 +25,7 @@
   /// Source targets are compiled against these binary libraries.
   final libraries = <Library>[];
 
-  /// Sources for all appended programs.
+  /// Sources for all appended components.
   final Map<Uri, Source> uriToSource = <Uri, Source>{};
 
   DillLoader(TargetImplementation target) : super(target);
diff --git a/pkg/front_end/lib/src/fasta/get_dependencies.dart b/pkg/front_end/lib/src/fasta/get_dependencies.dart
index 14165b7..37ee55e 100644
--- a/pkg/front_end/lib/src/fasta/get_dependencies.dart
+++ b/pkg/front_end/lib/src/fasta/get_dependencies.dart
@@ -47,8 +47,8 @@
         new DillTarget(c.options.ticker, uriTranslator, c.options.target);
     if (platform != null) {
       var bytes = await fileSystem.entityForUri(platform).readAsBytes();
-      var platformProgram = loadComponentFromBytes(bytes);
-      dillTarget.loader.appendLibraries(platformProgram);
+      var platformComponent = loadComponentFromBytes(bytes);
+      dillTarget.loader.appendLibraries(platformComponent);
     }
     KernelTarget kernelTarget = new KernelTarget(
         fileSystem, false, dillTarget, uriTranslator,
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index eba0a79..b3039b5 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -133,7 +133,7 @@
 
       // This is not the full program. It is the component including all
       // libraries loaded from .dill files.
-      Component programWithDill =
+      Component componentWithDill =
           await userCode.buildComponent(verify: c.options.verify);
 
       List<Library> libraries =
@@ -160,9 +160,9 @@
 
       // This component represents the parts of the program that were
       // recompiled.
-      Procedure mainMethod = programWithDill == null
+      Procedure mainMethod = componentWithDill == null
           ? data.userLoadedUriMain
-          : programWithDill.mainMethod;
+          : componentWithDill.mainMethod;
       return new Component(libraries: libraries, uriToSource: data.uriToSource)
         ..mainMethod = mainMethod;
     });
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 7c7babc..bdf106f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -22,7 +22,6 @@
         FormalParameterKind,
         IdentifierContext,
         MemberKind,
-        closeBraceTokenFor,
         lengthForToken,
         lengthOfSpan,
         offsetForToken,
@@ -816,8 +815,7 @@
   @override
   void handleParenthesizedExpression(Token token) {
     debugEvent("ParenthesizedExpression");
-    push(new ParenthesizedExpression(
-        this, popForValue(), closeBraceTokenFor(token)));
+    push(new ParenthesizedExpression(this, popForValue(), token.endGroup));
   }
 
   @override
@@ -1786,7 +1784,7 @@
         addProblem(
             fasta.messageListLiteralTooManyTypeArguments,
             offsetForToken(beginToken),
-            lengthOfSpan(beginToken, closeBraceTokenFor(beginToken)));
+            lengthOfSpan(beginToken, beginToken.endGroup));
       } else if (library.loader.target.strongMode) {
         typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
       }
@@ -1834,7 +1832,7 @@
         addProblem(
             fasta.messageListLiteralTypeArgumentMismatch,
             offsetForToken(beginToken),
-            lengthOfSpan(beginToken, closeBraceTokenFor(beginToken)));
+            lengthOfSpan(beginToken, beginToken.endGroup));
       } else {
         if (library.loader.target.strongMode) {
           keyType =
@@ -2861,7 +2859,6 @@
     var returnType = pop();
     var hasImplicitReturnType = returnType == null;
     returnType ??= const DynamicType();
-    pop(); // Modifiers.
     exitFunction();
     List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop());
     FunctionNode function = formals.addToFunction(new FunctionNode(body,
diff --git a/pkg/front_end/lib/src/fasta/parser.dart b/pkg/front_end/lib/src/fasta/parser.dart
index 17c0d5c..13713da 100644
--- a/pkg/front_end/lib/src/fasta/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser.dart
@@ -31,12 +31,7 @@
 export 'parser/top_level_parser.dart' show TopLevelParser;
 
 export 'parser/util.dart'
-    show
-        closeBraceTokenFor,
-        lengthForToken,
-        lengthOfSpan,
-        offsetForToken,
-        optional;
+    show lengthForToken, lengthOfSpan, offsetForToken, optional;
 
 List<ParserError> parse(Token tokens) {
   Listener listener = new Listener();
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 2ff44b0..c5c0802 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -141,8 +141,9 @@
   }
 
   @override
-  void beginFactoryMethod(Token lastConsumed) {
-    listener?.beginFactoryMethod(lastConsumed);
+  void beginFactoryMethod(
+      Token lastConsumed, Token externalToken, Token constToken) {
+    listener?.beginFactoryMethod(lastConsumed, externalToken, constToken);
   }
 
   @override
@@ -368,8 +369,8 @@
   }
 
   @override
-  void beginTopLevelMethod(Token lastConsumed) {
-    listener?.beginTopLevelMethod(lastConsumed);
+  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+    listener?.beginTopLevelMethod(lastConsumed, externalToken);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index b7d921e..167775d 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -224,7 +224,8 @@
     logEvent("ExpressionStatement");
   }
 
-  void beginFactoryMethod(Token lastConsumed) {}
+  void beginFactoryMethod(
+      Token lastConsumed, Token externalToken, Token constToken) {}
 
   void endFactoryMethod(
       Token beginToken, Token factoryKeyword, Token endToken) {
@@ -327,7 +328,6 @@
   /// A function declaration.
   ///
   /// Substructures:
-  /// - Modifiers
   /// - Return type
   /// - Name
   /// - Type variables
@@ -817,7 +817,7 @@
     logEvent("TopLevelFields");
   }
 
-  void beginTopLevelMethod(Token lastConsumed) {}
+  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {}
 
   /// Handle the end of a top level method.  Substructures:
   /// - metadata
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 0778f66..d48c0a3 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -101,7 +101,7 @@
         isValidTypeReference,
         noTypeInfo;
 
-import 'util.dart' show closeBraceTokenFor, optional;
+import 'util.dart' show optional;
 
 /// An event generating parser of Dart programs. This parser expects all tokens
 /// in a linked list (aka a token stream).
@@ -1076,7 +1076,7 @@
       listener.endFormalParameters(0, token, token, kind);
       return reportUnexpectedToken(token);
     }
-    Token closeBrace = closeBraceTokenFor(token);
+    Token closeBrace = token.endGroup;
     listener.endFormalParameters(0, token, closeBrace, kind);
     return closeBrace;
   }
@@ -1488,7 +1488,7 @@
     /// [isValidMethodTypeArguments].
     Token tryParseMethodTypeArguments(Token token) {
       if (!identical(token.kind, LT_TOKEN)) return null;
-      Token endToken = closeBraceTokenFor(token);
+      Token endToken = token.endGroup;
       if (endToken == null ||
           !identical(endToken.next.kind, OPEN_PAREN_TOKEN)) {
         return null;
@@ -1596,7 +1596,7 @@
 
   Token skipBlock(Token token) {
     token = ensureBlock(token, null);
-    Token closeBrace = closeBraceTokenFor(token);
+    Token closeBrace = token.endGroup;
     if (closeBrace == null ||
         !identical(closeBrace.kind, $CLOSE_CURLY_BRACKET)) {
       return reportUnmatchedToken(token).next;
@@ -2278,7 +2278,7 @@
     /// The tokens before the start of type variables of function types seen
     /// during analysis. Notice that the tokens in this list might precede
     /// either `'<'` or `'('` as not all function types have type parameters.
-    /// Also, it is safe to assume that [closeBraceTokenFor] will return
+    /// Also, it is safe to assume that token.endGroup will return
     /// non-null for all of the tokens following these tokens.
     Link<Token> typeVariableStarters = const Link<Token>();
 
@@ -2316,7 +2316,7 @@
           token = beforeToken.next;
         }
         if (optional("<", token)) {
-          Token close = closeBraceTokenFor(token);
+          Token close = token.endGroup;
           if (close != null &&
               (optional(">", close) || optional(">>", close))) {
             // We found some type arguments.
@@ -2338,7 +2338,7 @@
       while (optional("Function", token)) {
         Token typeVariableStart = token;
         if (optional("<", token.next)) {
-          Token close = closeBraceTokenFor(token.next);
+          Token close = token.next.endGroup;
           if (close != null && optional(">", close)) {
             beforeToken = previousToken(token, close);
             token = close;
@@ -2348,7 +2348,7 @@
         }
         if (optional("(", token.next)) {
           // This is a function type.
-          Token close = closeBraceTokenFor(token.next);
+          Token close = token.next.endGroup;
           assert(optional(")", close));
           looksLikeType = true;
           functionTypes++;
@@ -2398,7 +2398,7 @@
         Token functionToken = next;
         if (optional("<", next.next)) {
           // Skip type parameters, they were parsed above.
-          next = closeBraceTokenFor(next.next);
+          next = next.next.endGroup;
         }
         token = parseFormalParametersRequiredOpt(
             next, MemberKind.GeneralizedFunctionType);
@@ -2439,12 +2439,12 @@
       }
       token = token.next;
       if (optional('<', token)) {
-        Token closeBrace = closeBraceTokenFor(token);
+        Token closeBrace = token.endGroup;
         if (closeBrace == null) return false;
         token = closeBrace.next;
       }
       if (optional('(', token)) {
-        return looksLikeFunctionBody(closeBraceTokenFor(token).next);
+        return looksLikeFunctionBody(token.endGroup.next);
       }
       return false;
     }
@@ -2513,7 +2513,7 @@
             return parseVariablesDeclaration(beforeBegin);
           } else if (OPEN_PAREN_TOKEN == afterIdKind) {
             // We are looking at `type identifier '('`.
-            if (looksLikeFunctionBody(closeBraceTokenFor(afterId).next)) {
+            if (looksLikeFunctionBody(afterId.endGroup.next)) {
               // We are looking at `type identifier '(' ... ')'` followed
               // `( '{' | '=>' | 'async' | 'sync' )`.
 
@@ -2522,7 +2522,6 @@
               Token beforeFormals = parseTypeVariablesOpt(token);
 
               listener.beginLocalFunctionDeclaration(begin);
-              listener.handleModifiers(0);
               if (voidToken != null) {
                 listener.handleVoidKeyword(voidToken);
               } else {
@@ -2533,16 +2532,14 @@
             }
           } else if (identical(afterIdKind, LT_TOKEN)) {
             // We are looking at `type identifier '<'`.
-            Token beforeFormals = closeBraceTokenFor(afterId);
+            Token beforeFormals = afterId.endGroup;
             if (beforeFormals?.next != null &&
                 optional("(", beforeFormals.next)) {
-              if (looksLikeFunctionBody(
-                  closeBraceTokenFor(beforeFormals.next).next)) {
+              if (looksLikeFunctionBody(beforeFormals.next.endGroup.next)) {
                 // We are looking at "type identifier '<' ... '>' '(' ... ')'"
                 // followed by '{', '=>', 'async', or 'sync'.
                 parseTypeVariablesOpt(token);
                 listener.beginLocalFunctionDeclaration(begin);
-                listener.handleModifiers(0);
                 if (voidToken != null) {
                   listener.handleVoidKeyword(voidToken);
                 } else {
@@ -2560,7 +2557,7 @@
           if (optional(':', token.next)) {
             return parseLabeledStatement(beforeToken);
           } else if (optional('(', token.next)) {
-            if (looksLikeFunctionBody(closeBraceTokenFor(token.next).next)) {
+            if (looksLikeFunctionBody(token.next.endGroup.next)) {
               // We are looking at `identifier '(' ... ')'` followed by `'{'`,
               // `'=>'`, `'async'`, or `'sync'`.
 
@@ -2569,19 +2566,17 @@
               Token formals = parseTypeVariablesOpt(token);
 
               listener.beginLocalFunctionDeclaration(token);
-              listener.handleModifiers(0);
               listener.handleNoType(token);
               return parseNamedFunctionRest(beforeToken, begin, formals, false);
             }
           } else if (optional('<', token.next)) {
-            Token gt = closeBraceTokenFor(token.next);
+            Token gt = token.next.endGroup;
             if (gt?.next != null && optional("(", gt.next)) {
-              if (looksLikeFunctionBody(closeBraceTokenFor(gt.next).next)) {
+              if (looksLikeFunctionBody(gt.next.endGroup.next)) {
                 // We are looking at `identifier '<' ... '>' '(' ... ')'`
                 // followed by `'{'`, `'=>'`, `'async'`, or `'sync'`.
                 parseTypeVariablesOpt(token);
                 listener.beginLocalFunctionDeclaration(token);
-                listener.handleModifiers(0);
                 listener.handleNoType(token);
                 return parseNamedFunctionRest(beforeToken, begin, gt, false);
               }
@@ -2632,7 +2627,6 @@
 
         Token formals = parseTypeVariablesOpt(name);
         listener.beginNamedFunctionExpression(begin);
-        listener.handleModifiers(0);
         if (hasReturnType) {
           if (voidToken != null) {
             listener.handleVoidKeyword(voidToken);
@@ -2760,7 +2754,7 @@
 
         Token inlineFunctionTypeStart;
         if (optional("<", token)) {
-          Token closer = closeBraceTokenFor(token);
+          Token closer = token.endGroup;
           if (closer != null) {
             if (optional("(", closer.next)) {
               if (varFinalOrConst != null) {
@@ -2778,7 +2772,7 @@
                 varFinalOrConst, fasta.messageFunctionTypedParameterVar);
           }
           inlineFunctionTypeStart = beforeToken;
-          beforeToken = closeBraceTokenFor(token);
+          beforeToken = token.endGroup;
           token = beforeToken.next;
         }
 
@@ -3135,16 +3129,7 @@
 
   Token parseTopLevelMethod(Token beforeStart, Token externalToken,
       Token beforeType, Token getOrSet, Token beforeName) {
-    listener.beginTopLevelMethod(beforeStart);
-
-    // TODO(danrubel): Consider passing modifiers via endTopLevelMethod
-    // rather than handleModifier and handleModifiers
-    if (externalToken != null) {
-      listener.handleModifier(externalToken);
-      listener.handleModifiers(1);
-    } else {
-      listener.handleModifiers(0);
-    }
+    listener.beginTopLevelMethod(beforeStart, externalToken);
 
     if (beforeType == null) {
       listener.handleNoType(beforeName);
@@ -3561,7 +3546,7 @@
     if (!optional('{', token)) {
       token = ensureBlock(previousToken, fasta.templateExpectedClassBody);
     }
-    Token closeBrace = closeBraceTokenFor(token);
+    Token closeBrace = token.endGroup;
     if (closeBrace == null ||
         !identical(closeBrace.kind, $CLOSE_CURLY_BRACKET)) {
       return reportUnmatchedToken(token).next;
@@ -3900,28 +3885,17 @@
       varFinalOrConst = context.varFinalOrConst;
     }
 
-    int modifierCount = 0;
-    if (externalToken != null) {
-      listener.handleModifier(externalToken);
-      ++modifierCount;
-    }
     if (staticOrCovariant != null) {
       reportRecoverableErrorWithToken(
           staticOrCovariant, fasta.templateExtraneousModifier);
     }
-    if (varFinalOrConst != null) {
-      if (optional('const', varFinalOrConst)) {
-        listener.handleModifier(varFinalOrConst);
-        ++modifierCount;
-      } else {
-        reportRecoverableErrorWithToken(
-            varFinalOrConst, fasta.templateExtraneousModifier);
-        varFinalOrConst = null;
-      }
+    if (varFinalOrConst != null && !optional('const', varFinalOrConst)) {
+      reportRecoverableErrorWithToken(
+          varFinalOrConst, fasta.templateExtraneousModifier);
+      varFinalOrConst = null;
     }
-    listener.handleModifiers(modifierCount);
 
-    listener.beginFactoryMethod(beforeStart);
+    listener.beginFactoryMethod(beforeStart, externalToken, varFinalOrConst);
     token = parseConstructorReference(token);
     token = parseFormalParametersRequiredOpt(token, MemberKind.Factory);
     Token asyncToken = token.next;
@@ -4003,7 +3977,6 @@
   /// - Type variables.
   /// - `beginLocalFunctionDeclaration` if [isFunctionExpression] is false,
   ///   otherwise `beginNamedFunctionExpression`.
-  /// - Modifiers.
   /// - Return type.
   Token parseNamedFunctionRest(
       Token beforeName, Token begin, Token formals, bool isFunctionExpression) {
@@ -4518,7 +4491,7 @@
           //   Foo() : map = {};
           //   Foo.x() : map = true ? {} : {};
           // }
-          token = closeBraceTokenFor(next.next) ?? next;
+          token = next.next.endGroup ?? next;
           next = token.next;
           continue;
         }
@@ -4529,10 +4502,10 @@
           //   Foo() : map = <String, Foo>{};
           //   Foo.x() : map = true ? <String, Foo>{} : <String, Foo>{};
           // }
-          token = closeBraceTokenFor(next.next) ?? next;
+          token = next.next.endGroup ?? next;
           next = token.next;
           if (identical(next.stringValue, '{')) {
-            token = closeBraceTokenFor(next) ?? next;
+            token = next.endGroup ?? next;
             next = token.next;
           }
           continue;
@@ -4542,7 +4515,7 @@
         break;
       }
       if (next is BeginToken) {
-        token = closeBraceTokenFor(next) ?? next;
+        token = next.endGroup ?? next;
       } else {
         if (next is ErrorToken) {
           reportErrorToken(next, false);
@@ -4882,7 +4855,7 @@
   Token parseParenthesizedExpressionOrFunctionLiteral(Token token) {
     Token next = token.next;
     assert(optional('(', next));
-    Token nextToken = closeBraceTokenFor(next).next;
+    Token nextToken = next.endGroup.next;
     int kind = nextToken.kind;
     if (mayParseFunctionExpressions) {
       if ((identical(kind, FUNCTION_TOKEN) ||
@@ -5071,7 +5044,7 @@
   Token parseLiteralFunctionSuffix(Token token) {
     Token next = token.next;
     assert(optional('(', next));
-    Token closeBrace = closeBraceTokenFor(next);
+    Token closeBrace = next.endGroup;
     if (closeBrace != null) {
       Token nextToken = closeBrace.next;
       int kind = nextToken.kind;
@@ -5098,7 +5071,7 @@
   Token parseLiteralListOrMapOrFunction(Token token, Token constKeyword) {
     Token next = token.next;
     assert(optional('<', next));
-    Token closeBrace = closeBraceTokenFor(next);
+    Token closeBrace = next.endGroup;
     if (constKeyword == null &&
         closeBrace != null &&
         identical(closeBrace.next.kind, OPEN_PAREN_TOKEN)) {
@@ -5382,7 +5355,7 @@
     Token next = token.next;
     listener.handleNoArguments(next);
     if (optional('(', next)) {
-      return closeBraceTokenFor(next);
+      return next.endGroup;
     } else {
       return token;
     }
diff --git a/pkg/front_end/lib/src/fasta/parser/util.dart b/pkg/front_end/lib/src/fasta/parser/util.dart
index f16353d..50dd955 100644
--- a/pkg/front_end/lib/src/fasta/parser/util.dart
+++ b/pkg/front_end/lib/src/fasta/parser/util.dart
@@ -17,12 +17,6 @@
   return identical(value, token.stringValue);
 }
 
-/// Returns the close brace, bracket, or parenthesis of [left]. For '<', it may
-/// return null.
-Token closeBraceTokenFor(Token token) {
-  return token is BeginToken ? token.endGroup : null;
-}
-
 /// Returns the token before the close brace, bracket, or parenthesis
 /// associated with [left]. For '<', it may return `null`.
 Token beforeCloseBraceTokenFor(BeginToken left) {
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index d831420..3b901fb 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -26,8 +26,7 @@
 
 import '../kernel/body_builder.dart' show BodyBuilder;
 
-import '../parser.dart'
-    show IdentifierContext, MemberKind, Parser, closeBraceTokenFor, optional;
+import '../parser.dart' show IdentifierContext, MemberKind, Parser, optional;
 
 import '../problems.dart' show internalProblem, unexpected;
 
@@ -475,8 +474,7 @@
     Object name = pop();
     Token metadata = pop();
     checkEmpty(beginToken.charOffset);
-    if (bodyToken == null ||
-        optional("=", closeBraceTokenFor(bodyToken).next)) {
+    if (bodyToken == null || optional("=", bodyToken.endGroup.next)) {
       // TODO(ahe): Don't skip this. We need to compile metadata and
       // redirecting factory bodies.
       return;
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 4777289..95f7e87 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -440,8 +440,9 @@
   }
 
   @override
-  void beginTopLevelMethod(Token lastConsumed) {
+  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
     library.beginNestedDeclaration("#method", hasMembers: false);
+    push(externalToken != null ? externalMask : 0);
   }
 
   @override
@@ -462,7 +463,10 @@
         isAbstract = false;
       }
     }
-    int modifiers = Modifier.validate(pop(), isAbstract: isAbstract);
+    int modifiers = pop();
+    if (isAbstract) {
+      modifiers |= abstractMask;
+    }
     List<MetadataBuilder> metadata = pop();
     String documentationComment = getDocumentationComment(beginToken);
     checkEmpty(beginToken.charOffset);
@@ -1031,8 +1035,11 @@
   }
 
   @override
-  void beginFactoryMethod(Token lastConsumed) {
+  void beginFactoryMethod(
+      Token lastConsumed, Token externalToken, Token constToken) {
     library.beginNestedDeclaration("#factory_method", hasMembers: false);
+    push((externalToken != null ? externalMask : 0) |
+        (constToken != null ? constMask : 0));
   }
 
   @override
@@ -1047,7 +1054,7 @@
     List<FormalParameterBuilder> formals = pop();
     int formalsOffset = pop();
     var name = pop();
-    int modifiers = Modifier.validate(pop());
+    int modifiers = pop();
     List<MetadataBuilder> metadata = pop();
     String documentationComment = getDocumentationComment(beginToken);
     library.addFactoryMethod(
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 83396f3..79c88ae 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -557,7 +557,7 @@
     ticker.logMs("Built component");
   }
 
-  Component computeFullProgram() {
+  Component computeFullComponent() {
     Set<Library> libraries = new Set<Library>();
     List<Library> workList = <Library>[];
     builders.forEach((Uri uri, LibraryBuilder library) {
@@ -580,7 +580,7 @@
 
   void computeHierarchy() {
     List<List> ambiguousTypesRecords = [];
-    hierarchy = new ClassHierarchy(computeFullProgram(),
+    hierarchy = new ClassHierarchy(computeFullComponent(),
         onAmbiguousSupertypes: (Class cls, Supertype a, Supertype b) {
       if (ambiguousTypesRecords != null) {
         ambiguousTypesRecords.add([cls, a, b]);
@@ -694,7 +694,7 @@
     // TODO(paulberry): could we make this unnecessary by not clearing class
     // inference info?
     typeInferenceEngine.classHierarchy = hierarchy = new ClassHierarchy(
-        computeFullProgram(),
+        computeFullComponent(),
         onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
     ticker.logMs("Performed top level inference");
   }
diff --git a/pkg/front_end/lib/src/incremental/kernel_driver.dart b/pkg/front_end/lib/src/incremental/kernel_driver.dart
index 9038870..57b35a6 100644
--- a/pkg/front_end/lib/src/incremental/kernel_driver.dart
+++ b/pkg/front_end/lib/src/incremental/kernel_driver.dart
@@ -418,7 +418,7 @@
         if (bytes != null) {
           return _logger.runAsync('Read serialized libraries', () async {
             var component = new Component(nameRoot: nameRoot);
-            _readProgram(component, bytes);
+            _readComponent(component, bytes);
             await appendNewDillLibraries(component);
 
             return new LibraryCycleResult(
@@ -557,7 +557,7 @@
   /// configured metadata factory.  The [component] must be ready to read these
   /// libraries, i.e. either the [bytes] represent a full component with all
   /// dependencies, or the [component] already has all required dependencies.
-  void _readProgram(Component component, List<int> bytes) {
+  void _readComponent(Component component, List<int> bytes) {
     if (_metadataFactory != null) {
       var repository = _metadataFactory.newRepositoryForReading();
       component.addMetadataRepository(repository);
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index 4761b9a..8b78836 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -94,17 +94,17 @@
 
     var kernelTarget = new KernelTarget(fs, false, dillTarget, uriTranslator);
     options.inputs.forEach(kernelTarget.read);
-    Component summaryProgram =
+    Component summaryComponent =
         await kernelTarget.buildOutlines(nameRoot: nameRoot);
     List<int> summary = null;
     if (buildSummary) {
       if (options.verify) {
-        for (var error in verifyComponent(summaryProgram)) {
+        for (var error in verifyComponent(summaryComponent)) {
           options.report(error, Severity.error);
         }
       }
       if (options.debugDump) {
-        printComponentText(summaryProgram,
+        printComponentText(summaryComponent,
             libraryFilter: kernelTarget.isSourceLibrary);
       }
 
@@ -113,20 +113,21 @@
       // Note: we don't pass the library argument to the constructor to
       // preserve the the libraries parent pointer (it should continue to point
       // to the component within KernelTarget).
-      var trimmedSummaryProgram = new Component(nameRoot: summaryProgram.root)
-        ..libraries.addAll(truncateSummary
-            ? kernelTarget.loader.libraries
-            : summaryProgram.libraries);
-      trimmedSummaryProgram.metadata.addAll(summaryProgram.metadata);
+      var trimmedSummaryComponent =
+          new Component(nameRoot: summaryComponent.root)
+            ..libraries.addAll(truncateSummary
+                ? kernelTarget.loader.libraries
+                : summaryComponent.libraries);
+      trimmedSummaryComponent.metadata.addAll(summaryComponent.metadata);
 
       // As documented, we only run outline transformations when we are building
       // summaries without building a full component (at this time, that's
       // the only need we have for these transformations).
       if (!buildComponent) {
-        options.target.performOutlineTransformations(trimmedSummaryProgram);
+        options.target.performOutlineTransformations(trimmedSummaryComponent);
         options.ticker.logMs("Transformed outline");
       }
-      summary = serializeComponent(trimmedSummaryProgram);
+      summary = serializeComponent(trimmedSummaryComponent);
       options.ticker.logMs("Generated outline");
     }
 
diff --git a/pkg/front_end/test/fasta/bootstrap_test.dart b/pkg/front_end/test/fasta/bootstrap_test.dart
index 77e7cab..2ca89b4 100644
--- a/pkg/front_end/test/fasta/bootstrap_test.dart
+++ b/pkg/front_end/test/fasta/bootstrap_test.dart
@@ -78,13 +78,13 @@
   if (!silent) {
     print("$a is different from $b");
   }
-  Component programA = new Component();
-  Component programB = new Component();
-  new BinaryBuilder(bytesA, filename: a.toFilePath()).readComponent(programA);
-  new BinaryBuilder(bytesB, filename: b.toFilePath()).readComponent(programB);
+  Component componentA = new Component();
+  Component componentB = new Component();
+  new BinaryBuilder(bytesA, filename: a.toFilePath()).readComponent(componentA);
+  new BinaryBuilder(bytesB, filename: b.toFilePath()).readComponent(componentB);
   RegExp splitLines = new RegExp('^', multiLine: true);
-  List<String> linesA = componentToString(programA).split(splitLines);
-  List<String> linesB = componentToString(programB).split(splitLines);
+  List<String> linesA = componentToString(componentA).split(splitLines);
+  List<String> linesB = componentToString(componentB).split(splitLines);
   for (int i = 0; i < linesA.length && i < linesB.length; i++) {
     String lineA = linesA[i].trimRight();
     String lineB = linesB[i].trimRight();
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 3337a9e..014f3a6 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -108,7 +108,7 @@
   final Uri vm;
   final bool strongMode;
   final bool onlyCrashes;
-  final Map<Component, KernelTarget> programToTarget =
+  final Map<Component, KernelTarget> componentToTarget =
       <Component, KernelTarget>{};
   final Uri platformBinaries;
   Uri platformUri;
@@ -153,8 +153,8 @@
         if (!ignoreExpectations) {
           steps.add(new MatchExpectation(
               fullCompile
-              ? ".${generateExpectationName(strongMode)}.transformed.expect"
-              : ".outline.transformed.expect",
+                  ? ".${generateExpectationName(strongMode)}.transformed.expect"
+                  : ".outline.transformed.expect",
               updateExpectations: updateExpectations));
         }
         steps.add(const WriteDill());
@@ -327,8 +327,8 @@
       } on deprecated_InputError catch (e, s) {
         return fail(null, e.error, s);
       }
-      context.programToTarget.clear();
-      context.programToTarget[p] = sourceTarget;
+      context.componentToTarget.clear();
+      context.componentToTarget[p] = sourceTarget;
       return pass(p);
     });
   }
@@ -341,8 +341,8 @@
 
   Future<Result<Component>> run(
       Component component, FastaContext context) async {
-    KernelTarget sourceTarget = context.programToTarget[component];
-    context.programToTarget.remove(component);
+    KernelTarget sourceTarget = context.componentToTarget[component];
+    context.componentToTarget.remove(component);
     TestVmTarget backendTarget = sourceTarget.backendTarget;
     backendTarget.enabled = true;
     try {
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index 13ab958..5ba4f3b 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -473,25 +473,25 @@
   for (Uri invalidateUri in invalidateUris) {
     compiler.invalidate(invalidateUri);
   }
-  var bootstrappedProgram = await compiler.computeDelta();
-  throwOnEmptyMixinBodies(bootstrappedProgram);
+  var bootstrappedComponent = await compiler.computeDelta();
+  throwOnEmptyMixinBodies(bootstrappedComponent);
   bool result = compiler.initializedFromDill;
-  await writeComponentToFile(bootstrappedProgram, output);
+  await writeComponentToFile(bootstrappedComponent, output);
   for (Uri invalidateUri in invalidateUris) {
     compiler.invalidate(invalidateUri);
   }
 
-  var partialProgram = await compiler.computeDelta();
-  throwOnEmptyMixinBodies(partialProgram);
-  var emptyProgram = await compiler.computeDelta();
-  throwOnEmptyMixinBodies(emptyProgram);
+  var partialComponent = await compiler.computeDelta();
+  throwOnEmptyMixinBodies(partialComponent);
+  var emptyComponent = await compiler.computeDelta();
+  throwOnEmptyMixinBodies(emptyComponent);
 
   var fullLibUris =
-      bootstrappedProgram.libraries.map((lib) => lib.importUri).toList();
+      bootstrappedComponent.libraries.map((lib) => lib.importUri).toList();
   var partialLibUris =
-      partialProgram.libraries.map((lib) => lib.importUri).toList();
+      partialComponent.libraries.map((lib) => lib.importUri).toList();
   var emptyLibUris =
-      emptyProgram.libraries.map((lib) => lib.importUri).toList();
+      emptyComponent.libraries.map((lib) => lib.importUri).toList();
 
   if (performSizeTests) {
     Expect.isTrue(fullLibUris.length > partialLibUris.length);
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index 6a2c923..736cb2f 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_test.dart
@@ -107,7 +107,7 @@
       expect(exceptionThrown, isTrue);
     }, skip: true /* Issue 30194 */);
 
-    test('generated component contains source-info', () async {
+    test('generated program contains source-info', () async {
       var component = await compileScript('a() => print("hi"); main() {}',
           fileName: 'a.dart');
       // Kernel always store an empty '' key in the map, so there is always at
diff --git a/pkg/front_end/test/src/incremental/kernel_driver_test.dart b/pkg/front_end/test/src/incremental/kernel_driver_test.dart
index febded4..7568239 100644
--- a/pkg/front_end/test/src/incremental/kernel_driver_test.dart
+++ b/pkg/front_end/test/src/incremental/kernel_driver_test.dart
@@ -716,7 +716,7 @@
     String initialKernelText;
     List<int> bytes;
     {
-      Library initialLibrary = _getLibraryFromProgram(component, bUri);
+      Library initialLibrary = _getLibraryFromComponent(component, bUri);
       initialKernelText = _getLibraryText(initialLibrary);
 
       bytes = serializeComponent(component,
@@ -733,10 +733,10 @@
     // serialized canonical names can be linked to corresponding nodes.
     Library loadedLibrary;
     {
-      var programForLoading = new Component(nameRoot: component.root);
+      var componentForLoading = new Component(nameRoot: component.root);
       var reader = new BinaryBuilder(bytes);
-      reader.readComponent(programForLoading);
-      loadedLibrary = _getLibraryFromProgram(programForLoading, bUri);
+      reader.readComponent(componentForLoading);
+      loadedLibrary = _getLibraryFromComponent(componentForLoading, bUri);
     }
 
     // Add the library into the component.
@@ -1023,7 +1023,7 @@
     fail('No library found with URI "$uri"');
   }
 
-  Library _getLibraryFromProgram(Component component, Uri uri) {
+  Library _getLibraryFromComponent(Component component, Uri uri) {
     for (var library in component.libraries) {
       if (library.importUri == uri) return library;
     }
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 78d1163..67cbe59 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -276,6 +276,6 @@
 /// to the [dillTarget].
 void _appendDillForUri(DillTarget dillTarget, Uri uri) {
   var bytes = new File.fromUri(uri).readAsBytesSync();
-  var platformProgram = loadComponentFromBytes(bytes);
-  dillTarget.loader.appendLibraries(platformProgram, byteCount: bytes.length);
+  var platformComponent = loadComponentFromBytes(bytes);
+  dillTarget.loader.appendLibraries(platformComponent, byteCount: bytes.length);
 }
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index d9cf2cc..1d68942 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -134,12 +134,12 @@
   collector.start("Initial compilation");
   var generator = new IncrementalKernelGenerator(compilerOptions, entryUri);
 
-  var program = await generator.computeDelta();
+  var component = await generator.computeDelta();
   collector.stop("Initial compilation");
   if (verbose) {
-    print("Libraries changed: ${program.libraries.length}");
+    print("Libraries changed: ${component.libraries.length}");
   }
-  if (program.libraries.length < 1) {
+  if (component.libraries.length < 1) {
     throw "No libraries were changed";
   }
 
@@ -148,13 +148,13 @@
     await applyEdits(
         changeSet.edits, overlayFs, generator, uriTranslator, verbose);
     collector.start(name);
-    program = await generator.computeDelta();
+    component = await generator.computeDelta();
     collector.stop(name);
     if (verbose) {
       print("Change '${changeSet.name}' - "
-          "Libraries changed: ${program.libraries.length}");
+          "Libraries changed: ${component.libraries.length}");
     }
-    if (program.libraries.length < 1) {
+    if (component.libraries.length < 1) {
       throw "No libraries were changed";
     }
   }
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index c829ca2..7bec298 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -15,7 +15,7 @@
 ///
 /// A [BinaryPrinter] can be used to write one file and must then be
 /// discarded.
-class BinaryPrinter extends Visitor implements BinarySink {
+class BinaryPrinter implements Visitor<void>, BinarySink {
   VariableIndexer _variableIndexer;
   LabelIndexer _labelIndexer;
   SwitchCaseIndexer _switchCaseIndexer;
@@ -576,7 +576,8 @@
 
   bool insideExternalLibrary = false;
 
-  visitLibrary(Library node) {
+  @override
+  void visitLibrary(Library node) {
     insideExternalLibrary = node.isExternal;
     libraryOffsets.add(getBufferOffset());
     writeByte(insideExternalLibrary ? 1 : 0);
@@ -714,7 +715,8 @@
         levelFlags;
   }
 
-  visitClass(Class node) {
+  @override
+  void visitClass(Class node) {
     classOffsets.add(getBufferOffset());
 
     int flags = _encodeClassFlags(node.isAbstract, node.isEnum,
@@ -758,7 +760,8 @@
 
   static final Name _emptyName = new Name('');
 
-  visitConstructor(Constructor node) {
+  @override
+  void visitConstructor(Constructor node) {
     if (node.canonicalName == null) {
       throw 'Missing canonical name for $node';
     }
@@ -787,7 +790,8 @@
     _variableIndexer = null;
   }
 
-  visitProcedure(Procedure node) {
+  @override
+  void visitProcedure(Procedure node) {
     procedureOffsets.add(getBufferOffset());
 
     if (node.canonicalName == null) {
@@ -818,7 +822,8 @@
         !(node.isForwardingStub && node.function.body != null));
   }
 
-  visitField(Field node) {
+  @override
+  void visitField(Field node) {
     if (node.canonicalName == null) {
       throw 'Missing canonical name for $node';
     }
@@ -843,7 +848,8 @@
     _variableIndexer = null;
   }
 
-  visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
+  @override
+  void visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
     if (node.canonicalName == null) {
       throw 'Missing canonical name for $node';
     }
@@ -877,45 +883,52 @@
     _variableIndexer = null;
   }
 
-  visitInvalidInitializer(InvalidInitializer node) {
+  @override
+  void visitInvalidInitializer(InvalidInitializer node) {
     writeByte(Tag.InvalidInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
   }
 
-  visitFieldInitializer(FieldInitializer node) {
+  @override
+  void visitFieldInitializer(FieldInitializer node) {
     writeByte(Tag.FieldInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
     writeReference(node.fieldReference);
     writeNode(node.value);
   }
 
-  visitSuperInitializer(SuperInitializer node) {
+  @override
+  void visitSuperInitializer(SuperInitializer node) {
     writeByte(Tag.SuperInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
     writeReference(node.targetReference);
     writeNode(node.arguments);
   }
 
-  visitRedirectingInitializer(RedirectingInitializer node) {
+  @override
+  void visitRedirectingInitializer(RedirectingInitializer node) {
     writeByte(Tag.RedirectingInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
     writeReference(node.targetReference);
     writeNode(node.arguments);
   }
 
-  visitLocalInitializer(LocalInitializer node) {
+  @override
+  void visitLocalInitializer(LocalInitializer node) {
     writeByte(Tag.LocalInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
     writeVariableDeclaration(node.variable);
   }
 
-  visitAssertInitializer(AssertInitializer node) {
+  @override
+  void visitAssertInitializer(AssertInitializer node) {
     writeByte(Tag.AssertInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
     writeNode(node.statement);
   }
 
-  visitFunctionNode(FunctionNode node) {
+  @override
+  void visitFunctionNode(FunctionNode node) {
     writeByte(Tag.FunctionNode);
     assert(_variableIndexer != null);
     _variableIndexer.pushScope();
@@ -942,13 +955,15 @@
     _variableIndexer.popScope();
   }
 
-  visitInvalidExpression(InvalidExpression node) {
+  @override
+  void visitInvalidExpression(InvalidExpression node) {
     writeByte(Tag.InvalidExpression);
     writeOffset(node.fileOffset);
     writeStringReference(node.message ?? '');
   }
 
-  visitVariableGet(VariableGet node) {
+  @override
+  void visitVariableGet(VariableGet node) {
     assert(_variableIndexer != null);
     int index = _variableIndexer[node.variable];
     assert(index != null);
@@ -966,7 +981,8 @@
     }
   }
 
-  visitVariableSet(VariableSet node) {
+  @override
+  void visitVariableSet(VariableSet node) {
     assert(_variableIndexer != null);
     int index = _variableIndexer[node.variable];
     if (index & Tag.SpecializedPayloadMask == index) {
@@ -983,7 +999,8 @@
     }
   }
 
-  visitPropertyGet(PropertyGet node) {
+  @override
+  void visitPropertyGet(PropertyGet node) {
     writeByte(Tag.PropertyGet);
     writeOffset(node.fileOffset);
     writeByte(node.flags);
@@ -992,7 +1009,8 @@
     writeReference(node.interfaceTargetReference);
   }
 
-  visitPropertySet(PropertySet node) {
+  @override
+  void visitPropertySet(PropertySet node) {
     writeByte(Tag.PropertySet);
     writeOffset(node.fileOffset);
     writeByte(node.flags);
@@ -1002,14 +1020,16 @@
     writeReference(node.interfaceTargetReference);
   }
 
-  visitSuperPropertyGet(SuperPropertyGet node) {
+  @override
+  void visitSuperPropertyGet(SuperPropertyGet node) {
     writeByte(Tag.SuperPropertyGet);
     writeOffset(node.fileOffset);
     writeName(node.name);
     writeReference(node.interfaceTargetReference);
   }
 
-  visitSuperPropertySet(SuperPropertySet node) {
+  @override
+  void visitSuperPropertySet(SuperPropertySet node) {
     writeByte(Tag.SuperPropertySet);
     writeOffset(node.fileOffset);
     writeName(node.name);
@@ -1017,7 +1037,8 @@
     writeReference(node.interfaceTargetReference);
   }
 
-  visitDirectPropertyGet(DirectPropertyGet node) {
+  @override
+  void visitDirectPropertyGet(DirectPropertyGet node) {
     writeByte(Tag.DirectPropertyGet);
     writeOffset(node.fileOffset);
     writeByte(node.flags);
@@ -1025,7 +1046,8 @@
     writeReference(node.targetReference);
   }
 
-  visitDirectPropertySet(DirectPropertySet node) {
+  @override
+  void visitDirectPropertySet(DirectPropertySet node) {
     writeByte(Tag.DirectPropertySet);
     writeOffset(node.fileOffset);
     writeByte(node.flags);
@@ -1034,20 +1056,23 @@
     writeNode(node.value);
   }
 
-  visitStaticGet(StaticGet node) {
+  @override
+  void visitStaticGet(StaticGet node) {
     writeByte(Tag.StaticGet);
     writeOffset(node.fileOffset);
     writeReference(node.targetReference);
   }
 
-  visitStaticSet(StaticSet node) {
+  @override
+  void visitStaticSet(StaticSet node) {
     writeByte(Tag.StaticSet);
     writeOffset(node.fileOffset);
     writeReference(node.targetReference);
     writeNode(node.value);
   }
 
-  visitMethodInvocation(MethodInvocation node) {
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
     writeByte(Tag.MethodInvocation);
     writeOffset(node.fileOffset);
     writeByte(node.flags);
@@ -1057,7 +1082,8 @@
     writeReference(node.interfaceTargetReference);
   }
 
-  visitSuperMethodInvocation(SuperMethodInvocation node) {
+  @override
+  void visitSuperMethodInvocation(SuperMethodInvocation node) {
     writeByte(Tag.SuperMethodInvocation);
     writeOffset(node.fileOffset);
     writeName(node.name);
@@ -1065,7 +1091,8 @@
     writeReference(node.interfaceTargetReference);
   }
 
-  visitDirectMethodInvocation(DirectMethodInvocation node) {
+  @override
+  void visitDirectMethodInvocation(DirectMethodInvocation node) {
     writeByte(Tag.DirectMethodInvocation);
     writeOffset(node.fileOffset);
     writeByte(node.flags);
@@ -1074,14 +1101,16 @@
     writeNode(node.arguments);
   }
 
-  visitStaticInvocation(StaticInvocation node) {
+  @override
+  void visitStaticInvocation(StaticInvocation node) {
     writeByte(node.isConst ? Tag.ConstStaticInvocation : Tag.StaticInvocation);
     writeOffset(node.fileOffset);
     writeReference(node.targetReference);
     writeNode(node.arguments);
   }
 
-  visitConstructorInvocation(ConstructorInvocation node) {
+  @override
+  void visitConstructorInvocation(ConstructorInvocation node) {
     writeByte(node.isConst
         ? Tag.ConstConstructorInvocation
         : Tag.ConstructorInvocation);
@@ -1090,19 +1119,22 @@
     writeNode(node.arguments);
   }
 
-  visitArguments(Arguments node) {
+  @override
+  void visitArguments(Arguments node) {
     writeUInt30(node.positional.length + node.named.length);
     writeNodeList(node.types);
     writeNodeList(node.positional);
     writeNodeList(node.named);
   }
 
-  visitNamedExpression(NamedExpression node) {
+  @override
+  void visitNamedExpression(NamedExpression node) {
     writeStringReference(node.name);
     writeNode(node.value);
   }
 
-  visitNot(Not node) {
+  @override
+  void visitNot(Not node) {
     writeByte(Tag.Not);
     writeNode(node.operand);
   }
@@ -1117,14 +1149,16 @@
     throw 'Not a logical operator: $operator';
   }
 
-  visitLogicalExpression(LogicalExpression node) {
+  @override
+  void visitLogicalExpression(LogicalExpression node) {
     writeByte(Tag.LogicalExpression);
     writeNode(node.left);
     writeByte(logicalOperatorIndex(node.operator));
     writeNode(node.right);
   }
 
-  visitConditionalExpression(ConditionalExpression node) {
+  @override
+  void visitConditionalExpression(ConditionalExpression node) {
     writeByte(Tag.ConditionalExpression);
     writeNode(node.condition);
     writeNode(node.then);
@@ -1132,20 +1166,23 @@
     writeOptionalNode(node.staticType);
   }
 
-  visitStringConcatenation(StringConcatenation node) {
+  @override
+  void visitStringConcatenation(StringConcatenation node) {
     writeByte(Tag.StringConcatenation);
     writeOffset(node.fileOffset);
     writeNodeList(node.expressions);
   }
 
-  visitIsExpression(IsExpression node) {
+  @override
+  void visitIsExpression(IsExpression node) {
     writeByte(Tag.IsExpression);
     writeOffset(node.fileOffset);
     writeNode(node.operand);
     writeNode(node.type);
   }
 
-  visitAsExpression(AsExpression node) {
+  @override
+  void visitAsExpression(AsExpression node) {
     writeByte(Tag.AsExpression);
     writeOffset(node.fileOffset);
     writeByte(node.flags);
@@ -1153,12 +1190,14 @@
     writeNode(node.type);
   }
 
-  visitStringLiteral(StringLiteral node) {
+  @override
+  void visitStringLiteral(StringLiteral node) {
     writeByte(Tag.StringLiteral);
     writeStringReference(node.value);
   }
 
-  visitIntLiteral(IntLiteral node) {
+  @override
+  void visitIntLiteral(IntLiteral node) {
     writeInteger(node.value);
   }
 
@@ -1182,7 +1221,8 @@
     }
   }
 
-  visitDoubleLiteral(DoubleLiteral node) {
+  @override
+  void visitDoubleLiteral(DoubleLiteral node) {
     writeDouble(node.value);
   }
 
@@ -1192,47 +1232,56 @@
     writeStringReference('$value');
   }
 
-  visitBoolLiteral(BoolLiteral node) {
+  @override
+  void visitBoolLiteral(BoolLiteral node) {
     writeByte(node.value ? Tag.TrueLiteral : Tag.FalseLiteral);
   }
 
-  visitNullLiteral(NullLiteral node) {
+  @override
+  void visitNullLiteral(NullLiteral node) {
     writeByte(Tag.NullLiteral);
   }
 
-  visitSymbolLiteral(SymbolLiteral node) {
+  @override
+  void visitSymbolLiteral(SymbolLiteral node) {
     writeByte(Tag.SymbolLiteral);
     writeStringReference(node.value);
   }
 
-  visitTypeLiteral(TypeLiteral node) {
+  @override
+  void visitTypeLiteral(TypeLiteral node) {
     writeByte(Tag.TypeLiteral);
     writeNode(node.type);
   }
 
-  visitThisExpression(ThisExpression node) {
+  @override
+  void visitThisExpression(ThisExpression node) {
     writeByte(Tag.ThisExpression);
   }
 
-  visitRethrow(Rethrow node) {
+  @override
+  void visitRethrow(Rethrow node) {
     writeByte(Tag.Rethrow);
     writeOffset(node.fileOffset);
   }
 
-  visitThrow(Throw node) {
+  @override
+  void visitThrow(Throw node) {
     writeByte(Tag.Throw);
     writeOffset(node.fileOffset);
     writeNode(node.expression);
   }
 
-  visitListLiteral(ListLiteral node) {
+  @override
+  void visitListLiteral(ListLiteral node) {
     writeByte(node.isConst ? Tag.ConstListLiteral : Tag.ListLiteral);
     writeOffset(node.fileOffset);
     writeNode(node.typeArgument);
     writeNodeList(node.expressions);
   }
 
-  visitMapLiteral(MapLiteral node) {
+  @override
+  void visitMapLiteral(MapLiteral node) {
     writeByte(node.isConst ? Tag.ConstMapLiteral : Tag.MapLiteral);
     writeOffset(node.fileOffset);
     writeNode(node.keyType);
@@ -1240,70 +1289,82 @@
     writeNodeList(node.entries);
   }
 
-  visitMapEntry(MapEntry node) {
+  @override
+  void visitMapEntry(MapEntry node) {
     // Note: there is no tag on MapEntry
     writeNode(node.key);
     writeNode(node.value);
   }
 
-  visitAwaitExpression(AwaitExpression node) {
+  @override
+  void visitAwaitExpression(AwaitExpression node) {
     writeByte(Tag.AwaitExpression);
     writeNode(node.operand);
   }
 
-  visitFunctionExpression(FunctionExpression node) {
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
     writeByte(Tag.FunctionExpression);
     writeOffset(node.fileOffset);
     writeNode(node.function);
   }
 
-  visitLet(Let node) {
+  @override
+  void visitLet(Let node) {
     writeByte(Tag.Let);
     writeVariableDeclaration(node.variable);
     writeNode(node.body);
     --_variableIndexer.stackHeight;
   }
 
-  visitInstantiation(Instantiation node) {
+  @override
+  void visitInstantiation(Instantiation node) {
     writeByte(Tag.Instantiation);
     writeNode(node.expression);
     writeNodeList(node.typeArguments);
   }
 
-  visitLoadLibrary(LoadLibrary node) {
+  @override
+  void visitLoadLibrary(LoadLibrary node) {
     writeByte(Tag.LoadLibrary);
     writeLibraryDependencyReference(node.import);
   }
 
-  visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+  @override
+  void visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
     writeByte(Tag.CheckLibraryIsLoaded);
     writeLibraryDependencyReference(node.import);
   }
 
-  visitVectorCreation(VectorCreation node) {
+  @override
+  void visitVectorCreation(VectorCreation node) {
     writeByte(Tag.VectorCreation);
     writeUInt30(node.length);
   }
 
-  visitVectorGet(VectorGet node) {
+  @override
+  void visitVectorGet(VectorGet node) {
     writeByte(Tag.VectorGet);
     writeNode(node.vectorExpression);
     writeUInt30(node.index);
   }
 
-  visitVectorSet(VectorSet node) {
+  @override
+  void visitVectorSet(VectorSet node) {
     writeByte(Tag.VectorSet);
     writeNode(node.vectorExpression);
     writeUInt30(node.index);
     writeNode(node.value);
   }
 
-  visitVectorCopy(VectorCopy node) {
+  @override
+  void visitVectorCopy(VectorCopy node) {
     writeByte(Tag.VectorCopy);
     writeNode(node.vectorExpression);
   }
 
-  visitClosureCreation(ClosureCreation node) {
+  @override
+  void visitClosureCreation(ClosureCreation node) {
     writeByte(Tag.ClosureCreation);
     writeReference(node.topLevelFunctionReference);
     writeNode(node.contextVector);
@@ -1319,30 +1380,35 @@
     }
   }
 
-  visitExpressionStatement(ExpressionStatement node) {
+  @override
+  void visitExpressionStatement(ExpressionStatement node) {
     writeByte(Tag.ExpressionStatement);
     writeNode(node.expression);
   }
 
-  visitBlock(Block node) {
+  @override
+  void visitBlock(Block node) {
     _variableIndexer.pushScope();
     writeByte(Tag.Block);
     writeNodeList(node.statements);
     _variableIndexer.popScope();
   }
 
-  visitAssertBlock(AssertBlock node) {
+  @override
+  void visitAssertBlock(AssertBlock node) {
     _variableIndexer.pushScope();
     writeByte(Tag.AssertBlock);
     writeNodeList(node.statements);
     _variableIndexer.popScope();
   }
 
-  visitEmptyStatement(EmptyStatement node) {
+  @override
+  void visitEmptyStatement(EmptyStatement node) {
     writeByte(Tag.EmptyStatement);
   }
 
-  visitAssertStatement(AssertStatement node) {
+  @override
+  void visitAssertStatement(AssertStatement node) {
     writeByte(Tag.AssertStatement);
     writeNode(node.condition);
     writeOffset(node.conditionStartOffset);
@@ -1350,7 +1416,8 @@
     writeOptionalNode(node.message);
   }
 
-  visitLabeledStatement(LabeledStatement node) {
+  @override
+  void visitLabeledStatement(LabeledStatement node) {
     if (_labelIndexer == null) {
       _labelIndexer = new LabelIndexer();
     }
@@ -1360,32 +1427,37 @@
     _labelIndexer.exit();
   }
 
-  visitConstantExpression(ConstantExpression node) {
+  @override
+  void visitConstantExpression(ConstantExpression node) {
     writeByte(Tag.ConstantExpression);
     writeConstantReference(node.constant);
   }
 
-  visitBreakStatement(BreakStatement node) {
+  @override
+  void visitBreakStatement(BreakStatement node) {
     writeByte(Tag.BreakStatement);
     writeOffset(node.fileOffset);
     writeUInt30(_labelIndexer[node.target]);
   }
 
-  visitWhileStatement(WhileStatement node) {
+  @override
+  void visitWhileStatement(WhileStatement node) {
     writeByte(Tag.WhileStatement);
     writeOffset(node.fileOffset);
     writeNode(node.condition);
     writeNode(node.body);
   }
 
-  visitDoStatement(DoStatement node) {
+  @override
+  void visitDoStatement(DoStatement node) {
     writeByte(Tag.DoStatement);
     writeOffset(node.fileOffset);
     writeNode(node.body);
     writeNode(node.condition);
   }
 
-  visitForStatement(ForStatement node) {
+  @override
+  void visitForStatement(ForStatement node) {
     _variableIndexer.pushScope();
     writeByte(Tag.ForStatement);
     writeOffset(node.fileOffset);
@@ -1396,7 +1468,8 @@
     _variableIndexer.popScope();
   }
 
-  visitForInStatement(ForInStatement node) {
+  @override
+  void visitForInStatement(ForInStatement node) {
     _variableIndexer.pushScope();
     writeByte(node.isAsync ? Tag.AsyncForInStatement : Tag.ForInStatement);
     writeOffset(node.fileOffset);
@@ -1407,7 +1480,8 @@
     _variableIndexer.popScope();
   }
 
-  visitSwitchStatement(SwitchStatement node) {
+  @override
+  void visitSwitchStatement(SwitchStatement node) {
     if (_switchCaseIndexer == null) {
       _switchCaseIndexer = new SwitchCaseIndexer();
     }
@@ -1419,7 +1493,8 @@
     _switchCaseIndexer.exit(node);
   }
 
-  visitSwitchCase(SwitchCase node) {
+  @override
+  void visitSwitchCase(SwitchCase node) {
     // Note: there is no tag on SwitchCase.
     int length = node.expressions.length;
     writeUInt30(length);
@@ -1431,13 +1506,15 @@
     writeNode(node.body);
   }
 
-  visitContinueSwitchStatement(ContinueSwitchStatement node) {
+  @override
+  void visitContinueSwitchStatement(ContinueSwitchStatement node) {
     writeByte(Tag.ContinueSwitchStatement);
     writeOffset(node.fileOffset);
     writeUInt30(_switchCaseIndexer[node.target]);
   }
 
-  visitIfStatement(IfStatement node) {
+  @override
+  void visitIfStatement(IfStatement node) {
     writeByte(Tag.IfStatement);
     writeOffset(node.fileOffset);
     writeNode(node.condition);
@@ -1445,13 +1522,15 @@
     writeStatementOrEmpty(node.otherwise);
   }
 
-  visitReturnStatement(ReturnStatement node) {
+  @override
+  void visitReturnStatement(ReturnStatement node) {
     writeByte(Tag.ReturnStatement);
     writeOffset(node.fileOffset);
     writeOptionalNode(node.expression);
   }
 
-  visitTryCatch(TryCatch node) {
+  @override
+  void visitTryCatch(TryCatch node) {
     writeByte(Tag.TryCatch);
     writeNode(node.body);
     if (node.catches.any((Catch c) => c.stackTrace != null)) {
@@ -1464,7 +1543,8 @@
     writeNodeList(node.catches);
   }
 
-  visitCatch(Catch node) {
+  @override
+  void visitCatch(Catch node) {
     // Note: there is no tag on Catch.
     _variableIndexer.pushScope();
     writeOffset(node.fileOffset);
@@ -1475,20 +1555,23 @@
     _variableIndexer.popScope();
   }
 
-  visitTryFinally(TryFinally node) {
+  @override
+  void visitTryFinally(TryFinally node) {
     writeByte(Tag.TryFinally);
     writeNode(node.body);
     writeNode(node.finalizer);
   }
 
-  visitYieldStatement(YieldStatement node) {
+  @override
+  void visitYieldStatement(YieldStatement node) {
     writeByte(Tag.YieldStatement);
     writeOffset(node.fileOffset);
     writeByte(node.flags);
     writeNode(node.expression);
   }
 
-  visitVariableDeclaration(VariableDeclaration node) {
+  @override
+  void visitVariableDeclaration(VariableDeclaration node) {
     writeByte(Tag.VariableDeclaration);
     writeVariableDeclaration(node);
   }
@@ -1523,30 +1606,36 @@
     }
   }
 
-  visitFunctionDeclaration(FunctionDeclaration node) {
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     writeByte(Tag.FunctionDeclaration);
     writeOffset(node.fileOffset);
     writeVariableDeclaration(node.variable);
     writeNode(node.function);
   }
 
-  visitBottomType(BottomType node) {
+  @override
+  void visitBottomType(BottomType node) {
     writeByte(Tag.BottomType);
   }
 
-  visitInvalidType(InvalidType node) {
+  @override
+  void visitInvalidType(InvalidType node) {
     writeByte(Tag.InvalidType);
   }
 
-  visitDynamicType(DynamicType node) {
+  @override
+  void visitDynamicType(DynamicType node) {
     writeByte(Tag.DynamicType);
   }
 
-  visitVoidType(VoidType node) {
+  @override
+  void visitVoidType(VoidType node) {
     writeByte(Tag.VoidType);
   }
 
-  visitInterfaceType(InterfaceType node) {
+  @override
+  void visitInterfaceType(InterfaceType node) {
     if (node.typeArguments.isEmpty) {
       writeByte(Tag.SimpleInterfaceType);
       writeReference(node.className);
@@ -1557,7 +1646,8 @@
     }
   }
 
-  visitSupertype(Supertype node) {
+  @override
+  void visitSupertype(Supertype node) {
     if (node.typeArguments.isEmpty) {
       writeByte(Tag.SimpleInterfaceType);
       writeReference(node.className);
@@ -1568,7 +1658,8 @@
     }
   }
 
-  visitFunctionType(FunctionType node) {
+  @override
+  void visitFunctionType(FunctionType node) {
     if (node.requiredParameterCount == node.positionalParameters.length &&
         node.typeParameters.isEmpty &&
         node.namedParameters.isEmpty &&
@@ -1593,40 +1684,248 @@
     }
   }
 
-  visitNamedType(NamedType node) {
+  @override
+  void visitNamedType(NamedType node) {
     writeStringReference(node.name);
     writeNode(node.type);
   }
 
-  visitTypeParameterType(TypeParameterType node) {
+  @override
+  void visitTypeParameterType(TypeParameterType node) {
     writeByte(Tag.TypeParameterType);
     writeUInt30(_typeParameterIndexer[node.parameter]);
     writeOptionalNode(node.promotedBound);
   }
 
-  visitVectorType(VectorType node) {
+  @override
+  void visitVectorType(VectorType node) {
     writeByte(Tag.VectorType);
   }
 
-  visitTypedefType(TypedefType node) {
+  @override
+  void visitTypedefType(TypedefType node) {
     writeByte(Tag.TypedefType);
     writeReference(node.typedefReference);
     writeNodeList(node.typeArguments);
   }
 
-  visitTypeParameter(TypeParameter node) {
+  @override
+  void visitTypeParameter(TypeParameter node) {
     writeByte(node.flags);
     writeAnnotationList(node.annotations);
     writeStringReference(node.name ?? '');
     writeNode(node.bound);
   }
 
-  defaultConstant(Constant node) {
-    throw 'Implement handling of ${node.runtimeType}';
+  // ================================================================
+  // These are nodes that are never serialized directly.  Reaching one
+  // during serialization is an error.
+  @override
+  void defaultNode(Node node) {
+    throw new UnsupportedError('serialization of generic Nodes');
   }
 
-  defaultNode(Node node) {
-    throw 'Unsupported node: $node';
+  @override
+  void defaultConstant(Constant node) {
+    throw new UnsupportedError('serialization of generic Constants');
+  }
+
+  @override
+  void defaultBasicLiteral(BasicLiteral node) {
+    throw new UnsupportedError('serialization of generic BasicLiterals');
+  }
+
+  @override
+  void defaultConstantReference(Constant node) {
+    throw new UnsupportedError('serialization of generic Constant references');
+  }
+
+  @override
+  void defaultDartType(DartType node) {
+    throw new UnsupportedError('serialization of generic DartTypes');
+  }
+
+  @override
+  void defaultExpression(Expression node) {
+    throw new UnsupportedError('serialization of generic Expressions');
+  }
+
+  @override
+  void defaultInitializer(Initializer node) {
+    throw new UnsupportedError('serialization of generic Initializers');
+  }
+
+  @override
+  void defaultMember(Member node) {
+    throw new UnsupportedError('serialization of generic Members');
+  }
+
+  @override
+  void defaultMemberReference(Member node) {
+    throw new UnsupportedError('serialization of generic Member references');
+  }
+
+  @override
+  void defaultStatement(Statement node) {
+    throw new UnsupportedError('serialization of generic Statements');
+  }
+
+  @override
+  void defaultTreeNode(TreeNode node) {
+    throw new UnsupportedError('serialization of generic TreeNodes');
+  }
+
+  @override
+  void visitBoolConstant(BoolConstant node) {
+    throw new UnsupportedError('serialization of BoolConstants');
+  }
+
+  @override
+  void visitBoolConstantReference(BoolConstant node) {
+    throw new UnsupportedError('serialization of BoolConstant references');
+  }
+
+  @override
+  void visitClassReference(Class node) {
+    throw new UnsupportedError('serialization of Class references');
+  }
+
+  @override
+  void visitConstructorReference(Constructor node) {
+    throw new UnsupportedError('serialization of Constructor references');
+  }
+
+  @override
+  void visitDoubleConstant(DoubleConstant node) {
+    throw new UnsupportedError('serialization of DoubleConstants');
+  }
+
+  @override
+  void visitDoubleConstantReference(DoubleConstant node) {
+    throw new UnsupportedError('serialization of DoubleConstant references');
+  }
+
+  @override
+  void visitFieldReference(Field node) {
+    throw new UnsupportedError('serialization of Field references');
+  }
+
+  @override
+  void visitInstanceConstant(InstanceConstant node) {
+    throw new UnsupportedError('serialization of InstanceConstants');
+  }
+
+  @override
+  void visitInstanceConstantReference(InstanceConstant node) {
+    throw new UnsupportedError('serialization of InstanceConstant references');
+  }
+
+  @override
+  void visitIntConstant(IntConstant node) {
+    throw new UnsupportedError('serialization of IntConstants');
+  }
+
+  @override
+  void visitIntConstantReference(IntConstant node) {
+    throw new UnsupportedError('serialization of IntConstant references');
+  }
+
+  @override
+  void visitLibraryDependency(LibraryDependency node) {
+    throw new UnsupportedError('serialization of LibraryDependencys');
+  }
+
+  @override
+  void visitLibraryPart(LibraryPart node) {
+    throw new UnsupportedError('serialization of LibraryParts');
+  }
+
+  @override
+  void visitListConstant(ListConstant node) {
+    throw new UnsupportedError('serialization of ListConstants');
+  }
+
+  @override
+  void visitListConstantReference(ListConstant node) {
+    throw new UnsupportedError('serialization of ListConstant references');
+  }
+
+  @override
+  void visitMapConstant(MapConstant node) {
+    throw new UnsupportedError('serialization of MapConstants');
+  }
+
+  @override
+  void visitMapConstantReference(MapConstant node) {
+    throw new UnsupportedError('serialization of MapConstant references');
+  }
+
+  @override
+  void visitName(Name node) {
+    throw new UnsupportedError('serialization of Names');
+  }
+
+  @override
+  void visitNullConstant(NullConstant node) {
+    throw new UnsupportedError('serialization of NullConstants');
+  }
+
+  @override
+  void visitNullConstantReference(NullConstant node) {
+    throw new UnsupportedError('serialization of NullConstant references');
+  }
+
+  @override
+  void visitProcedureReference(Procedure node) {
+    throw new UnsupportedError('serialization of Procedure references');
+  }
+
+  @override
+  void visitComponent(Component node) {
+    throw new UnsupportedError('serialization of Components');
+  }
+
+  @override
+  void visitRedirectingFactoryConstructorReference(
+      RedirectingFactoryConstructor node) {
+    throw new UnsupportedError(
+        'serialization of RedirectingFactoryConstructor references');
+  }
+
+  @override
+  void visitStringConstant(StringConstant node) {
+    throw new UnsupportedError('serialization of StringConstants');
+  }
+
+  @override
+  void visitStringConstantReference(StringConstant node) {
+    throw new UnsupportedError('serialization of StringConstant references');
+  }
+
+  @override
+  void visitTearOffConstant(TearOffConstant node) {
+    throw new UnsupportedError('serialization of TearOffConstants ');
+  }
+
+  @override
+  void visitTearOffConstantReference(TearOffConstant node) {
+    throw new UnsupportedError('serialization of TearOffConstant references');
+  }
+
+  @override
+  void visitTypeLiteralConstant(TypeLiteralConstant node) {
+    throw new UnsupportedError('serialization of TypeLiteralConstants');
+  }
+
+  @override
+  void visitTypeLiteralConstantReference(TypeLiteralConstant node) {
+    throw new UnsupportedError(
+        'serialization of TypeLiteralConstant references');
+  }
+
+  @override
+  void visitTypedefReference(Typedef node) {
+    throw new UnsupportedError('serialization of Typedef references');
   }
 }
 
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 0b6bd2e..13e0739 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -166,11 +166,19 @@
       case CallKind.FieldInitializer:
         assertx(args.values.isEmpty);
         assertx(args.names.isEmpty);
-        fieldValue.setValue(
-            typeFlowAnalysis
-                .getSummary(field)
-                .apply(args, typeFlowAnalysis.hierarchyCache, typeFlowAnalysis),
-            typeFlowAnalysis);
+        Type initializerResult = typeFlowAnalysis
+            .getSummary(field)
+            .apply(args, typeFlowAnalysis.hierarchyCache, typeFlowAnalysis);
+        if (field.isStatic &&
+            !field.isConst &&
+            initializerResult is! NullableType) {
+          // If initializer of a static field throws an exception,
+          // then field is initialized with null value.
+          // TODO(alexmarkov): Try to prove that static field initializer
+          // does not throw exception.
+          initializerResult = new Type.nullable(initializerResult);
+        }
+        fieldValue.setValue(initializerResult, typeFlowAnalysis);
         return const EmptyType();
     }
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index b23ebd2..87c7282 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -18,19 +18,19 @@
   operator []=([@vm.inferred-type.metadata=!] core::int i, core::double value) → void {
     [@vm.unreachable.metadata=] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]=}([@vm.unreachable.metadata=] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=!] this.{self::_Vector::_offset}), value);
   }
-  operator *([@vm.inferred-type.metadata=#lib::_Vector] self::_Vector a) → core::double {
+  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
     core::double result = 0.0;
     for (core::int i = 0; i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=!] this.{self::_Vector::_length}); i = i.{core::num::+}(1))
-      result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::_Vector::[]}(i)));
+      result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::_Vector::[]}(i)));
     return result;
   }
 }
-[@vm.inferred-type.metadata=#lib::_Vector]static field self::_Vector v = new self::_Vector::•(10);
-[@vm.inferred-type.metadata=dart.core::_Double]static field core::double x = 0.0;
+[@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector v = new self::_Vector::•(10);
+[@vm.inferred-type.metadata=dart.core::_Double?]static field core::double x = 0.0;
 static method main(core::List<core::String> args) → dynamic {
   core::Stopwatch timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in let final dynamic #t2 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] #t1.{core::Stopwatch::start}() in #t1;
   for (core::int i = 0; i.{core::num::<}(100000000); i = i.{core::num::+}(1)) {
-    self::x = [@vm.direct-call.metadata=dart.core::_Double::+] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.inferred-type.metadata=dart.core::_Double] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector::*] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.inferred-type.metadata=#lib::_Vector] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector] self::v));
+    self::x = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector::*??] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
   }
   [@vm.direct-call.metadata=dart.core::Stopwatch::stop] timer.{core::Stopwatch::stop}();
   core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch::elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}}ms, result ${self::x}");
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
index 8843409..21c932f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
@@ -35,7 +35,7 @@
     return "D";
 }
 [@vm.inferred-type.metadata=#lib::D?]static field self::A dd;
-[@vm.inferred-type.metadata=#lib::E]static field self::E ee = new self::E::•();
+[@vm.inferred-type.metadata=#lib::E?]static field self::E ee = new self::E::•();
 static method callerA1([@vm.inferred-type.metadata=!] self::A aa) → void {
   aa.{self::A::foo}();
 }
@@ -51,7 +51,7 @@
 static method callerE1([@vm.inferred-type.metadata=!] dynamic x) → void {
   x.toString();
 }
-static method callerE2([@vm.inferred-type.metadata=#lib::E] dynamic x) → void {
+static method callerE2([@vm.inferred-type.metadata=#lib::E?] dynamic x) → void {
   x.toString();
 }
 static method main(core::List<core::String> args) → dynamic {
@@ -62,5 +62,5 @@
   self::callerA4([@vm.inferred-type.metadata=#lib::D?] self::dd);
   self::dd = new self::D::•();
   self::callerE1("abc");
-  self::callerE2([@vm.inferred-type.metadata=#lib::E] self::ee);
+  self::callerE2([@vm.inferred-type.metadata=#lib::E?] self::ee);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
index da1a6e6..9fa579c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
@@ -37,13 +37,13 @@
     : super core::Object::•()
     ;
   method barL1() → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] [@vm.inferred-type.metadata=!] this.{self::DeepCaller1::barL2}();
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] this.{self::DeepCaller1::barL2}();
   method barL2() → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] [@vm.inferred-type.metadata=!] this.{self::DeepCaller1::barL3}();
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] this.{self::DeepCaller1::barL3}();
   method barL3() → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] [@vm.inferred-type.metadata=!] this.{self::DeepCaller1::barL4}();
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] this.{self::DeepCaller1::barL4}();
   method barL4() → dynamic
-    return [@vm.inferred-type.metadata=!] self::field1;
+    return self::field1;
 }
 class D extends core::Object {
 [@vm.inferred-type.metadata=!]  field core::Object field2 = [@vm.inferred-type.metadata=!] self::getValue();
@@ -65,7 +65,7 @@
     return [@vm.direct-call.metadata=#lib::D::field2] [@vm.inferred-type.metadata=!] dd.{self::D::field2};
 }
 [@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
-[@vm.inferred-type.metadata=!]static field core::Object field1 = [@vm.inferred-type.metadata=!] self::getValue();
+static field core::Object field1 = [@vm.inferred-type.metadata=!] self::getValue();
 static method getDynamic() → dynamic
   return self::unknown.call();
 static method getValue() → core::Object {
@@ -73,7 +73,7 @@
   return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
 }
 static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1 x) → dynamic
-  return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] [@vm.inferred-type.metadata=!] x.{self::DeepCaller1::barL1}();
+  return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] x.{self::DeepCaller1::barL1}();
 static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2 x) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=!] x.{self::DeepCaller2::barL1}(new self::D::•());
 static method createC() → dynamic {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index 61fb50e..f15ef86 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -104,18 +104,18 @@
     return new self::T7::•();
   }
 }
-[@vm.inferred-type.metadata=#lib::B]static field self::A bb = new self::B::•();
-[@vm.inferred-type.metadata=#lib::D]static field self::A dd = new self::D::•();
+[@vm.inferred-type.metadata=#lib::B?]static field self::A bb = new self::B::•();
+[@vm.inferred-type.metadata=#lib::D?]static field self::A dd = new self::D::•();
 [@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
 static method getDynamic() → dynamic
   return self::unknown.call();
 static method main(core::List<core::String> args) → dynamic {
-  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B] self::bb.{self::A::foo}());
-  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B] self::bb.{self::A::bar});
-  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B] self::bb.{self::A::bazz}(1, 2, 3, 4));
-  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D] self::dd.{self::A::foo}());
-  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D] self::dd.{self::A::bar});
-  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D] self::dd.{self::A::bazz}(1, 2, 3, 4));
+  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
+  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bar});
+  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bazz}(1, 2, 3, 4));
+  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::foo}());
+  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bar});
+  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bazz}(1, 2, 3, 4));
   new self::E::•();
   self::A xx = self::getDynamic() as{TypeError} self::A;
   core::print([@vm.inferred-type.metadata=!] xx.{self::A::bar});
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
index deb3fa6..24ea90c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
@@ -40,10 +40,10 @@
   method bar() → core::int
     return [@vm.direct-call.metadata=#lib::Base::doCall] this.{self::Base::doCall}(super.{self::Base::foo});
 }
-[@vm.inferred-type.metadata=#lib::B]static field self::A aa = new self::B::•();
+[@vm.inferred-type.metadata=#lib::B?]static field self::A aa = new self::B::•();
 static method knownResult() → dynamic
   return new self::B::•();
 static method main(core::List<core::String> args) → dynamic {
   [@vm.direct-call.metadata=#lib::TearOffSuperMethod::bar] new self::TearOffSuperMethod::•().{self::TearOffSuperMethod::bar}();
-  [@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=#lib::B] self::aa.{self::A::foo}();
+  [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::B?] self::aa.{self::A::foo}();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart
new file mode 100644
index 0000000..e2c4d9a
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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 A {}
+
+dynamic good() => new A();
+dynamic bad() => throw 'No return!';
+
+var static_field_good = good();
+var static_field_bad = bad();
+
+main(List<String> args) {
+  print(static_field_good);
+  print(static_field_bad); // Should infer null.
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
new file mode 100644
index 0000000..e5f135c
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
@@ -0,0 +1,19 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+[@vm.inferred-type.metadata=#lib::A?]static field dynamic static_field_good = [@vm.inferred-type.metadata=#lib::A] self::good();
+[@vm.inferred-type.metadata=dart.core::Null?]static field dynamic static_field_bad = [@vm.inferred-type.metadata=!] self::bad();
+static method good() → dynamic
+  return new self::A::•();
+static method bad() → dynamic
+  return throw "No return!";
+static method main(core::List<core::String> args) → dynamic {
+  core::print([@vm.inferred-type.metadata=#lib::A?] self::static_field_good);
+  core::print([@vm.inferred-type.metadata=dart.core::Null?] self::static_field_bad);
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
index 2170390..8ff3030 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
@@ -22,12 +22,12 @@
 [@vm.unreachable.metadata=]  method foo(dynamic x) → void
     throw "TFA Error: #lib::B::foo";
 }
-[@vm.inferred-type.metadata=#lib::B]static field self::I ii = new self::B::•();
-static method bar([@vm.inferred-type.metadata=#lib::B] self::I i) → void {
+[@vm.inferred-type.metadata=#lib::B?]static field self::I ii = new self::B::•();
+static method bar([@vm.inferred-type.metadata=#lib::B?] self::I i) → void {
   if(i is self::A) {
     [@vm.unreachable.metadata=] i{self::A}.{self::A::foo}(42);
   }
 }
 static method main(core::List<core::String> args) → dynamic {
-  self::bar([@vm.inferred-type.metadata=#lib::B] self::ii);
+  self::bar([@vm.inferred-type.metadata=#lib::B?] self::ii);
 }
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index c4c7d3d..e23ba23 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -413,19 +413,6 @@
   return kUnknownMagicNumber;
 }
 
-void DartUtils::WriteSnapshotMagicNumber(File* file) {
-  // Write a magic number and version information into the snapshot file.
-  bool bytes_written = file->WriteFully(snapshot_magic_number.bytes,
-                                        snapshot_magic_number.length);
-  ASSERT(bytes_written);
-}
-
-void DartUtils::SkipSnapshotMagicNumber(const uint8_t** buffer,
-                                        intptr_t* buffer_length) {
-  *buffer += snapshot_magic_number.length;
-  *buffer_length -= snapshot_magic_number.length;
-}
-
 Dart_Handle DartUtils::PrepareBuiltinLibrary(Dart_Handle builtin_lib,
                                              Dart_Handle internal_lib,
                                              bool is_service_isolate,
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 5002f31..5c14911 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -217,10 +217,6 @@
   static MagicNumber SniffForMagicNumber(const uint8_t* text_buffer,
                                          intptr_t buffer_len);
 
-  // Write a magic number to indicate a script snapshot file.
-  static void WriteSnapshotMagicNumber(File* file);
-  static void SkipSnapshotMagicNumber(const uint8_t** buffer, intptr_t* length);
-
   // Global state that stores the original working directory..
   static const char* original_working_directory;
 
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index d80f237..d6bad2b 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -110,10 +110,12 @@
   // platform_dill is not NULL implies that platform_strong_dill is also
   // not NULL.
   if (platform_program_ == NULL) {
+    ASSERT(Dart_IsKernel(platform_dill, platform_dill_size));
     platform_program_ =
         Dart_ReadKernelBinary(platform_dill, platform_dill_size, NoopRelease);
   }
   if (platform_strong_program_ == NULL) {
+    ASSERT(Dart_IsKernel(platform_strong_dill, platform_strong_dill_size));
     platform_strong_program_ = Dart_ReadKernelBinary(
         platform_strong_dill, platform_strong_dill_size, NoopRelease);
   }
@@ -175,34 +177,6 @@
   free(buffer);
 }
 
-Dart_Handle DFE::ReadKernelBinary(Dart_Isolate isolate,
-                                  const char* url_string) {
-  ASSERT(!Dart_IsServiceIsolate(isolate) && !Dart_IsKernelIsolate(isolate));
-  // First check if the URL points to a Kernel IR file in which case we
-  // skip the compilation step and directly reload the file.
-  const uint8_t* kernel_ir = NULL;
-  intptr_t kernel_ir_size = -1;
-  if (!TryReadKernelFile(url_string, &kernel_ir, &kernel_ir_size)) {
-    // We have a source file, compile it into a kernel ir first.
-    // TODO(asiva): We will have to change this API to pass in a list of files
-    // that have changed. For now just pass in the main url_string and have it
-    // recompile the script.
-    // TODO(aam): When Frontend is ready, VM should be passing vm_outline.dill
-    // instead of vm_platform.dill to Frontend for compilation.
-    Dart_KernelCompilationResult kresult =
-        Dart_CompileToKernel(url_string, platform_dill, platform_dill_size);
-    if (kresult.status != Dart_KernelCompilationStatus_Ok) {
-      return Dart_NewApiError(kresult.error);
-    }
-    kernel_ir = kresult.kernel;
-    kernel_ir_size = kresult.kernel_size;
-  }
-  void* kernel_program =
-      Dart_ReadKernelBinary(kernel_ir, kernel_ir_size, ReleaseFetchedBytes);
-  ASSERT(kernel_program != NULL);
-  return Dart_NewExternalTypedData(Dart_TypedData_kUint64, kernel_program, 1);
-}
-
 class WindowsPathSanitizer {
  public:
   explicit WindowsPathSanitizer(const char* path) {
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index 9d5e471..558de85 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -45,12 +45,6 @@
   }
   void* application_kernel_binary() const { return application_kernel_binary_; }
 
-  // Method to read a kernel file into a kernel program blob.
-  // If the specified script [url] is not a kernel IR, compile it first using
-  // DFE and then read the resulting kernel file into a kernel program blob.
-  // Returns Dart_Null if successful, otherwise an error object is returned.
-  Dart_Handle ReadKernelBinary(Dart_Isolate isolate, const char* url_string);
-
   // Compiles a script and reads the resulting kernel file.
   // If the compilation is successful, returns a valid in memory kernel
   // representation of the script, NULL otherwise
diff --git a/runtime/bin/error_exit.cc b/runtime/bin/error_exit.cc
index a93a972..617da04 100644
--- a/runtime/bin/error_exit.cc
+++ b/runtime/bin/error_exit.cc
@@ -21,7 +21,6 @@
   Log::VPrintErr(format, arguments);
   va_end(arguments);
 
-  Dart_ExitScope();
   Dart_ShutdownIsolate();
 
   // Terminate process exit-code handler.
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index 9c05e0d..70c34e3 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -450,7 +450,6 @@
     } break;
     case Dart_kScriptTag:
       if (payload_type == DartUtils::kSnapshotMagicNumber) {
-        DartUtils::SkipSnapshotMagicNumber(&payload, &payload_length);
         dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length);
         reload_extensions = true;
       } else if (payload_type == DartUtils::kKernelMagicNumber) {
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 42e4f63..31ecf76 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -179,7 +179,6 @@
     bin::DartUtils::ReadFile(&payload, &payload_length, file);
     bin::DartUtils::CloseFile(file);
 
-    bin::DartUtils::SkipSnapshotMagicNumber(&payload, &payload_length);
     Dart_Handle result = Dart_LoadScriptFromSnapshot(payload, payload_length);
     CHECK_RESULT(result);
   }
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 7c827cd..999cbe0 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -246,7 +246,6 @@
 }
 
 static void WriteSnapshotFile(const char* filename,
-                              bool write_magic_number,
                               const uint8_t* buffer,
                               const intptr_t size) {
   File* file = File::Open(NULL, filename, File::kWriteTruncate);
@@ -255,11 +254,6 @@
               filename);
   }
 
-  if (write_magic_number) {
-    // Write the magic number to indicate file is a script snapshot.
-    DartUtils::WriteSnapshotMagicNumber(file);
-  }
-
   if (!file->WriteFully(buffer, size)) {
     ErrorExit(kErrorExitCode, "Unable to write file %s for writing snapshot\n",
               filename);
@@ -332,7 +326,7 @@
     ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
   }
 
-  WriteSnapshotFile(snapshot_filename, true, buffer, size);
+  WriteSnapshotFile(snapshot_filename, buffer, size);
 }
 
 void Snapshot::GenerateAppJIT(const char* snapshot_filename) {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index ae0dcbd..b4d3d75 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -862,9 +862,6 @@
  *
  * Requires there to be no current isolate.
  *
- * After this call, the `kernel_program` needs to be supplied to a call to
- * `Dart_LoadKernel()` which will then take ownership of the memory.
- *
  * \param script_uri The main source file or snapshot this isolate will load.
  *   The VM will provide this URI to the Dart_IsolateCreateCallback when a child
  *   isolate is created by Isolate.spawn. The embedder should use a URI that
@@ -890,9 +887,9 @@
                                                       void* callback_data,
                                                       char** error);
 /**
- * Shuts down the current isolate. After this call, the current isolate
- * is NULL. Invokes the shutdown callback and any callbacks of remaining
- * weak persistent handles.
+ * Shuts down the current isolate. After this call, the current isolate is NULL.
+ * Any current scopes created by Dart_EnterScope will be exited. Invokes the
+ * shutdown callback and any callbacks of remaining weak persistent handles.
  *
  * Requires there to be a current isolate.
  */
@@ -1030,6 +1027,27 @@
                           intptr_t* script_snapshot_size);
 
 /**
+ * Returns whether the buffer contains a snapshot created by
+ * Dart_Create*Snapshot.
+ *
+ * \param buffer Pointer to a buffer that might contain a snapshot.
+ * \param buffer_size Size of the buffer.
+ *
+ * \return Whether the buffer contains a snapshot (core, app or script).
+ */
+DART_EXPORT bool Dart_IsSnapshot(const uint8_t* buffer, intptr_t buffer_size);
+
+/**
+ * Returns whether the buffer contains a kernel file.
+ *
+ * \param buffer Pointer to a buffer that might contain a kernel binary.
+ * \param buffer_size Size of the buffer.
+ *
+ * \return Whether the buffer contains a kernel binary (full or partial).
+ */
+DART_EXPORT bool Dart_IsKernel(const uint8_t* buffer, intptr_t buffer_size);
+
+/**
  * Returns true if snapshot_buffer contains a Dart2 snapshot.
  *
  * \param snapshot_buffer Pointer to a buffer that contains the snapshot
@@ -2870,17 +2888,18 @@
                             intptr_t script_snapshot_size);
 
 /**
- * Loads a dart application via an in-memory kernel program.
+ * Loads the root library for the current isolate.
  *
- * \param kernel_program The kernel program obtained via
- *        `Dart_ReadKernelBinary`.
+ * Requires there to be no current root library.
  *
- * The VM will take ownership of the `kernel_program` object.
+ * \param buffer A buffer which contains a kernel binary (see
+ *               pkg/kernel/binary.md).
+ * \param buffer_size Length of the passed in buffer.
  *
- * \return If no error occurs, the Library object corresponding to the root
- *   script is returned. Otherwise an error handle is returned.
+ * \return A handle to the root library, or an error.
  */
-DART_EXPORT Dart_Handle Dart_LoadKernel(void* kernel_program);
+DART_EXPORT Dart_Handle Dart_LoadScriptFromKernel(const uint8_t* kernel_buffer,
+                                                  intptr_t kernel_size);
 
 /**
  * Constructs an in-memory kernel program form a binary.
@@ -3006,6 +3025,19 @@
                                          intptr_t column_offset);
 
 /**
+ * Called by the embedder to load a partial program. Does not set the root
+ * library.
+ *
+ * \param buffer A buffer which contains a kernel binary (see
+ *               pkg/kernel/binary.md).
+ * \param buffer_size Length of the passed in buffer.
+ *
+ * \return A handle to the main library of the compilation unit, or an error.
+ */
+DART_EXPORT Dart_Handle Dart_LoadLibraryFromKernel(const uint8_t* kernel_buffer,
+                                                   intptr_t kernel_buffer_size);
+
+/**
  * Imports a library into another library, optionally with a prefix.
  * If no prefix is required, an empty string or Dart_Null() can be
  * supplied.
@@ -3062,7 +3094,6 @@
                                         Dart_Handle source,
                                         intptr_t line_offset,
                                         intptr_t column_offset);
-/* TODO(turnidge): Rename to Dart_LibraryLoadSource? */
 
 /**
  * Loads a patch source string into a library.
diff --git a/runtime/lib/bigint_patch.dart b/runtime/lib/bigint_patch.dart
index 7094f29..08bcf47 100644
--- a/runtime/lib/bigint_patch.dart
+++ b/runtime/lib/bigint_patch.dart
@@ -412,7 +412,7 @@
         ((0x10 | (bits[6] & 0xF)) << 16) + (bits[5] << 8) + bits[4];
 
     var unshiftedBig = new _BigIntImpl._normalized(false, 2, unshiftedDigits);
-    _BigIntImpl absResult;
+    _BigIntImpl absResult = unshiftedBig;
     if (exponent < 0) {
       absResult = unshiftedBig >> -exponent;
     } else if (exponent > 0) {
diff --git a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
index 58c4596..c9299b9 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
@@ -75,6 +75,10 @@
       // Skip meta-data events.
       continue;
     }
+    if (event['ph'] == 'C') {
+      // Skip counter events, where an isolate id makes Catapult hard to read.
+      continue;
+    }
     if (event['name'] == 'Runnable' && event['ph'] == 'i') {
       // Skip Runnable events which don't have an isolate.
       continue;
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index 3b05c02..bd8e1ab 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -290,6 +290,17 @@
     return bit_cast<int64_t, double>(a) == bit_cast<int64_t, double>(b);
   }
 
+  // A double-to-integer conversion that avoids undefined behavior.
+  // Out of range values and NaNs are converted to minimum value
+  // for type T.
+  template <typename T>
+  static T SafeDoubleToInt(double v) {
+    const double min = static_cast<double>(std::numeric_limits<T>::min());
+    const double max = static_cast<double>(std::numeric_limits<T>::max());
+    return (min <= v && v <= max) ? static_cast<T>(v)
+                                  : std::numeric_limits<T>::min();
+  }
+
   // dart2js represents integers as double precision floats, which can
   // represent anything in the range -2^53 ... 2^53.
   static bool IsJavascriptInt(int64_t value) {
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index e8dde2e..8ba409b 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -2751,7 +2751,7 @@
   sentinel.SetStaticValue(enum_value, true);
   sentinel.RecordStore(enum_value);
 
-  if (thread->isolate()->use_dart_frontend()) {
+  if (enum_cls.kernel_offset() > 0) {
     Object& result = Object::Handle(zone);
     for (intptr_t i = 0; i < fields.Length(); i++) {
       field = Field::RawCast(fields.At(i));
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 63725d5..4900da6 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -190,9 +190,10 @@
   }
 
   void FillHeader(Snapshot::Kind kind) {
-    int64_t* data = reinterpret_cast<int64_t*>(stream_.buffer());
-    data[Snapshot::kLengthIndex] = stream_.bytes_written();
-    data[Snapshot::kSnapshotFlagIndex] = kind;
+    Snapshot* header = reinterpret_cast<Snapshot*>(stream_.buffer());
+    header->set_magic();
+    header->set_length(stream_.bytes_written());
+    header->set_kind(kind);
   }
 
   void WriteVersionAndFeatures(bool is_vm_snapshot);
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index dcd56b5..c4425ed 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -1601,7 +1601,7 @@
   const Object& constant = value->BoundConstant();
   if (constant.IsDouble()) {
     const Double& double_constant = Double::Cast(constant);
-    *result = static_cast<int64_t>(double_constant.value());
+    *result = Utils::SafeDoubleToInt<int64_t>(double_constant.value());
     return (static_cast<double>(*result) == double_constant.value());
   } else if (constant.IsSmi()) {
     *result = Smi::Cast(constant).Value();
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 6fcc4e0..3429379 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1192,6 +1192,16 @@
   Isolate* I = T->isolate();
   CHECK_ISOLATE(I);
   I->WaitForOutstandingSpawns();
+
+  // Release any remaining API scopes.
+  ApiLocalScope* scope = T->api_top_scope();
+  while (scope != NULL) {
+    ApiLocalScope* previous = scope->previous();
+    delete scope;
+    scope = previous;
+  }
+  T->set_api_top_scope(NULL);
+
   {
     StackZone zone(T);
     HandleScope handle_scope(T);
@@ -1522,6 +1532,21 @@
   return Api::Success();
 }
 
+DART_EXPORT bool Dart_IsSnapshot(const uint8_t* buffer, intptr_t buffer_size) {
+  if (buffer_size < Snapshot::kHeaderSize) {
+    return false;
+  }
+  return Snapshot::SetupFromBuffer(buffer) != NULL;
+}
+
+DART_EXPORT bool Dart_IsKernel(const uint8_t* buffer, intptr_t buffer_size) {
+  if (buffer_size < 4) {
+    return false;
+  }
+  return (buffer[0] == 0x90) && (buffer[1] == 0xab) && (buffer[2] == 0xcd) &&
+         (buffer[3] == 0xef);
+}
+
 DART_EXPORT bool Dart_IsDart2Snapshot(const uint8_t* snapshot_buffer) {
   if (snapshot_buffer == NULL) {
     return false;
@@ -5144,6 +5169,7 @@
 
   Dart_Handle result;
   if (I->use_dart_frontend()) {
+    // TODO(kernel): Fix callers to use Dart_LoadScriptFromKernel.
     if ((source == Api::Null()) || (source == NULL)) {
       RETURN_NULL_ERROR(source);
     }
@@ -5260,13 +5286,14 @@
   return NULL;
 #else
   kernel::Program* program =
-      ReadPrecompiledKernelFromBuffer(buffer, buffer_len);
+      kernel::Program::ReadFromBuffer(buffer, buffer_len);
   program->set_release_buffer_callback(callback);
   return program;
 #endif
 }
 
-DART_EXPORT Dart_Handle Dart_LoadKernel(void* kernel_program) {
+DART_EXPORT Dart_Handle Dart_LoadScriptFromKernel(const uint8_t* buffer,
+                                                  intptr_t buffer_size) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
 #else
@@ -5284,9 +5311,8 @@
   CHECK_CALLBACK_STATE(T);
   CHECK_COMPILATION_ALLOWED(I);
 
-  // NOTE: Now the VM owns the [kernel_program] memory!
-  // We will promptly delete it when done.
-  kernel::Program* program = reinterpret_cast<kernel::Program*>(kernel_program);
+  kernel::Program* program = kernel::Program::ReadFromBuffer(
+      buffer, buffer_size, false /* take_buffer_ownership */);
   const Object& tmp = kernel::KernelLoader::LoadEntireProgram(program);
   delete program;
 
@@ -5509,6 +5535,7 @@
   }
   Dart_Handle result;
   if (I->use_dart_frontend()) {
+    // TODO(kernel): Fix callers to use Dart_LoadLibraryFromKernel.
     void* kernel_pgm = reinterpret_cast<void*>(source);
     result = LoadKernelProgram(T, url_str, kernel_pgm);
     if (::Dart_IsError(result)) {
@@ -5573,6 +5600,29 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
+DART_EXPORT Dart_Handle Dart_LoadLibraryFromKernel(const uint8_t* buffer,
+                                                   intptr_t buffer_size) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
+#else
+  DARTSCOPE(Thread::Current());
+  API_TIMELINE_DURATION(T);
+  StackZone zone(T);
+  Isolate* I = T->isolate();
+
+  CHECK_CALLBACK_STATE(T);
+  CHECK_COMPILATION_ALLOWED(I);
+
+  kernel::Program* program = kernel::Program::ReadFromBuffer(
+      buffer, buffer_size, false /* take_buffer_ownership */);
+  const Object& result =
+      kernel::KernelLoader::LoadEntireProgram(program, false);
+  delete program;
+
+  return Api::NewHandle(T, result.raw());
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+}
+
 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library,
                                                   Dart_Handle import,
                                                   Dart_Handle prefix) {
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3dbb929..3a6edba 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -2709,8 +2709,6 @@
     thread = thread_registry()->GetFreeThreadLocked(this, is_mutator);
     ASSERT(thread != NULL);
 
-    thread->ResetHighWatermark();
-
     // Set up other values and set the TLS value.
     thread->isolate_ = this;
     ASSERT(heap() != NULL);
@@ -2731,6 +2729,8 @@
     }
     Thread::SetCurrent(thread);
     os_thread->EnableThreadInterrupts();
+
+    thread->ResetHighWatermark();
   }
   return thread;
 }
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 338409f..cd42d41 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -585,11 +585,11 @@
     intptr_t num_libs = libs.Length();
     modified_libs_ = new (Z) BitVector(Z, num_libs);
 
-    // ReadPrecompiledKernelFromFile checks to see if the file at
+    // ReadKernelFromFile checks to see if the file at
     // root_script_url is a valid .dill file. If that's the case, a Program*
     // is returned. Otherwise, this is likely a source file that needs to be
-    // compiled, so ReadPrecompiledKernelFromFile returns NULL.
-    kernel_program.set(ReadPrecompiledKernelFromFile(root_script_url));
+    // compiled, so ReadKernelFromFile returns NULL.
+    kernel_program.set(kernel::Program::ReadFromFile(root_script_url));
     if (kernel_program.get() == NULL) {
       TransitionVMToNative transition(thread);
       Dart_SourceFile* modified_scripts = NULL;
@@ -613,7 +613,7 @@
       }
       did_kernel_compilation = true;
       kernel_program.set(
-          ReadPrecompiledKernelFromBuffer(retval.kernel, retval.kernel_size));
+          kernel::Program::ReadFromBuffer(retval.kernel, retval.kernel_size));
     }
 
     kernel_program.get()->set_release_buffer_callback(ReleaseFetchedBytes);
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 579a186..deb900d 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -77,6 +77,11 @@
    */
   static Program* ReadFrom(Reader* reader, bool take_buffer_ownership = true);
 
+  static Program* ReadFromFile(const char* script_uri);
+  static Program* ReadFromBuffer(const uint8_t* buffer,
+                                 intptr_t buffer_length,
+                                 bool take_buffer_ownership = true);
+
   bool is_single_program() { return single_program_; }
   NameIndex main_method() { return main_method_reference_; }
   intptr_t source_table_offset() const { return source_table_offset_; }
@@ -195,12 +200,6 @@
                                         TokenPosition* end);
 
 }  // namespace kernel
-
-kernel::Program* ReadPrecompiledKernelFromFile(const char* script_uri);
-
-kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer,
-                                                 intptr_t buffer_length);
-
 }  // namespace dart
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index 21e833f..a2fe779 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -77,9 +77,7 @@
   return program;
 }
 
-}  // namespace kernel
-
-kernel::Program* ReadPrecompiledKernelFromFile(const char* script_uri) {
+Program* Program::ReadFromFile(const char* script_uri) {
   Thread* thread = Thread::Current();
   if (script_uri == NULL) {
     return NULL;
@@ -108,11 +106,13 @@
   return kernel_program;
 }
 
-kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer,
-                                                 intptr_t buffer_length) {
+Program* Program::ReadFromBuffer(const uint8_t* buffer,
+                                 intptr_t buffer_length,
+                                 bool take_buffer_ownership) {
   kernel::Reader reader(buffer, buffer_length);
-  return kernel::Program::ReadFrom(&reader);
+  return kernel::Program::ReadFrom(&reader, take_buffer_ownership);
 }
 
+}  // namespace kernel
 }  // namespace dart
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index fa60ee8..b2b6b26 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -192,49 +192,50 @@
   initialize_fields();
 }
 
-Object& KernelLoader::LoadEntireProgram(Program* program) {
+Object& KernelLoader::LoadEntireProgram(Program* program,
+                                        bool process_pending_classes) {
   if (program->is_single_program()) {
     KernelLoader loader(program);
-    return loader.LoadProgram();
-  } else {
-    kernel::Reader reader(program->kernel_data(), program->kernel_data_size());
-    GrowableArray<intptr_t> subprogram_file_starts;
-    index_programs(&reader, &subprogram_file_starts);
-
-    Thread* thread = Thread::Current();
-    Zone* zone = thread->zone();
-    Library& library = Library::Handle(zone);
-    // Create "fake programs" for each sub-program.
-    intptr_t subprogram_count = subprogram_file_starts.length() - 1;
-    for (intptr_t i = 0; i < subprogram_count; ++i) {
-      intptr_t subprogram_start = subprogram_file_starts.At(i);
-      intptr_t subprogram_end = subprogram_file_starts.At(i + 1);
-      reader.set_raw_buffer(program->kernel_data() + subprogram_start);
-      reader.set_size(subprogram_end - subprogram_start);
-      reader.set_offset(0);
-      Program* subprogram = Program::ReadFrom(&reader, false);
-      ASSERT(subprogram->is_single_program());
-      KernelLoader loader(subprogram);
-      Object& load_result = loader.LoadProgram(false);
-      if (load_result.IsError()) return load_result;
-
-      if (library.IsNull() && load_result.IsLibrary()) {
-        library ^= load_result.raw();
-      }
-
-      delete subprogram;
-    }
-
-    if (!ClassFinalizer::ProcessPendingClasses()) {
-      // Class finalization failed -> sticky error would be set.
-      Error& error = Error::Handle(zone);
-      error = thread->sticky_error();
-      thread->clear_sticky_error();
-      return error;
-    }
-
-    return library;
+    return loader.LoadProgram(process_pending_classes);
   }
+
+  kernel::Reader reader(program->kernel_data(), program->kernel_data_size());
+  GrowableArray<intptr_t> subprogram_file_starts;
+  index_programs(&reader, &subprogram_file_starts);
+
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Library& library = Library::Handle(zone);
+  // Create "fake programs" for each sub-program.
+  intptr_t subprogram_count = subprogram_file_starts.length() - 1;
+  for (intptr_t i = 0; i < subprogram_count; ++i) {
+    intptr_t subprogram_start = subprogram_file_starts.At(i);
+    intptr_t subprogram_end = subprogram_file_starts.At(i + 1);
+    reader.set_raw_buffer(program->kernel_data() + subprogram_start);
+    reader.set_size(subprogram_end - subprogram_start);
+    reader.set_offset(0);
+    Program* subprogram = Program::ReadFrom(&reader, false);
+    ASSERT(subprogram->is_single_program());
+    KernelLoader loader(subprogram);
+    Object& load_result = loader.LoadProgram(false);
+    if (load_result.IsError()) return load_result;
+
+    if (library.IsNull() && load_result.IsLibrary()) {
+      library ^= load_result.raw();
+    }
+
+    delete subprogram;
+  }
+
+  if (process_pending_classes && !ClassFinalizer::ProcessPendingClasses()) {
+    // Class finalization failed -> sticky error would be set.
+    Error& error = Error::Handle(zone);
+    error = thread->sticky_error();
+    thread->clear_sticky_error();
+    return error;
+  }
+
+  return library;
 }
 
 void KernelLoader::index_programs(
@@ -1168,7 +1169,7 @@
     }
     class_helper->SetJustRead(ClassHelper::kFields);
 
-    if (I->use_dart_frontend() && klass.is_enum_class()) {
+    if (klass.is_enum_class()) {
       // Add static field 'const _deleted_enum_sentinel'.
       // This field does not need to be of type E.
       Field& deleted_enum_sentinel = Field::ZoneHandle(Z);
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 7cafb9d..d18fa6c 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -123,7 +123,8 @@
 class KernelLoader {
  public:
   explicit KernelLoader(Program* program);
-  static Object& LoadEntireProgram(Program* program);
+  static Object& LoadEntireProgram(Program* program,
+                                   bool process_pending_classes = true);
 
   // Returns the library containing the main procedure, null if there
   // was no main procedure, or a failure object if there was an error.
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index a906dd7..1b91df8 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -152,19 +152,16 @@
   }
 }
 
-// TODO(5411462): Temporary setup of snapshot for testing purposes,
-// the actual creation of a snapshot maybe done differently.
 const Snapshot* Snapshot::SetupFromBuffer(const void* raw_memory) {
   ASSERT(raw_memory != NULL);
-  ASSERT(kHeaderSize == sizeof(Snapshot));
-  ASSERT(kLengthIndex == length_offset());
-  ASSERT((kSnapshotFlagIndex * sizeof(int64_t)) == kind_offset());
-  ASSERT((kHeapObjectTag & kInlined));
   const Snapshot* snapshot = reinterpret_cast<const Snapshot*>(raw_memory);
+  if (!snapshot->check_magic()) {
+    return NULL;
+  }
   // If the raw length is negative or greater than what the local machine can
   // handle, then signal an error.
-  int64_t snapshot_length = ReadUnaligned(&snapshot->unaligned_length_);
-  if ((snapshot_length < 0) || (snapshot_length > kIntptrMax)) {
+  int64_t length = snapshot->large_length();
+  if ((length < 0) || (length > kIntptrMax)) {
     return NULL;
   }
   return snapshot;
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 5db9e24..44cb6db 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -161,19 +161,36 @@
   };
   static const char* KindToCString(Kind kind);
 
-  static const int kHeaderSize = 2 * sizeof(int64_t);
-  static const int kLengthIndex = 0;
-  static const int kSnapshotFlagIndex = 1;
-
   static const Snapshot* SetupFromBuffer(const void* raw_memory);
 
-  // Getters.
-  const uint8_t* content() const { OPEN_ARRAY_START(uint8_t, uint8_t); }
-  intptr_t length() const {
-    return static_cast<intptr_t>(ReadUnaligned(&unaligned_length_));
+  static const int32_t kMagicValue = 0xdcdcf5f5;
+  static const intptr_t kMagicOffset = 0;
+  static const intptr_t kMagicSize = sizeof(int32_t);
+  static const intptr_t kLengthOffset = kMagicOffset + kMagicSize;
+  static const intptr_t kLengthSize = sizeof(int64_t);
+  static const intptr_t kKindOffset = kLengthOffset + kLengthSize;
+  static const intptr_t kKindSize = sizeof(int64_t);
+  static const intptr_t kHeaderSize = kKindOffset + kKindSize;
+
+  // Accessors.
+  bool check_magic() const {
+    return Read<int32_t>(kMagicOffset) == kMagicValue;
   }
-  Kind kind() const {
-    return static_cast<Kind>(ReadUnaligned(&unaligned_kind_));
+  void set_magic() { return Write<int32_t>(kMagicOffset, kMagicValue); }
+  // Excluding the magic value from the size written in the buffer is needed
+  // so we give a proper version mismatch error for snapshots create before
+  // magic value was written by the VM instead of the embedder.
+  int64_t large_length() const {
+    return Read<int64_t>(kLengthOffset) + kMagicSize;
+  }
+  intptr_t length() const { return static_cast<intptr_t>(large_length()); }
+  void set_length(intptr_t value) {
+    return Write<int64_t>(kLengthOffset, value - kMagicSize);
+  }
+  Kind kind() const { return static_cast<Kind>(Read<int64_t>(kKindOffset)); }
+  void set_kind(Kind value) { return Write<int64_t>(kKindOffset, value); }
+  const uint8_t* content() const {
+    return reinterpret_cast<const uint8_t*>(this) + kHeaderSize;
   }
 
   static bool IsFull(Kind kind) {
@@ -185,20 +202,21 @@
 
   const uint8_t* Addr() const { return reinterpret_cast<const uint8_t*>(this); }
 
-  static intptr_t length_offset() {
-    return OFFSET_OF(Snapshot, unaligned_length_);
-  }
-  static intptr_t kind_offset() { return OFFSET_OF(Snapshot, unaligned_kind_); }
-
  private:
   // Prevent Snapshot from ever being allocated directly.
   Snapshot();
 
-  // The following fields are potentially unaligned.
-  int64_t unaligned_length_;  // Stream length.
-  int64_t unaligned_kind_;    // Kind of snapshot.
+  template <typename T>
+  T Read(intptr_t offset) const {
+    return ReadUnaligned(
+        reinterpret_cast<const T*>(reinterpret_cast<uword>(this) + offset));
+  }
 
-  // Variable length data follows here.
+  template <typename T>
+  void Write(intptr_t offset, T value) {
+    return StoreUnaligned(
+        reinterpret_cast<T*>(reinterpret_cast<uword>(this) + offset), value);
+  }
 
   DISALLOW_COPY_AND_ASSIGN(Snapshot);
 };
@@ -570,9 +588,10 @@
   }
 
   void FillHeader(Snapshot::Kind kind) {
-    int64_t* data = reinterpret_cast<int64_t*>(stream_.buffer());
-    data[Snapshot::kLengthIndex] = stream_.bytes_written();
-    data[Snapshot::kSnapshotFlagIndex] = kind;
+    Snapshot* header = reinterpret_cast<Snapshot*>(stream_.buffer());
+    header->set_magic();
+    header->set_length(stream_.bytes_written());
+    header->set_kind(kind);
   }
 
   void FreeBuffer() {
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 3bfe589..cff0584 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -1029,6 +1029,7 @@
     result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
                                  &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
     Dart_ExitScope();
@@ -1067,6 +1068,7 @@
     // Write out the script snapshot.
     result = Dart_CreateScriptSnapshot(&buffer, &size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(buffer, size));
     script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
     memmove(script_snapshot, buffer, size);
     Dart_ExitScope();
@@ -1139,6 +1141,7 @@
     result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
                                  &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
     Dart_ExitScope();
@@ -1176,6 +1179,7 @@
     // Write out the script snapshot.
     result = Dart_CreateScriptSnapshot(&buffer, &size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(buffer, size));
     script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
     memmove(script_snapshot, buffer, size);
     Dart_ExitScope();
@@ -1452,6 +1456,7 @@
     result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
                                  &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
     Dart_ExitScope();
@@ -1486,6 +1491,7 @@
     // Write out the script snapshot.
     result = Dart_CreateScriptSnapshot(&buffer, &size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(buffer, size));
     script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
     memmove(script_snapshot, buffer, size);
     Dart_ExitScope();
@@ -1550,6 +1556,7 @@
     result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
                                  &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
     Dart_ExitScope();
@@ -1568,6 +1575,7 @@
     // Write out the script snapshot.
     result = Dart_CreateScriptSnapshot(&buffer, &size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(buffer, size));
     script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
     memmove(script_snapshot, buffer, size);
     Dart_ExitScope();
@@ -1641,6 +1649,7 @@
     result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
                                  &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
     Dart_ExitScope();
@@ -1669,6 +1678,7 @@
     // Write out the script snapshot.
     result = Dart_CreateScriptSnapshot(&buffer, &size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(buffer, size));
     script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
     memmove(script_snapshot, buffer, size);
     Dart_ExitScope();
@@ -1733,6 +1743,7 @@
     result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
                                  &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
     Dart_ExitScope();
@@ -1754,6 +1765,7 @@
     // Write out the script snapshot.
     result = Dart_CreateScriptSnapshot(&buffer, &size);
     EXPECT_VALID(result);
+    EXPECT(Dart_IsSnapshot(buffer, size));
     script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
     memmove(script_snapshot, buffer, size);
     Dart_ExitScope();
@@ -3145,4 +3157,18 @@
   free(writer.buffer());
 }
 
+TEST_CASE(IsSnapshotNegative) {
+  EXPECT(!Dart_IsSnapshot(NULL, 0));
+
+  uint8_t buffer[4] = {0, 0, 0, 0};
+  EXPECT(!Dart_IsSnapshot(buffer, ARRAY_SIZE(buffer)));
+}
+
+TEST_CASE(IsKernelNegative) {
+  EXPECT(!Dart_IsKernel(NULL, 0));
+
+  uint8_t buffer[4] = {0, 0, 0, 0};
+  EXPECT(!Dart_IsKernel(buffer, ARRAY_SIZE(buffer)));
+}
+
 }  // namespace dart
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 239b06a7..af6c31a 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -457,6 +457,25 @@
   return false;
 }
 
+void Thread::SetHighWatermark(intptr_t value) {
+  zone_high_watermark_ = value;
+
+#if !defined(PRODUCT)
+  if ((isolate()->name() != NULL)) {
+    TimelineEvent* event = Timeline::GetZoneStream()->StartEvent();
+    if (event != NULL) {
+      event->Counter(strdup(isolate()->name()));
+      event->set_owns_label(true);
+      // Prevent Catapult from showing "isolateId" as another series.
+      event->set_isolate_id(ILLEGAL_PORT);
+      event->SetNumArguments(1);
+      event->FormatArgument(0, "zoneHighWatermark", "%" Pd, value);
+      event->Complete();
+    }
+  }
+#endif
+}
+
 void Thread::DeferOOBMessageInterrupts() {
   MonitorLocker ml(thread_lock_);
   defer_oob_messages_count_++;
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 2c51ce0..c506170 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -284,7 +284,7 @@
   void IncrementMemoryCapacity(uintptr_t value) {
     current_zone_capacity_ += value;
     if (current_zone_capacity_ > zone_high_watermark_) {
-      zone_high_watermark_ = current_zone_capacity_;
+      SetHighWatermark(current_zone_capacity_);
     }
   }
 
@@ -297,7 +297,9 @@
 
   uintptr_t zone_high_watermark() const { return zone_high_watermark_; }
 
-  void ResetHighWatermark() { zone_high_watermark_ = current_zone_capacity_; }
+  void ResetHighWatermark() { SetHighWatermark(current_zone_capacity_); }
+
+  void SetHighWatermark(intptr_t value);
 
   // The reusable api local scope for this thread.
   ApiLocalScope* api_reusable_scope() const { return api_reusable_scope_; }
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 8ad971c..c37a982 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -39,7 +39,8 @@
   V(Embedder, false)                                                           \
   V(GC, false)                                                                 \
   V(Isolate, false)                                                            \
-  V(VM, false)
+  V(VM, false)                                                                 \
+  V(Zone, false)
 
 // A stream of timeline events. A stream has a name and can be enabled or
 // disabled (globally and per isolate).
@@ -314,10 +315,10 @@
   void PrintJSON(JSONStream* stream) const;
 
   ThreadId thread() const { return thread_; }
-
   void set_thread(ThreadId tid) { thread_ = tid; }
 
   Dart_Port isolate_id() const { return isolate_id_; }
+  void set_isolate_id(Dart_Port id) { isolate_id_ = id; }
 
   const char* label() const { return label_; }
 
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index ce9b3e0..df3bf16 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -1198,7 +1198,7 @@
     unshiftedDigits[3] = 0x10 | (bits[6] & 0xF);
 
     var unshiftedBig = new _BigIntImpl._normalized(false, 4, unshiftedDigits);
-    _BigIntImpl absResult;
+    _BigIntImpl absResult = unshiftedBig;
     if (exponent < 0) {
       absResult = unshiftedBig >> -exponent;
     } else if (exponent > 0) {
diff --git a/sdk/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
index bdc5a41..5967553 100644
--- a/sdk/lib/collection/maps.dart
+++ b/sdk/lib/collection/maps.dart
@@ -113,7 +113,7 @@
     if (this.containsKey(key)) {
       return this[key] = update(this[key]);
     }
-    if (ifAbsent == null) {
+    if (ifAbsent != null) {
       return this[key] = ifAbsent();
     }
     throw new ArgumentError.value(key, "key", "Key not in map.");
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 8341360..2187812 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -160,7 +160,7 @@
    * if it is already an `Iterable<R>`.
    *
    * It means that `someIterable.cast<Object>().toList()` is not guaranteed
-   * to return precisley a `List<Object>`, but it may return a subtype.
+   * to return precisely a `List<Object>`, but it may return a subtype.
    */
   Iterable<R> cast<R>() {
     Iterable<Object> self = this;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index b3de731..f76fa2e 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -37,6 +37,7 @@
 import 'dart:svg' show Matrix;
 import 'dart:svg' show SvgSvgElement;
 import 'dart:web_audio' as web_audio;
+import 'dart:web_audio' show AudioBuffer, AudioTrack, AudioTrackList;
 import 'dart:web_gl' as gl;
 import 'dart:web_gl' show RenderingContext, RenderingContext2;
 import 'dart:web_sql';
@@ -101,7 +102,7 @@
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
 @Native("HTMLElement")
-class HtmlElement extends Element {
+class HtmlElement extends Element implements NoncedElement {
   factory HtmlElement() {
     throw new UnsupportedError("Not supported");
   }
@@ -112,6 +113,10 @@
    * This can only be called by subclasses from their created constructor.
    */
   HtmlElement.created() : super.created();
+
+  // From NoncedElement
+  @DomName('HTMLElement.nonce')
+  String nonce;
 }
 
 createCustomUpgrader(Type customElementClass, $this) => $this;
@@ -124,6 +129,65 @@
 @Experimental() // untriaged
 typedef void FontFaceSetForEachCallback(
     FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
+
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('AbortPaymentEvent')
+@Experimental() // untriaged
+@Native("AbortPaymentEvent")
+class AbortPaymentEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory AbortPaymentEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AbortPaymentEvent.AbortPaymentEvent')
+  @DocsEditable()
+  factory AbortPaymentEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return AbortPaymentEvent._create_1(type, eventInitDict_1);
+  }
+  static AbortPaymentEvent _create_1(type, eventInitDict) => JS(
+      'AbortPaymentEvent', 'new AbortPaymentEvent(#,#)', type, eventInitDict);
+
+  @DomName('AbortPaymentEvent.respondWith')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void respondWith(Future paymentAbortedResponse) 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('AbsoluteOrientationSensor')
+@Experimental() // untriaged
+@Native("AbsoluteOrientationSensor")
+class AbsoluteOrientationSensor extends OrientationSensor {
+  // To suppress missing implicit constructor warnings.
+  factory AbsoluteOrientationSensor._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AbsoluteOrientationSensor.AbsoluteOrientationSensor')
+  @DocsEditable()
+  factory AbsoluteOrientationSensor([Map sensorOptions]) {
+    if (sensorOptions != null) {
+      var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
+      return AbsoluteOrientationSensor._create_1(sensorOptions_1);
+    }
+    return AbsoluteOrientationSensor._create_2();
+  }
+  static AbsoluteOrientationSensor _create_1(sensorOptions) => JS(
+      'AbsoluteOrientationSensor',
+      'new AbsoluteOrientationSensor(#)',
+      sensorOptions);
+  static AbsoluteOrientationSensor _create_2() =>
+      JS('AbsoluteOrientationSensor', 'new AbsoluteOrientationSensor()');
+}
 // 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.
@@ -152,6 +216,466 @@
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('Accelerometer')
+@Experimental() // untriaged
+@Native("Accelerometer")
+class Accelerometer extends Sensor {
+  // To suppress missing implicit constructor warnings.
+  factory Accelerometer._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('Accelerometer.Accelerometer')
+  @DocsEditable()
+  factory Accelerometer([Map sensorOptions]) {
+    if (sensorOptions != null) {
+      var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
+      return Accelerometer._create_1(sensorOptions_1);
+    }
+    return Accelerometer._create_2();
+  }
+  static Accelerometer _create_1(sensorOptions) =>
+      JS('Accelerometer', 'new Accelerometer(#)', sensorOptions);
+  static Accelerometer _create_2() =>
+      JS('Accelerometer', 'new Accelerometer()');
+
+  @DomName('Accelerometer.x')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num x;
+
+  @DomName('Accelerometer.y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num y;
+
+  @DomName('Accelerometer.z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num z;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('AccessibleNode')
+@Experimental() // untriaged
+@Native("AccessibleNode")
+class AccessibleNode extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory AccessibleNode._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AccessibleNode.accessibleclickEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> accessibleClickEvent =
+      const EventStreamProvider<Event>('accessibleclick');
+
+  @DomName('AccessibleNode.accessiblecontextmenuEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> accessibleContextMenuEvent =
+      const EventStreamProvider<Event>('accessiblecontextmenu');
+
+  @DomName('AccessibleNode.accessibledecrementEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> accessibleDecrementEvent =
+      const EventStreamProvider<Event>('accessibledecrement');
+
+  @DomName('AccessibleNode.accessiblefocusEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> accessibleFocusEvent =
+      const EventStreamProvider<Event>('accessiblefocus');
+
+  @DomName('AccessibleNode.accessibleincrementEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> accessibleIncrementEvent =
+      const EventStreamProvider<Event>('accessibleincrement');
+
+  @DomName('AccessibleNode.accessiblescrollintoviewEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> accessibleScrollIntoViewEvent =
+      const EventStreamProvider<Event>('accessiblescrollintoview');
+
+  @DomName('AccessibleNode.AccessibleNode')
+  @DocsEditable()
+  factory AccessibleNode() {
+    return AccessibleNode._create_1();
+  }
+  static AccessibleNode _create_1() =>
+      JS('AccessibleNode', 'new AccessibleNode()');
+
+  @DomName('AccessibleNode.activeDescendant')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNode activeDescendant;
+
+  @DomName('AccessibleNode.atomic')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool atomic;
+
+  @DomName('AccessibleNode.autocomplete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String autocomplete;
+
+  @DomName('AccessibleNode.busy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool busy;
+
+  @DomName('AccessibleNode.checked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String checked;
+
+  @DomName('AccessibleNode.colCount')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int colCount;
+
+  @DomName('AccessibleNode.colIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int colIndex;
+
+  @DomName('AccessibleNode.colSpan')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int colSpan;
+
+  @DomName('AccessibleNode.controls')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNodeList controls;
+
+  @DomName('AccessibleNode.current')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String current;
+
+  @DomName('AccessibleNode.describedBy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNodeList describedBy;
+
+  @DomName('AccessibleNode.details')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNode details;
+
+  @DomName('AccessibleNode.disabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool disabled;
+
+  @DomName('AccessibleNode.errorMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNode errorMessage;
+
+  @DomName('AccessibleNode.expanded')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool expanded;
+
+  @DomName('AccessibleNode.flowTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNodeList flowTo;
+
+  @DomName('AccessibleNode.hasPopUp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String hasPopUp;
+
+  @DomName('AccessibleNode.hidden')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool hidden;
+
+  @DomName('AccessibleNode.invalid')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String invalid;
+
+  @DomName('AccessibleNode.keyShortcuts')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String keyShortcuts;
+
+  @DomName('AccessibleNode.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String label;
+
+  @DomName('AccessibleNode.labeledBy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNodeList labeledBy;
+
+  @DomName('AccessibleNode.level')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int level;
+
+  @DomName('AccessibleNode.live')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String live;
+
+  @DomName('AccessibleNode.modal')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool modal;
+
+  @DomName('AccessibleNode.multiline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool multiline;
+
+  @DomName('AccessibleNode.multiselectable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool multiselectable;
+
+  @DomName('AccessibleNode.orientation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String orientation;
+
+  @DomName('AccessibleNode.owns')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNodeList owns;
+
+  @DomName('AccessibleNode.placeholder')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String placeholder;
+
+  @DomName('AccessibleNode.posInSet')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int posInSet;
+
+  @DomName('AccessibleNode.pressed')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String pressed;
+
+  @DomName('AccessibleNode.readOnly')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool readOnly;
+
+  @DomName('AccessibleNode.relevant')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String relevant;
+
+  @DomName('AccessibleNode.required')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool required;
+
+  @DomName('AccessibleNode.role')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String role;
+
+  @DomName('AccessibleNode.roleDescription')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String roleDescription;
+
+  @DomName('AccessibleNode.rowCount')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int rowCount;
+
+  @DomName('AccessibleNode.rowIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int rowIndex;
+
+  @DomName('AccessibleNode.rowSpan')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int rowSpan;
+
+  @DomName('AccessibleNode.selected')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool selected;
+
+  @DomName('AccessibleNode.setSize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int setSize;
+
+  @DomName('AccessibleNode.sort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String sort;
+
+  @DomName('AccessibleNode.valueMax')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num valueMax;
+
+  @DomName('AccessibleNode.valueMin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num valueMin;
+
+  @DomName('AccessibleNode.valueNow')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num valueNow;
+
+  @DomName('AccessibleNode.valueText')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String valueText;
+
+  @DomName('AccessibleNode.appendChild')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void appendChild(AccessibleNode child) native;
+
+  @DomName('AccessibleNode.onaccessibleclick')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onAccessibleClick => accessibleClickEvent.forTarget(this);
+
+  @DomName('AccessibleNode.onaccessiblecontextmenu')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onAccessibleContextMenu =>
+      accessibleContextMenuEvent.forTarget(this);
+
+  @DomName('AccessibleNode.onaccessibledecrement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onAccessibleDecrement =>
+      accessibleDecrementEvent.forTarget(this);
+
+  @DomName('AccessibleNode.onaccessiblefocus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onAccessibleFocus => accessibleFocusEvent.forTarget(this);
+
+  @DomName('AccessibleNode.onaccessibleincrement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onAccessibleIncrement =>
+      accessibleIncrementEvent.forTarget(this);
+
+  @DomName('AccessibleNode.onaccessiblescrollintoview')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onAccessibleScrollIntoView =>
+      accessibleScrollIntoViewEvent.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('AccessibleNodeList')
+@Experimental() // untriaged
+@Native("AccessibleNodeList")
+class AccessibleNodeList extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AccessibleNodeList._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AccessibleNodeList.AccessibleNodeList')
+  @DocsEditable()
+  factory AccessibleNodeList([List<AccessibleNode> nodes]) {
+    if (nodes != null) {
+      return AccessibleNodeList._create_1(nodes);
+    }
+    return AccessibleNodeList._create_2();
+  }
+  static AccessibleNodeList _create_1(nodes) =>
+      JS('AccessibleNodeList', 'new AccessibleNodeList(#)', nodes);
+  static AccessibleNodeList _create_2() =>
+      JS('AccessibleNodeList', 'new AccessibleNodeList()');
+
+  @DomName('AccessibleNodeList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int length;
+
+  @DomName('AccessibleNodeList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, AccessibleNode node) native;
+
+  @DomName('AccessibleNodeList.add')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void add(AccessibleNode node, AccessibleNode before) native;
+
+  @DomName('AccessibleNodeList.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AccessibleNode item(int index) native;
+
+  @DomName('AccessibleNodeList.remove')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void remove(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('AmbientLightSensor')
+@Experimental() // untriaged
+@Native("AmbientLightSensor")
+class AmbientLightSensor extends Sensor {
+  // To suppress missing implicit constructor warnings.
+  factory AmbientLightSensor._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AmbientLightSensor.AmbientLightSensor')
+  @DocsEditable()
+  factory AmbientLightSensor([Map sensorOptions]) {
+    if (sensorOptions != null) {
+      var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
+      return AmbientLightSensor._create_1(sensorOptions_1);
+    }
+    return AmbientLightSensor._create_2();
+  }
+  static AmbientLightSensor _create_1(sensorOptions) =>
+      JS('AmbientLightSensor', 'new AmbientLightSensor(#)', sensorOptions);
+  static AmbientLightSensor _create_2() =>
+      JS('AmbientLightSensor', 'new AmbientLightSensor()');
+
+  @DomName('AmbientLightSensor.illuminance')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num illuminance;
+}
 // 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.
@@ -159,7 +683,7 @@
 @DocsEditable()
 @DomName('HTMLAnchorElement')
 @Native("HTMLAnchorElement")
-class AnchorElement extends HtmlElement implements UrlUtils {
+class AnchorElement extends HtmlElement implements HtmlHyperlinkElementUtils {
   // To suppress missing implicit constructor warnings.
   factory AnchorElement._() {
     throw new UnsupportedError("Not supported");
@@ -188,10 +712,10 @@
   @DocsEditable()
   String hreflang;
 
-  @DomName('HTMLAnchorElement.referrerpolicy')
+  @DomName('HTMLAnchorElement.referrerPolicy')
   @DocsEditable()
   @Experimental() // untriaged
-  String referrerpolicy;
+  String referrerPolicy;
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
@@ -205,7 +729,7 @@
   @DocsEditable()
   String type;
 
-  // From URLUtils
+  // From HTMLHyperlinkElementUtils
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
@@ -273,6 +797,36 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('Animation.cancelEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> cancelEvent =
+      const EventStreamProvider<Event>('cancel');
+
+  @DomName('Animation.finishEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> finishEvent =
+      const EventStreamProvider<Event>('finish');
+
+  @DomName('Animation.Animation')
+  @DocsEditable()
+  factory Animation(
+      [AnimationEffectReadOnly effect, AnimationTimeline timeline]) {
+    if (timeline != null) {
+      return Animation._create_1(effect, timeline);
+    }
+    if (effect != null) {
+      return Animation._create_2(effect);
+    }
+    return Animation._create_3();
+  }
+  static Animation _create_1(effect, timeline) =>
+      JS('Animation', 'new Animation(#,#)', effect, timeline);
+  static Animation _create_2(effect) =>
+      JS('Animation', 'new Animation(#)', effect);
+  static Animation _create_3() => JS('Animation', 'new Animation()');
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(document.body.animate)');
 
@@ -316,6 +870,11 @@
   @Experimental() // untriaged
   num startTime;
 
+  @DomName('Animation.timeline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AnimationTimeline timeline;
+
   @DomName('Animation.cancel')
   @DocsEditable()
   @Experimental() // untriaged
@@ -340,6 +899,16 @@
   @DocsEditable()
   @Experimental() // untriaged
   void reverse() native;
+
+  @DomName('Animation.oncancel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCancel => cancelEvent.forTarget(this);
+
+  @DomName('Animation.onfinish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onFinish => finishEvent.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
@@ -355,21 +924,23 @@
     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;
+  final AnimationEffectTimingReadOnly timing;
+
+  @DomName('AnimationEffectReadOnly.getComputedTiming')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Map getComputedTiming() {
+    return convertNativeToDart_Dictionary(_getComputedTiming_1());
+  }
+
+  @JSName('getComputedTiming')
+  @DomName('AnimationEffectReadOnly.getComputedTiming')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _getComputedTiming_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
@@ -379,58 +950,121 @@
 @DomName('AnimationEffectTiming')
 @Experimental() // untriaged
 @Native("AnimationEffectTiming")
-class AnimationEffectTiming extends Interceptor {
+class AnimationEffectTiming extends AnimationEffectTimingReadOnly {
   // To suppress missing implicit constructor warnings.
   factory AnimationEffectTiming._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnimationEffectTiming.delay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num delay;
+  // Shadowing definition.
+  num get delay => JS("num", "#.delay", this);
 
-  @DomName('AnimationEffectTiming.direction')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String direction;
+  set delay(num value) {
+    JS("void", "#.delay = #", this, value);
+  }
 
-  @DomName('AnimationEffectTiming.duration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  @Creates('Null')
-  @Returns('num|String')
-  Object duration;
+  // Shadowing definition.
+  String get direction => JS("String", "#.direction", this);
 
-  @DomName('AnimationEffectTiming.easing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String easing;
+  set direction(String value) {
+    JS("void", "#.direction = #", this, value);
+  }
 
-  @DomName('AnimationEffectTiming.endDelay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num endDelay;
+  // Shadowing definition.
+  Object get duration => JS("Object", "#.duration", this);
 
-  @DomName('AnimationEffectTiming.fill')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String fill;
+  set duration(Object value) {
+    JS("void", "#.duration = #", this, value);
+  }
 
-  @DomName('AnimationEffectTiming.iterationStart')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num iterationStart;
+  // Shadowing definition.
+  String get easing => JS("String", "#.easing", this);
 
-  @DomName('AnimationEffectTiming.iterations')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num iterations;
+  set easing(String value) {
+    JS("void", "#.easing = #", this, value);
+  }
 
-  @DomName('AnimationEffectTiming.playbackRate')
+  // Shadowing definition.
+  num get endDelay => JS("num", "#.endDelay", this);
+
+  set endDelay(num value) {
+    JS("void", "#.endDelay = #", this, value);
+  }
+
+  // Shadowing definition.
+  String get fill => JS("String", "#.fill", this);
+
+  set fill(String value) {
+    JS("void", "#.fill = #", this, value);
+  }
+
+  // Shadowing definition.
+  num get iterationStart => JS("num", "#.iterationStart", this);
+
+  set iterationStart(num value) {
+    JS("void", "#.iterationStart = #", this, value);
+  }
+
+  // Shadowing definition.
+  num get iterations => JS("num", "#.iterations", this);
+
+  set iterations(num value) {
+    JS("void", "#.iterations = #", 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.
+
+@DocsEditable()
+@DomName('AnimationEffectTimingReadOnly')
+@Experimental() // untriaged
+@Native("AnimationEffectTimingReadOnly")
+class AnimationEffectTimingReadOnly extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationEffectTimingReadOnly._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AnimationEffectTimingReadOnly.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  num playbackRate;
+  final num delay;
+
+  @DomName('AnimationEffectTimingReadOnly.direction')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String direction;
+
+  @DomName('AnimationEffectTimingReadOnly.duration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Object duration;
+
+  @DomName('AnimationEffectTimingReadOnly.easing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String easing;
+
+  @DomName('AnimationEffectTimingReadOnly.endDelay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num endDelay;
+
+  @DomName('AnimationEffectTimingReadOnly.fill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String fill;
+
+  @DomName('AnimationEffectTimingReadOnly.iterationStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num iterationStart;
+
+  @DomName('AnimationEffectTimingReadOnly.iterations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num iterations;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -468,48 +1102,48 @@
   @DomName('AnimationEvent.elapsedTime')
   @DocsEditable()
   @Experimental() // untriaged
-  final double elapsedTime;
+  final num 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')
+@DomName('AnimationPlaybackEvent')
 @Experimental() // untriaged
-@Native("AnimationPlayerEvent")
-class AnimationPlayerEvent extends Event {
+@Native("AnimationPlaybackEvent")
+class AnimationPlaybackEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory AnimationPlayerEvent._() {
+  factory AnimationPlaybackEvent._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnimationPlayerEvent.AnimationPlayerEvent')
+  @DomName('AnimationPlaybackEvent.AnimationPlaybackEvent')
   @DocsEditable()
-  factory AnimationPlayerEvent(String type, [Map eventInitDict]) {
+  factory AnimationPlaybackEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return AnimationPlayerEvent._create_1(type, eventInitDict_1);
+      return AnimationPlaybackEvent._create_1(type, eventInitDict_1);
     }
-    return AnimationPlayerEvent._create_2(type);
+    return AnimationPlaybackEvent._create_2(type);
   }
-  static AnimationPlayerEvent _create_1(type, eventInitDict) => JS(
-      'AnimationPlayerEvent',
-      'new AnimationPlayerEvent(#,#)',
+  static AnimationPlaybackEvent _create_1(type, eventInitDict) => JS(
+      'AnimationPlaybackEvent',
+      'new AnimationPlaybackEvent(#,#)',
       type,
       eventInitDict);
-  static AnimationPlayerEvent _create_2(type) =>
-      JS('AnimationPlayerEvent', 'new AnimationPlayerEvent(#)', type);
+  static AnimationPlaybackEvent _create_2(type) =>
+      JS('AnimationPlaybackEvent', 'new AnimationPlaybackEvent(#)', type);
 
-  @DomName('AnimationPlayerEvent.currentTime')
+  @DomName('AnimationPlaybackEvent.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  final double currentTime;
+  final num currentTime;
 
-  @DomName('AnimationPlayerEvent.timelineTime')
+  @DomName('AnimationPlaybackEvent.timelineTime')
   @DocsEditable()
   @Experimental() // untriaged
-  final double timelineTime;
+  final num timelineTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -528,46 +1162,26 @@
   @DomName('AnimationTimeline.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num currentTime;
-
-  @DomName('AnimationTimeline.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num playbackRate;
-
-  @DomName('AnimationTimeline.getAnimations')
-  @DocsEditable()
-  @Experimental() // untriaged
-  List<Animation> getAnimations() native;
-
-  @DomName('AnimationTimeline.play')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Animation play(AnimationEffectReadOnly source) native;
+  final num currentTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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')
+@DomName('AnimationWorkletGlobalScope')
 @Experimental() // untriaged
-@Native("AppBannerPromptResult")
-class AppBannerPromptResult extends Interceptor {
+@Native("AnimationWorkletGlobalScope")
+class AnimationWorkletGlobalScope extends WorkletGlobalScope {
   // To suppress missing implicit constructor warnings.
-  factory AppBannerPromptResult._() {
+  factory AnimationWorkletGlobalScope._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AppBannerPromptResult.outcome')
+  @DomName('AnimationWorkletGlobalScope.registerAnimator')
   @DocsEditable()
   @Experimental() // untriaged
-  final String outcome;
-
-  @DomName('AppBannerPromptResult.platform')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String platform;
+  void registerAnimator(String name, Object animatorConstructor) 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
@@ -830,7 +1444,7 @@
  */
 @DomName('HTMLAreaElement')
 @Native("HTMLAreaElement")
-class AreaElement extends HtmlElement implements UrlUtils {
+class AreaElement extends HtmlElement implements HtmlHyperlinkElementUtils {
   // To suppress missing implicit constructor warnings.
   factory AreaElement._() {
     throw new UnsupportedError("Not supported");
@@ -858,10 +1472,20 @@
   @DocsEditable()
   String coords;
 
-  @DomName('HTMLAreaElement.referrerpolicy')
+  @DomName('HTMLAreaElement.download')
   @DocsEditable()
   @Experimental() // untriaged
-  String referrerpolicy;
+  String download;
+
+  @DomName('HTMLAreaElement.referrerPolicy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String referrerPolicy;
+
+  @DomName('HTMLAreaElement.rel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String rel;
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
@@ -871,7 +1495,7 @@
   @DocsEditable()
   String target;
 
-  // From URLUtils
+  // From HTMLHyperlinkElementUtils
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
@@ -956,160 +1580,63 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('AudioTrack')
+@DomName('AuthenticatorAssertionResponse')
 @Experimental() // untriaged
-@Native("AudioTrack")
-class AudioTrack extends Interceptor {
+@Native("AuthenticatorAssertionResponse")
+class AuthenticatorAssertionResponse extends AuthenticatorResponse {
   // To suppress missing implicit constructor warnings.
-  factory AudioTrack._() {
+  factory AuthenticatorAssertionResponse._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioTrack.enabled')
+  @DomName('AuthenticatorAssertionResponse.authenticatorData')
   @DocsEditable()
   @Experimental() // untriaged
-  bool enabled;
+  final ByteBuffer authenticatorData;
 
-  @DomName('AudioTrack.id')
+  @DomName('AuthenticatorAssertionResponse.signature')
   @DocsEditable()
   @Experimental() // untriaged
-  final String id;
-
-  @DomName('AudioTrack.kind')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String kind;
-
-  @DomName('AudioTrack.label')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String label;
-
-  @DomName('AudioTrack.language')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String language;
+  final ByteBuffer signature;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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('AudioTrackList')
+@DomName('AuthenticatorAttestationResponse')
 @Experimental() // untriaged
-@Native("AudioTrackList")
-class AudioTrackList extends EventTarget
-    with ListMixin<AudioTrack>, ImmutableListMixin<AudioTrack>
-    implements JavaScriptIndexingBehavior<AudioTrack>, List<AudioTrack> {
+@Native("AuthenticatorAttestationResponse")
+class AuthenticatorAttestationResponse extends AuthenticatorResponse {
   // To suppress missing implicit constructor warnings.
-  factory AudioTrackList._() {
+  factory AuthenticatorAttestationResponse._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioTrackList.changeEvent')
+  @DomName('AuthenticatorAttestationResponse.attestationObject')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent =
-      const EventStreamProvider<Event>('change');
-
-  @DomName('AudioTrackList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int get length => JS("int", "#.length", this);
-
-  AudioTrack operator [](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
-      throw new RangeError.index(index, this);
-    return JS("AudioTrack", "#[#]", this, index);
-  }
-
-  void operator []=(int index, AudioTrack value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<AudioTrack> mixins.
-  // AudioTrack is the element type.
-
-  set length(int value) {
-    throw new UnsupportedError("Cannot resize immutable List.");
-  }
-
-  AudioTrack get first {
-    if (this.length > 0) {
-      return JS('AudioTrack', '#[0]', this);
-    }
-    throw new StateError("No elements");
-  }
-
-  AudioTrack get last {
-    int len = this.length;
-    if (len > 0) {
-      return JS('AudioTrack', '#[#]', this, len - 1);
-    }
-    throw new StateError("No elements");
-  }
-
-  AudioTrack get single {
-    int len = this.length;
-    if (len == 1) {
-      return JS('AudioTrack', '#[0]', this);
-    }
-    if (len == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  AudioTrack elementAt(int index) => this[index];
-  // -- end List<AudioTrack> mixins.
-
-  @DomName('AudioTrackList.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  AudioTrack __getter__(int index) native;
-
-  @DomName('AudioTrackList.getTrackById')
-  @DocsEditable()
-  @Experimental() // untriaged
-  AudioTrack getTrackById(String id) native;
-
-  @DomName('AudioTrackList.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Stream<Event> get onChange => changeEvent.forTarget(this);
+  final ByteBuffer attestationObject;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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('AutocompleteErrorEvent')
-// http://wiki.whatwg.org/wiki/RequestAutocomplete
-@Experimental()
-@Native("AutocompleteErrorEvent")
-class AutocompleteErrorEvent extends Event {
+@DomName('AuthenticatorResponse')
+@Experimental() // untriaged
+@Native("AuthenticatorResponse")
+class AuthenticatorResponse extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AutocompleteErrorEvent._() {
+  factory AuthenticatorResponse._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AutocompleteErrorEvent.AutocompleteErrorEvent')
+  @JSName('clientDataJSON')
+  @DomName('AuthenticatorResponse.clientDataJSON')
   @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;
+  @Experimental() // untriaged
+  final ByteBuffer clientDataJson;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1140,6 +1667,278 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('BackgroundFetchClickEvent')
+@Experimental() // untriaged
+@Native("BackgroundFetchClickEvent")
+class BackgroundFetchClickEvent extends BackgroundFetchEvent {
+  // To suppress missing implicit constructor warnings.
+  factory BackgroundFetchClickEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BackgroundFetchClickEvent.BackgroundFetchClickEvent')
+  @DocsEditable()
+  factory BackgroundFetchClickEvent(String type, Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return BackgroundFetchClickEvent._create_1(type, init_1);
+  }
+  static BackgroundFetchClickEvent _create_1(type, init) => JS(
+      'BackgroundFetchClickEvent',
+      'new BackgroundFetchClickEvent(#,#)',
+      type,
+      init);
+
+  @DomName('BackgroundFetchClickEvent.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String 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.
+
+@DocsEditable()
+@DomName('BackgroundFetchEvent')
+@Experimental() // untriaged
+@Native("BackgroundFetchEvent")
+class BackgroundFetchEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory BackgroundFetchEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BackgroundFetchEvent.BackgroundFetchEvent')
+  @DocsEditable()
+  factory BackgroundFetchEvent(String type, Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return BackgroundFetchEvent._create_1(type, init_1);
+  }
+  static BackgroundFetchEvent _create_1(type, init) =>
+      JS('BackgroundFetchEvent', 'new BackgroundFetchEvent(#,#)', type, init);
+
+  @DomName('BackgroundFetchEvent.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BackgroundFetchFailEvent')
+@Experimental() // untriaged
+@Native("BackgroundFetchFailEvent")
+class BackgroundFetchFailEvent extends BackgroundFetchEvent {
+  // To suppress missing implicit constructor warnings.
+  factory BackgroundFetchFailEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BackgroundFetchFailEvent.BackgroundFetchFailEvent')
+  @DocsEditable()
+  factory BackgroundFetchFailEvent(String type, Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return BackgroundFetchFailEvent._create_1(type, init_1);
+  }
+  static BackgroundFetchFailEvent _create_1(type, init) => JS(
+      'BackgroundFetchFailEvent',
+      'new BackgroundFetchFailEvent(#,#)',
+      type,
+      init);
+
+  @DomName('BackgroundFetchFailEvent.fetches')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<BackgroundFetchSettledFetch> fetches;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BackgroundFetchFetch')
+@Experimental() // untriaged
+@Native("BackgroundFetchFetch")
+class BackgroundFetchFetch extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BackgroundFetchFetch._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BackgroundFetchFetch.request')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _Request request;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('BackgroundFetchManager')
+@Experimental() // untriaged
+@Native("BackgroundFetchManager")
+class BackgroundFetchManager extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BackgroundFetchManager._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BackgroundFetchManager.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future fetch(String id, Object requests, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _fetch_1(id, requests, options_1);
+    }
+    return _fetch_2(id, requests);
+  }
+
+  @JSName('fetch')
+  @DomName('BackgroundFetchManager.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _fetch_1(id, requests, options) native;
+  @JSName('fetch')
+  @DomName('BackgroundFetchManager.fetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _fetch_2(id, requests) native;
+
+  @DomName('BackgroundFetchManager.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future get(String id) native;
+
+  @DomName('BackgroundFetchManager.getIds')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getIds() 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('BackgroundFetchRegistration')
+@Experimental() // untriaged
+@Native("BackgroundFetchRegistration")
+class BackgroundFetchRegistration extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory BackgroundFetchRegistration._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BackgroundFetchRegistration.downloadTotal')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int downloadTotal;
+
+  @DomName('BackgroundFetchRegistration.downloaded')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int downloaded;
+
+  @DomName('BackgroundFetchRegistration.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('BackgroundFetchRegistration.title')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String title;
+
+  @DomName('BackgroundFetchRegistration.totalDownloadSize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int totalDownloadSize;
+
+  @DomName('BackgroundFetchRegistration.uploadTotal')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int uploadTotal;
+
+  @DomName('BackgroundFetchRegistration.uploaded')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int uploaded;
+
+  @DomName('BackgroundFetchRegistration.abort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future abort() 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('BackgroundFetchSettledFetch')
+@Experimental() // untriaged
+@Native("BackgroundFetchSettledFetch")
+class BackgroundFetchSettledFetch extends BackgroundFetchFetch {
+  // To suppress missing implicit constructor warnings.
+  factory BackgroundFetchSettledFetch._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BackgroundFetchSettledFetch.BackgroundFetchSettledFetch')
+  @DocsEditable()
+  factory BackgroundFetchSettledFetch(_Request request, _Response response) {
+    return BackgroundFetchSettledFetch._create_1(request, response);
+  }
+  static BackgroundFetchSettledFetch _create_1(request, response) => JS(
+      'BackgroundFetchSettledFetch',
+      'new BackgroundFetchSettledFetch(#,#)',
+      request,
+      response);
+
+  @DomName('BackgroundFetchSettledFetch.response')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _Response 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.
+
+@DocsEditable()
+@DomName('BackgroundFetchedEvent')
+@Experimental() // untriaged
+@Native("BackgroundFetchedEvent")
+class BackgroundFetchedEvent extends BackgroundFetchEvent {
+  // To suppress missing implicit constructor warnings.
+  factory BackgroundFetchedEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BackgroundFetchedEvent.BackgroundFetchedEvent')
+  @DocsEditable()
+  factory BackgroundFetchedEvent(String type, Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return BackgroundFetchedEvent._create_1(type, init_1);
+  }
+  static BackgroundFetchedEvent _create_1(type, init) => JS(
+      'BackgroundFetchedEvent', 'new BackgroundFetchedEvent(#,#)', type, init);
+
+  @DomName('BackgroundFetchedEvent.fetches')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<BackgroundFetchSettledFetch> fetches;
+
+  @DomName('BackgroundFetchedEvent.updateUI')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future updateUI(String title) 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('BarProp')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop
 @deprecated // standard
@@ -1159,6 +1958,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('BarcodeDetector')
+@Experimental() // untriaged
+@Native("BarcodeDetector")
+class BarcodeDetector extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BarcodeDetector._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BarcodeDetector.BarcodeDetector')
+  @DocsEditable()
+  factory BarcodeDetector() {
+    return BarcodeDetector._create_1();
+  }
+  static BarcodeDetector _create_1() =>
+      JS('BarcodeDetector', 'new BarcodeDetector()');
+
+  @DomName('BarcodeDetector.detect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future detect(/*ImageBitmapSource*/ image) 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('HTMLBaseElement')
 @Native("HTMLBaseElement")
 class BaseElement extends HtmlElement {
@@ -1210,15 +2036,15 @@
 
   @DomName('BatteryManager.chargingTime')
   @DocsEditable()
-  final double chargingTime;
+  final num chargingTime;
 
   @DomName('BatteryManager.dischargingTime')
   @DocsEditable()
-  final double dischargingTime;
+  final num dischargingTime;
 
   @DomName('BatteryManager.level')
   @DocsEditable()
-  final double level;
+  final num level;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1251,7 +2077,10 @@
   static BeforeInstallPromptEvent _create_2(type) =>
       JS('BeforeInstallPromptEvent', 'new BeforeInstallPromptEvent(#)', type);
 
-  List<String> get platforms => JS("List<String>", "#.platforms", this);
+  @DomName('BeforeInstallPromptEvent.platforms')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<String> platforms;
 
   @DomName('BeforeInstallPromptEvent.userChoice')
   @DocsEditable()
@@ -1303,11 +2132,6 @@
   @DocsEditable()
   final String type;
 
-  @DomName('Blob.close')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void close() native;
-
   @DomName('Blob.slice')
   @DocsEditable()
   Blob slice([int start, int end, String contentType]) native;
@@ -1369,6 +2193,50 @@
   @DocsEditable()
   @Experimental() // untriaged
   final Blob data;
+
+  @DomName('BlobEvent.timecode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num timecode;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('BluetoothRemoteGATTDescriptor')
+@Experimental() // untriaged
+@Native("BluetoothRemoteGATTDescriptor")
+class BluetoothRemoteGattDescriptor extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BluetoothRemoteGattDescriptor._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BluetoothRemoteGATTDescriptor.characteristic')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _BluetoothRemoteGATTCharacteristic characteristic;
+
+  @DomName('BluetoothRemoteGATTDescriptor.uuid')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String uuid;
+
+  @DomName('BluetoothRemoteGATTDescriptor.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final ByteData value;
+
+  @DomName('BluetoothRemoteGATTDescriptor.readValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future readValue() native;
+
+  @DomName('BluetoothRemoteGATTDescriptor.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
@@ -1399,6 +2267,11 @@
   @Experimental() // untriaged
   Future blob() native;
 
+  @DomName('Body.formData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future formData() native;
+
   @DomName('Body.json')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1644,6 +2517,78 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('BroadcastChannel')
+@Experimental() // untriaged
+@Native("BroadcastChannel")
+class BroadcastChannel extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory BroadcastChannel._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BroadcastChannel.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('BroadcastChannel.BroadcastChannel')
+  @DocsEditable()
+  factory BroadcastChannel(String name) {
+    return BroadcastChannel._create_1(name);
+  }
+  static BroadcastChannel _create_1(name) =>
+      JS('BroadcastChannel', 'new BroadcastChannel(#)', name);
+
+  @DomName('BroadcastChannel.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String name;
+
+  @DomName('BroadcastChannel.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() native;
+
+  @DomName('BroadcastChannel.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(Object message) native;
+
+  @DomName('BroadcastChannel.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('BudgetState')
+@Experimental() // untriaged
+@Native("BudgetState")
+class BudgetState extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory BudgetState._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BudgetState.budgetAt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num budgetAt;
+
+  @DomName('BudgetState.time')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int time;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLButtonElement')
 @Native("HTMLButtonElement")
 class ButtonElement extends HtmlElement {
@@ -1818,108 +2763,51 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('CalcLength')
+@DomName('CanMakePaymentEvent')
 @Experimental() // untriaged
-@Native("CalcLength")
-class CalcLength extends LengthValue {
+@Native("CanMakePaymentEvent")
+class CanMakePaymentEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
-  factory CalcLength._() {
+  factory CanMakePaymentEvent._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CalcLength.CalcLength')
+  @DomName('CanMakePaymentEvent.CanMakePaymentEvent')
   @DocsEditable()
-  factory CalcLength(calcDictionary_OR_length) {
-    if ((calcDictionary_OR_length is LengthValue)) {
-      return CalcLength._create_1(calcDictionary_OR_length);
-    }
-    if ((calcDictionary_OR_length is Map)) {
-      var calcDictionary_1 =
-          convertDartToNative_Dictionary(calcDictionary_OR_length);
-      return CalcLength._create_2(calcDictionary_1);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+  factory CanMakePaymentEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return CanMakePaymentEvent._create_1(type, eventInitDict_1);
   }
-  static CalcLength _create_1(calcDictionary_OR_length) =>
-      JS('CalcLength', 'new CalcLength(#)', calcDictionary_OR_length);
-  static CalcLength _create_2(calcDictionary_OR_length) =>
-      JS('CalcLength', 'new CalcLength(#)', calcDictionary_OR_length);
+  static CanMakePaymentEvent _create_1(type, eventInitDict) => JS(
+      'CanMakePaymentEvent',
+      'new CanMakePaymentEvent(#,#)',
+      type,
+      eventInitDict);
 
-  @DomName('CalcLength.ch')
+  @DomName('CanMakePaymentEvent.methodData')
   @DocsEditable()
   @Experimental() // untriaged
-  final double ch;
+  final List methodData;
 
-  @DomName('CalcLength.cm')
+  @DomName('CanMakePaymentEvent.modifiers')
   @DocsEditable()
   @Experimental() // untriaged
-  final double cm;
+  final List modifiers;
 
-  @DomName('CalcLength.em')
+  @DomName('CanMakePaymentEvent.paymentRequestOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  final double em;
+  final String paymentRequestOrigin;
 
-  @DomName('CalcLength.ex')
+  @DomName('CanMakePaymentEvent.topLevelOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  final double ex;
+  final String topLevelOrigin;
 
-  @JSName('in')
-  @DomName('CalcLength.in')
+  @DomName('CanMakePaymentEvent.respondWith')
   @DocsEditable()
   @Experimental() // untriaged
-  final double inch;
-
-  @DomName('CalcLength.mm')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double mm;
-
-  @DomName('CalcLength.pc')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double pc;
-
-  @DomName('CalcLength.percent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double percent;
-
-  @DomName('CalcLength.pt')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double pt;
-
-  @DomName('CalcLength.px')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double px;
-
-  @DomName('CalcLength.rem')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double rem;
-
-  @DomName('CalcLength.vh')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double vh;
-
-  @DomName('CalcLength.vmax')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double vmax;
-
-  @DomName('CalcLength.vmin')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double vmin;
-
-  @DomName('CalcLength.vw')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double vw;
+  void respondWith(Future canMakePaymentResponse) 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
@@ -2045,6 +2933,11 @@
   @DocsEditable()
   String _toDataUrl(String type, [arguments_OR_quality]) native;
 
+  @DomName('HTMLCanvasElement.transferControlToOffscreen')
+  @DocsEditable()
+  @Experimental() // untriaged
+  OffscreenCanvas transferControlToOffscreen() native;
+
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
@@ -2406,14 +3299,51 @@
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  ImageData createImageData(imagedata_OR_sw, [num sh]) {
-    if ((imagedata_OR_sw is ImageData) && sh == null) {
-      var imagedata_1 = convertDartToNative_ImageData(imagedata_OR_sw);
+  ImageData createImageData(data_OR_imagedata_OR_sw,
+      [int sh_OR_sw,
+      imageDataColorSettings_OR_sh,
+      Map imageDataColorSettings]) {
+    if ((data_OR_imagedata_OR_sw is ImageData) &&
+        sh_OR_sw == null &&
+        imageDataColorSettings_OR_sh == null &&
+        imageDataColorSettings == null) {
+      var imagedata_1 = convertDartToNative_ImageData(data_OR_imagedata_OR_sw);
       return convertNativeToDart_ImageData(_createImageData_1(imagedata_1));
     }
-    if (sh != null && (imagedata_OR_sw is num)) {
+    if (sh_OR_sw != null &&
+        (data_OR_imagedata_OR_sw is int) &&
+        imageDataColorSettings_OR_sh == null &&
+        imageDataColorSettings == null) {
       return convertNativeToDart_ImageData(
-          _createImageData_2(imagedata_OR_sw, sh));
+          _createImageData_2(data_OR_imagedata_OR_sw, sh_OR_sw));
+    }
+    if ((imageDataColorSettings_OR_sh is Map) &&
+        sh_OR_sw != null &&
+        (data_OR_imagedata_OR_sw is int) &&
+        imageDataColorSettings == null) {
+      var imageDataColorSettings_1 =
+          convertDartToNative_Dictionary(imageDataColorSettings_OR_sh);
+      return convertNativeToDart_ImageData(_createImageData_3(
+          data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_1));
+    }
+    if ((imageDataColorSettings_OR_sh is int) &&
+        sh_OR_sw != null &&
+        data_OR_imagedata_OR_sw != null &&
+        imageDataColorSettings == null) {
+      return convertNativeToDart_ImageData(_createImageData_4(
+          data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_OR_sh));
+    }
+    if (imageDataColorSettings != null &&
+        (imageDataColorSettings_OR_sh is int) &&
+        sh_OR_sw != null &&
+        data_OR_imagedata_OR_sw != null) {
+      var imageDataColorSettings_1 =
+          convertDartToNative_Dictionary(imageDataColorSettings);
+      return convertNativeToDart_ImageData(_createImageData_5(
+          data_OR_imagedata_OR_sw,
+          sh_OR_sw,
+          imageDataColorSettings_OR_sh,
+          imageDataColorSettings_1));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -2427,7 +3357,22 @@
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  _createImageData_2(num sw, sh) native;
+  _createImageData_2(int sw, sh) native;
+  @JSName('createImageData')
+  @DomName('CanvasRenderingContext2D.createImageData')
+  @DocsEditable()
+  @Creates('ImageData|=Object')
+  _createImageData_3(int sw, sh, imageDataColorSettings) native;
+  @JSName('createImageData')
+  @DomName('CanvasRenderingContext2D.createImageData')
+  @DocsEditable()
+  @Creates('ImageData|=Object')
+  _createImageData_4(data, sw, int sh) native;
+  @JSName('createImageData')
+  @DomName('CanvasRenderingContext2D.createImageData')
+  @DocsEditable()
+  @Creates('ImageData|=Object')
+  _createImageData_5(data, sw, int sh, imageDataColorSettings) native;
 
   @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
@@ -2469,7 +3414,7 @@
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  ImageData getImageData(num sx, num sy, num sw, num sh) {
+  ImageData getImageData(int sx, int sy, int sw, int sh) {
     return convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
   }
 
@@ -2504,8 +3449,8 @@
 
   @DomName('CanvasRenderingContext2D.putImageData')
   @DocsEditable()
-  void putImageData(ImageData imagedata, num dx, num dy,
-      [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
+  void putImageData(ImageData imagedata, int dx, int dy,
+      [int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight]) {
     if (dirtyX == null &&
         dirtyY == null &&
         dirtyWidth == null &&
@@ -2591,7 +3536,7 @@
   @DocsEditable()
   void translate(num x, num y) native;
 
-  // From CanvasPathMethods
+  // From CanvasPath
 
   @JSName('arc')
   @DomName('CanvasRenderingContext2D.arc')
@@ -2991,6 +3936,16 @@
 
   // 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')
@@ -3014,6 +3969,10 @@
     throw new UnsupportedError("Not supported");
   }
 
+  void after(Object nodes);
+
+  void before(Object nodes);
+
   void remove();
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3021,68 +3980,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @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")
-class CircularGeofencingRegion extends GeofencingRegion {
-  // To suppress missing implicit constructor warnings.
-  factory CircularGeofencingRegion._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('CircularGeofencingRegion.CircularGeofencingRegion')
-  @DocsEditable()
-  factory CircularGeofencingRegion(Map init) {
-    var init_1 = convertDartToNative_Dictionary(init);
-    return CircularGeofencingRegion._create_1(init_1);
-  }
-  static CircularGeofencingRegion _create_1(init) =>
-      JS('CircularGeofencingRegion', 'new CircularGeofencingRegion(#)', init);
-
-  @DomName('CircularGeofencingRegion.MAX_RADIUS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const num MAX_RADIUS = 100.0;
-
-  @DomName('CircularGeofencingRegion.MIN_RADIUS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const num MIN_RADIUS = 1.0;
-
-  @DomName('CircularGeofencingRegion.latitude')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double latitude;
-
-  @DomName('CircularGeofencingRegion.longitude')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double longitude;
-
-  @DomName('CircularGeofencingRegion.radius')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double radius;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('Client')
 @Experimental() // untriaged
 @Native("Client")
@@ -3102,6 +3999,11 @@
   @Experimental() // untriaged
   final String id;
 
+  @DomName('Client.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+
   @DomName('Client.url')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3110,28 +4012,7 @@
   @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;
+  void postMessage(Object message, [List<Object> transfer]) 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
@@ -3198,6 +4079,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('ClipboardEvent.ClipboardEvent')
+  @DocsEditable()
+  factory ClipboardEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return ClipboardEvent._create_1(type, eventInitDict_1);
+    }
+    return ClipboardEvent._create_2(type);
+  }
+  static ClipboardEvent _create_1(type, eventInitDict) =>
+      JS('ClipboardEvent', 'new ClipboardEvent(#,#)', type, eventInitDict);
+  static ClipboardEvent _create_2(type) =>
+      JS('ClipboardEvent', 'new ClipboardEvent(#)', type);
+
   @DomName('ClipboardEvent.clipboardData')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3319,328 +4214,6 @@
 // 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 {
-  const Console._safe();
-
-  static const Console _safeConsole = const Console._safe();
-
-  bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
-
-  @DomName('Console.memory')
-  MemoryInfo get memory =>
-      _isConsoleDefined ? JS('MemoryInfo', 'console.memory') : null;
-
-  @DomName('Console.assertCondition')
-  void assertCondition(bool condition, Object arg) => _isConsoleDefined
-      ? JS('void', 'console.assertCondition(#, #)', condition, arg)
-      : null;
-
-  @DomName('Console.clear')
-  void clear(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.clear(#)', arg) : null;
-
-  @DomName('Console.count')
-  void count(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.count(#)', arg) : null;
-
-  @DomName('Console.debug')
-  void debug(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.debug(#)', arg) : null;
-
-  @DomName('Console.dir')
-  void dir(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.dir(#)', arg) : null;
-
-  @DomName('Console.dirxml')
-  void dirxml(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.dirxml(#)', arg) : null;
-
-  @DomName('Console.error')
-  void error(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.error(#)', arg) : null;
-
-  @DomName('Console.group')
-  void group(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.group(#)', arg) : null;
-
-  @DomName('Console.groupCollapsed')
-  void groupCollapsed(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.groupCollapsed(#)', arg) : null;
-
-  @DomName('Console.groupEnd')
-  void groupEnd() =>
-      _isConsoleDefined ? JS('void', 'console.groupEnd()') : null;
-
-  @DomName('Console.info')
-  void info(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.info(#)', arg) : null;
-
-  @DomName('Console.log')
-  void log(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.log(#)', arg) : null;
-
-  @DomName('Console.markTimeline')
-  void markTimeline(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.markTimeline(#)', arg) : null;
-
-  @DomName('Console.profile')
-  void profile(String title) =>
-      _isConsoleDefined ? JS('void', 'console.profile(#)', title) : null;
-
-  @DomName('Console.profileEnd')
-  void profileEnd(String title) =>
-      _isConsoleDefined ? JS('void', 'console.profileEnd(#)', title) : null;
-
-  @DomName('Console.table')
-  void table(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.table(#)', arg) : null;
-
-  @DomName('Console.time')
-  void time(String title) =>
-      _isConsoleDefined ? JS('void', 'console.time(#)', title) : null;
-
-  @DomName('Console.timeEnd')
-  void timeEnd(String title) =>
-      _isConsoleDefined ? JS('void', 'console.timeEnd(#)', title) : null;
-
-  @DomName('Console.timeStamp')
-  void timeStamp(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.timeStamp(#)', arg) : null;
-
-  @DomName('Console.trace')
-  void trace(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.trace(#)', arg) : null;
-
-  @DomName('Console.warn')
-  void warn(Object arg) =>
-      _isConsoleDefined ? JS('void', 'console.warn(#)', arg) : null;
-  // To suppress missing implicit constructor warnings.
-  factory Console._() {
-    throw new UnsupportedError("Not supported");
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@DocsEditable()
-@DomName('ConsoleBase')
-@Experimental() // untriaged
-@Native("ConsoleBase")
-class ConsoleBase extends Interceptor {
-  // 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
-  void timeline(String title) native;
-
-  @DomName('ConsoleBase.timelineEnd')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void timelineEnd(String title) 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('HTMLContentElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental()
@@ -3680,6 +4253,64 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('CookieStore')
+@Experimental() // untriaged
+@Native("CookieStore")
+class CookieStore extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CookieStore._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CookieStore.getAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getAll([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _getAll_1(options_1);
+    }
+    return _getAll_2();
+  }
+
+  @JSName('getAll')
+  @DomName('CookieStore.getAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _getAll_1(options) native;
+  @JSName('getAll')
+  @DomName('CookieStore.getAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _getAll_2() native;
+
+  @DomName('CookieStore.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future set(String name, String value, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _set_1(name, value, options_1);
+    }
+    return _set_2(name, value);
+  }
+
+  @JSName('set')
+  @DomName('CookieStore.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _set_1(name, value, options) native;
+  @JSName('set')
+  @DomName('CookieStore.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _set_2(name, 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('Coordinates')
 @Native("Coordinates")
 class Coordinates extends Interceptor {
@@ -3690,31 +4321,31 @@
 
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  final double accuracy;
+  final num accuracy;
 
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  final double altitude;
+  final num altitude;
 
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  final double altitudeAccuracy;
+  final num altitudeAccuracy;
 
   @DomName('Coordinates.heading')
   @DocsEditable()
-  final double heading;
+  final num heading;
 
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  final double latitude;
+  final num latitude;
 
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  final double longitude;
+  final num longitude;
 
   @DomName('Coordinates.speed')
   @DocsEditable()
-  final double speed;
+  final num speed;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3730,22 +4361,11 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @JSName('iconURL')
-  @DomName('Credential.iconURL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String iconUrl;
-
   @DomName('Credential.id')
   @DocsEditable()
   @Experimental() // untriaged
   final String id;
 
-  @DomName('Credential.name')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String name;
-
   @DomName('Credential.type')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3756,6 +4376,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('CredentialUserData')
+@Experimental() // untriaged
+@Native("CredentialUserData")
+class CredentialUserData extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CredentialUserData._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @JSName('iconURL')
+  @DomName('CredentialUserData.iconURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String iconUrl;
+
+  @DomName('CredentialUserData.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('CredentialsContainer')
 @Experimental() // untriaged
 @Native("CredentialsContainer")
@@ -3765,6 +4410,28 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('CredentialsContainer.create')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future create([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _create_1(options_1);
+    }
+    return _create_2();
+  }
+
+  @JSName('create')
+  @DomName('CredentialsContainer.create')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _create_1(options) native;
+  @JSName('create')
+  @DomName('CredentialsContainer.create')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _create_2() native;
+
   @DomName('CredentialsContainer.get')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3787,6 +4454,11 @@
   @Experimental() // untriaged
   Future _get_2() native;
 
+  @DomName('CredentialsContainer.preventSilentAccess')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future preventSilentAccess() native;
+
   @DomName('CredentialsContainer.requireUserMediation')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3797,56 +4469,6 @@
   @Experimental() // untriaged
   Future store(Credential credential) 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
 // BSD-style license that can be found in the LICENSE file.
@@ -3916,7 +4538,7 @@
   @DomName('CryptoKey.usages')
   @DocsEditable()
   @Experimental() // untriaged
-  final List<String> usages;
+  final Object usages;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3933,11 +4555,147 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('CSS.paintWorklet')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _Worklet paintWorklet;
+
+  @DomName('CSS.Hz')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue Hz(num value) native;
+
+  @DomName('CSS.ch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue ch(num value) native;
+
+  @DomName('CSS.cm')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue cm(num value) native;
+
+  @DomName('CSS.deg')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue deg(num value) native;
+
+  @DomName('CSS.dpcm')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue dpcm(num value) native;
+
+  @DomName('CSS.dpi')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue dpi(num value) native;
+
+  @DomName('CSS.dppx')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue dppx(num value) native;
+
+  @DomName('CSS.em')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue em(num value) native;
+
   @DomName('CSS.escape')
   @DocsEditable()
   @Experimental() // untriaged
   static String escape(String ident) native;
 
+  @DomName('CSS.ex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue ex(num value) native;
+
+  @DomName('CSS.fr')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue fr(num value) native;
+
+  @DomName('CSS.grad')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue grad(num value) native;
+
+  @JSName('in')
+  @DomName('CSS.in')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue inch(num value) native;
+
+  @DomName('CSS.kHz')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue kHz(num value) native;
+
+  @DomName('CSS.mm')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue mm(num value) native;
+
+  @DomName('CSS.ms')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue ms(num value) native;
+
+  @DomName('CSS.number')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue number(num value) native;
+
+  @DomName('CSS.pc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue pc(num value) native;
+
+  @DomName('CSS.percent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue percent(num value) native;
+
+  @DomName('CSS.pt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue pt(num value) native;
+
+  @DomName('CSS.px')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue px(num value) native;
+
+  @DomName('CSS.rad')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue rad(num value) native;
+
+  @DomName('CSS.registerProperty')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static void registerProperty(Map descriptor) {
+    var descriptor_1 = convertDartToNative_Dictionary(descriptor);
+    _registerProperty_1(descriptor_1);
+    return;
+  }
+
+  @JSName('registerProperty')
+  @DomName('CSS.registerProperty')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static void _registerProperty_1(descriptor) native;
+
+  @DomName('CSS.rem')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue rem(num value) native;
+
+  @DomName('CSS.s')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue s(num value) native;
+
   @DomName('CSS.supports')
   @DocsEditable()
   static bool supports(String property, String value) native;
@@ -3946,6 +4704,31 @@
   @DomName('CSS.supports')
   @DocsEditable()
   static bool supportsCondition(String conditionText) native;
+
+  @DomName('CSS.turn')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue turn(num value) native;
+
+  @DomName('CSS.vh')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue vh(num value) native;
+
+  @DomName('CSS.vmax')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue vmax(num value) native;
+
+  @DomName('CSS.vmin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue vmin(num value) native;
+
+  @DomName('CSS.vw')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssUnitValue vw(num 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
@@ -3971,6 +4754,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('CSSConditionRule')
+@Experimental() // untriaged
+@Native("CSSConditionRule")
+class CssConditionRule extends CssGroupingRule {
+  // To suppress missing implicit constructor warnings.
+  factory CssConditionRule._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSConditionRule.conditionText')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String conditionText;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 {
@@ -4019,6 +4821,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('CSSImageValue')
+@Experimental() // untriaged
+@Native("CSSImageValue")
+class CssImageValue extends CssResourceValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssImageValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSImageValue.intrinsicHeight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num intrinsicHeight;
+
+  @DomName('CSSImageValue.intrinsicRatio')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num intrinsicRatio;
+
+  @DomName('CSSImageValue.intrinsicWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num intrinsicWidth;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 {
@@ -4114,9 +4945,69 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('CSSKeywordValue')
+@Experimental() // untriaged
+@Native("CSSKeywordValue")
+class CssKeywordValue extends CssStyleValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssKeywordValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSKeywordValue.CSSKeywordValue')
+  @DocsEditable()
+  factory CssKeywordValue(String keyword) {
+    return CssKeywordValue._create_1(keyword);
+  }
+  static CssKeywordValue _create_1(keyword) =>
+      JS('CssKeywordValue', 'new CSSKeywordValue(#)', keyword);
+
+  @DomName('CSSKeywordValue.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String value;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('CSSMatrixComponent')
+@Experimental() // untriaged
+@Native("CSSMatrixComponent")
+class CssMatrixComponent extends CssTransformComponent {
+  // To suppress missing implicit constructor warnings.
+  factory CssMatrixComponent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSMatrixComponent.CSSMatrixComponent')
+  @DocsEditable()
+  factory CssMatrixComponent(DomMatrixReadOnly matrix, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return CssMatrixComponent._create_1(matrix, options_1);
+    }
+    return CssMatrixComponent._create_2(matrix);
+  }
+  static CssMatrixComponent _create_1(matrix, options) =>
+      JS('CssMatrixComponent', 'new CSSMatrixComponent(#,#)', matrix, options);
+  static CssMatrixComponent _create_2(matrix) =>
+      JS('CssMatrixComponent', 'new CSSMatrixComponent(#)', matrix);
+
+  @DomName('CSSMatrixComponent.matrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix matrix;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CSSMediaRule')
 @Native("CSSMediaRule")
-class CssMediaRule extends CssGroupingRule {
+class CssMediaRule extends CssConditionRule {
   // To suppress missing implicit constructor warnings.
   factory CssMediaRule._() {
     throw new UnsupportedError("Not supported");
@@ -4156,6 +5047,50 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('CSSNumericValue')
+@Experimental() // untriaged
+@Native("CSSNumericValue")
+class CssNumericValue extends CssStyleValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssNumericValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSNumericValue.add')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue add(CssNumericValue value) native;
+
+  @DomName('CSSNumericValue.div')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue div(num value) native;
+
+  @DomName('CSSNumericValue.mul')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue mul(num value) native;
+
+  @DomName('CSSNumericValue.parse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static CssNumericValue parse(String cssText) native;
+
+  @DomName('CSSNumericValue.sub')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue sub(CssNumericValue value) native;
+
+  @DomName('CSSNumericValue.to')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue to(String unit) 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('CSSPageRule')
 @Native("CSSPageRule")
 class CssPageRule extends CssRule {
@@ -4177,6 +5112,140 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('CSSPerspective')
+@Experimental() // untriaged
+@Native("CSSPerspective")
+class CssPerspective extends CssTransformComponent {
+  // To suppress missing implicit constructor warnings.
+  factory CssPerspective._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSPerspective.CSSPerspective')
+  @DocsEditable()
+  factory CssPerspective(CssNumericValue length) {
+    return CssPerspective._create_1(length);
+  }
+  static CssPerspective _create_1(length) =>
+      JS('CssPerspective', 'new CSSPerspective(#)', length);
+
+  @DomName('CSSPerspective.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue length;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CSSPositionValue')
+@Experimental() // untriaged
+@Native("CSSPositionValue")
+class CssPositionValue extends CssStyleValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssPositionValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSPositionValue.CSSPositionValue')
+  @DocsEditable()
+  factory CssPositionValue(CssNumericValue x, CssNumericValue y) {
+    return CssPositionValue._create_1(x, y);
+  }
+  static CssPositionValue _create_1(x, y) =>
+      JS('CssPositionValue', 'new CSSPositionValue(#,#)', x, y);
+
+  @DomName('CSSPositionValue.x')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue x;
+
+  @DomName('CSSPositionValue.y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue 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.
+
+@DocsEditable()
+@DomName('CSSResourceValue')
+@Experimental() // untriaged
+@Native("CSSResourceValue")
+class CssResourceValue extends CssStyleValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssResourceValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSResourceValue.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String 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.
+
+@DocsEditable()
+@DomName('CSSRotation')
+@Experimental() // untriaged
+@Native("CSSRotation")
+class CssRotation extends CssTransformComponent {
+  // To suppress missing implicit constructor warnings.
+  factory CssRotation._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSRotation.CSSRotation')
+  @DocsEditable()
+  factory CssRotation(angleValue_OR_x, [num y, num z, CssNumericValue angle]) {
+    if ((angleValue_OR_x is CssNumericValue) &&
+        y == null &&
+        z == null &&
+        angle == null) {
+      return CssRotation._create_1(angleValue_OR_x);
+    }
+    if ((angle is CssNumericValue) &&
+        (z is num) &&
+        (y is num) &&
+        (angleValue_OR_x is num)) {
+      return CssRotation._create_2(angleValue_OR_x, y, z, angle);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  static CssRotation _create_1(angleValue_OR_x) =>
+      JS('CssRotation', 'new CSSRotation(#)', angleValue_OR_x);
+  static CssRotation _create_2(angleValue_OR_x, y, z, angle) => JS(
+      'CssRotation', 'new CSSRotation(#,#,#,#)', angleValue_OR_x, y, z, angle);
+
+  @DomName('CSSRotation.angle')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue angle;
+
+  @DomName('CSSRotation.x')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num x;
+
+  @DomName('CSSRotation.y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num y;
+
+  @DomName('CSSRotation.z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num z;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CSSRule')
 @Native("CSSRule")
 class CssRule extends Interceptor {
@@ -4233,18 +5302,6 @@
   @Experimental() // untriaged
   static const int VIEWPORT_RULE = 15;
 
-  @DomName('CSSRule.WEBKIT_KEYFRAMES_RULE')
-  @DocsEditable()
-  // http://www.w3.org/TR/css3-animations/#cssrule
-  @Experimental()
-  static const int WEBKIT_KEYFRAMES_RULE = 7;
-
-  @DomName('CSSRule.WEBKIT_KEYFRAME_RULE')
-  @DocsEditable()
-  // http://www.w3.org/TR/css3-animations/#cssrule
-  @Experimental()
-  static const int WEBKIT_KEYFRAME_RULE = 8;
-
   @DomName('CSSRule.cssText')
   @DocsEditable()
   String cssText;
@@ -4261,6 +5318,81 @@
   @DocsEditable()
   final int 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('CSSScale')
+@Experimental() // untriaged
+@Native("CSSScale")
+class CssScale extends CssTransformComponent {
+  // To suppress missing implicit constructor warnings.
+  factory CssScale._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSScale.CSSScale')
+  @DocsEditable()
+  factory CssScale(num x, num y, [num z]) {
+    if ((y is num) && (x is num) && z == null) {
+      return CssScale._create_1(x, y);
+    }
+    if ((z is num) && (y is num) && (x is num)) {
+      return CssScale._create_2(x, y, z);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  static CssScale _create_1(x, y) => JS('CssScale', 'new CSSScale(#,#)', x, y);
+  static CssScale _create_2(x, y, z) =>
+      JS('CssScale', 'new CSSScale(#,#,#)', x, y, z);
+
+  @DomName('CSSScale.x')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num x;
+
+  @DomName('CSSScale.y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num y;
+
+  @DomName('CSSScale.z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num z;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CSSSkew')
+@Experimental() // untriaged
+@Native("CSSSkew")
+class CssSkew extends CssTransformComponent {
+  // To suppress missing implicit constructor warnings.
+  factory CssSkew._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSSkew.CSSSkew')
+  @DocsEditable()
+  factory CssSkew(CssNumericValue ax, CssNumericValue ay) {
+    return CssSkew._create_1(ax, ay);
+  }
+  static CssSkew _create_1(ax, ay) => JS('CssSkew', 'new CSSSkew(#,#)', ax, ay);
+
+  @DomName('CSSSkew.ax')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue ax;
+
+  @DomName('CSSSkew.ay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue ay;
+}
 
 // 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
@@ -8807,31 +9939,234 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('CSSStyleValue')
+@Experimental() // untriaged
+@Native("CSSStyleValue")
+class CssStyleValue extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CssStyleValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSStyleValue.parse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Object parse(String property, String cssText) 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('CSSSupportsRule')
 @Native("CSSSupportsRule")
-class CssSupportsRule extends CssRule {
+class CssSupportsRule extends CssConditionRule {
   // To suppress missing implicit constructor warnings.
   factory CssSupportsRule._() {
     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.
 
-  @DomName('CSSSupportsRule.conditionText')
-  @DocsEditable()
-  final String conditionText;
+@DocsEditable()
+@DomName('CSSTransformComponent')
+@Experimental() // untriaged
+@Native("CSSTransformComponent")
+class CssTransformComponent extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CssTransformComponent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
-  @DomName('CSSSupportsRule.cssRules')
+  @DomName('CSSTransformComponent.is2D')
   @DocsEditable()
-  @Returns('_CssRuleList|Null')
-  @Creates('_CssRuleList')
-  final List<CssRule> cssRules;
+  @Experimental() // untriaged
+  bool is2D;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CSSSupportsRule.deleteRule')
-  @DocsEditable()
-  void deleteRule(int index) native;
+@DocsEditable()
+@DomName('CSSTransformValue')
+@Experimental() // untriaged
+@Native("CSSTransformValue")
+class CssTransformValue extends CssStyleValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssTransformValue._() {
+    throw new UnsupportedError("Not supported");
+  }
 
-  @DomName('CSSSupportsRule.insertRule')
+  @DomName('CSSTransformValue.CSSTransformValue')
   @DocsEditable()
-  int insertRule(String rule, int index) native;
+  factory CssTransformValue([List<CssTransformComponent> transformComponents]) {
+    if (transformComponents == null) {
+      return CssTransformValue._create_1();
+    }
+    if ((transformComponents is List<CssTransformComponent>)) {
+      return CssTransformValue._create_2(transformComponents);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  static CssTransformValue _create_1() =>
+      JS('CssTransformValue', 'new CSSTransformValue()');
+  static CssTransformValue _create_2(transformComponents) =>
+      JS('CssTransformValue', 'new CSSTransformValue(#)', transformComponents);
+
+  @DomName('CSSTransformValue.is2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool is2D;
+
+  @DomName('CSSTransformValue.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+
+  @DomName('CSSTransformValue.componentAtIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssTransformComponent componentAtIndex(int index) native;
+
+  @DomName('CSSTransformValue.toMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix toMatrix() 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('CSSTranslation')
+@Experimental() // untriaged
+@Native("CSSTranslation")
+class CssTranslation extends CssTransformComponent {
+  // To suppress missing implicit constructor warnings.
+  factory CssTranslation._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSTranslation.CSSTranslation')
+  @DocsEditable()
+  factory CssTranslation(CssNumericValue x, CssNumericValue y,
+      [CssNumericValue z]) {
+    if ((y is CssNumericValue) && (x is CssNumericValue) && z == null) {
+      return CssTranslation._create_1(x, y);
+    }
+    if ((z is CssNumericValue) &&
+        (y is CssNumericValue) &&
+        (x is CssNumericValue)) {
+      return CssTranslation._create_2(x, y, z);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  static CssTranslation _create_1(x, y) =>
+      JS('CssTranslation', 'new CSSTranslation(#,#)', x, y);
+  static CssTranslation _create_2(x, y, z) =>
+      JS('CssTranslation', 'new CSSTranslation(#,#,#)', x, y, z);
+
+  @DomName('CSSTranslation.x')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue x;
+
+  @DomName('CSSTranslation.y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue y;
+
+  @DomName('CSSTranslation.z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssNumericValue z;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CSSUnitValue')
+@Experimental() // untriaged
+@Native("CSSUnitValue")
+class CssUnitValue extends CssNumericValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssUnitValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSUnitValue.CSSUnitValue')
+  @DocsEditable()
+  factory CssUnitValue(num value, String unit) {
+    return CssUnitValue._create_1(value, unit);
+  }
+  static CssUnitValue _create_1(value, unit) =>
+      JS('CssUnitValue', 'new CSSUnitValue(#,#)', value, unit);
+
+  @DomName('CSSUnitValue.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+
+  @DomName('CSSUnitValue.unit')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String unit;
+
+  @DomName('CSSUnitValue.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num value;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('CSSUnparsedValue')
+@Experimental() // untriaged
+@Native("CSSUnparsedValue")
+class CssUnparsedValue extends CssStyleValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssUnparsedValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSUnparsedValue.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+
+  @DomName('CSSUnparsedValue.fragmentAtIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object fragmentAtIndex(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('CSSVariableReferenceValue')
+@Experimental() // untriaged
+@Native("CSSVariableReferenceValue")
+class CssVariableReferenceValue extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CssVariableReferenceValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSVariableReferenceValue.fallback')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CssUnparsedValue fallback;
+
+  @DomName('CSSVariableReferenceValue.variable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String variable;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -8856,6 +10191,91 @@
 // for 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('CSSURLImageValue')
+@Experimental() // untriaged
+@Native("CSSURLImageValue")
+class CssurlImageValue extends CssImageValue {
+  // To suppress missing implicit constructor warnings.
+  factory CssurlImageValue._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CSSURLImageValue.CSSURLImageValue')
+  @DocsEditable()
+  factory CssurlImageValue(String url) {
+    return CssurlImageValue._create_1(url);
+  }
+  static CssurlImageValue _create_1(url) =>
+      JS('CssurlImageValue', 'new CSSURLImageValue(#)', url);
+
+  @DomName('CSSURLImageValue.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String 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.
+
+@DomName('CustomElementConstructor')
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-custom-element-constructor-generation
+@deprecated // experimental
+typedef void CustomElementConstructor();
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('CustomElementRegistry')
+@Experimental() // untriaged
+@Native("CustomElementRegistry")
+class CustomElementRegistry extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CustomElementRegistry._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('CustomElementRegistry.define')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void define(String name, Object constructor, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      _define_1(name, constructor, options_1);
+      return;
+    }
+    _define_2(name, constructor);
+    return;
+  }
+
+  @JSName('define')
+  @DomName('CustomElementRegistry.define')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _define_1(name, constructor, options) native;
+  @JSName('define')
+  @DomName('CustomElementRegistry.define')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _define_2(name, constructor) native;
+
+  @DomName('CustomElementRegistry.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object get(String name) native;
+
+  @DomName('CustomElementRegistry.whenDefined')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future whenDefined(String 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.
+
 // WARNING: Do not edit - generated code.
 
 @DomName('CustomEvent')
@@ -8894,6 +10314,20 @@
     return _detail;
   }
 
+  @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()
   @Experimental() // untriaged
@@ -8909,8 +10343,8 @@
   @JSName('initCustomEvent')
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(
-      String type, bool bubbles, bool cancelable, Object detail) native;
+  void _initCustomEvent(String type,
+      [bool bubbles, bool cancelable, Object detail]) 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
@@ -8944,6 +10378,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('HTMLDataElement')
+@Experimental() // untriaged
+@Native("HTMLDataElement")
+class DataElement extends HtmlElement {
+  // To suppress missing implicit constructor warnings.
+  factory DataElement._() {
+    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.
+   */
+  DataElement.created() : super.created();
+
+  @DomName('HTMLDataElement.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String value;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
 @DomName('HTMLDataListElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -8989,6 +10448,13 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('DataTransfer.DataTransfer')
+  @DocsEditable()
+  factory DataTransfer() {
+    return DataTransfer._create_1();
+  }
+  static DataTransfer _create_1() => JS('DataTransfer', 'new DataTransfer()');
+
   @DomName('DataTransfer.dropEffect')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9061,23 +10527,7 @@
 
   @DomName('DataTransferItem.getAsFile')
   @DocsEditable()
-  Blob getAsFile() native;
-
-  @JSName('getAsString')
-  @DomName('DataTransferItem.getAsString')
-  @DocsEditable()
-  void _getAsString(_StringCallback callback) native;
-
-  @JSName('getAsString')
-  @DomName('DataTransferItem.getAsString')
-  @DocsEditable()
-  Future<String> getAsString() {
-    var completer = new Completer<String>();
-    _getAsString((value) {
-      completer.complete(value);
-    });
-    return completer.future;
-  }
+  File getAsFile() native;
 
   @JSName('webkitGetAsEntry')
   @DomName('DataTransferItem.webkitGetAsEntry')
@@ -9151,6 +10601,24 @@
 // for details. All rights reserved. Use of 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('DecodeErrorCallback')
+@Experimental() // untriaged
+typedef void DecodeErrorCallback(DomException error);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+@DomName('DecodeSuccessCallback')
+@Experimental() // untriaged
+typedef void DecodeSuccessCallback(AudioBuffer decodedData);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('DedicatedWorkerGlobalScope')
 @Experimental() // untriaged
@@ -9183,10 +10651,15 @@
   @Experimental() // untriaged
   static const int TEMPORARY = 0;
 
+  @DomName('DedicatedWorkerGlobalScope.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() native;
+
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(/*any*/ message, [List<MessagePort> transfer]) {
+  void postMessage(/*any*/ message, [List<Object> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, transfer);
@@ -9201,7 +10674,7 @@
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<Object> transfer) native;
   @JSName('postMessage')
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
@@ -9324,6 +10797,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('DeprecationReport')
+@Experimental() // untriaged
+@Native("DeprecationReport")
+class DeprecationReport extends ReportBody {
+  // To suppress missing implicit constructor warnings.
+  factory DeprecationReport._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('DeprecationReport.lineNumber')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int lineNumber;
+
+  @DomName('DeprecationReport.message')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String message;
+
+  @DomName('DeprecationReport.sourceFile')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String sourceFile;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -9357,6 +10859,110 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('DetectedBarcode')
+@Experimental() // untriaged
+@Native("DetectedBarcode")
+class DetectedBarcode extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory DetectedBarcode._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('DetectedBarcode.DetectedBarcode')
+  @DocsEditable()
+  factory DetectedBarcode() {
+    return DetectedBarcode._create_1();
+  }
+  static DetectedBarcode _create_1() =>
+      JS('DetectedBarcode', 'new DetectedBarcode()');
+
+  @DomName('DetectedBarcode.boundingBox')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Rectangle boundingBox;
+
+  @DomName('DetectedBarcode.cornerPoints')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List cornerPoints;
+
+  @DomName('DetectedBarcode.rawValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String rawValue;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('DetectedFace')
+@Experimental() // untriaged
+@Native("DetectedFace")
+class DetectedFace extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory DetectedFace._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('DetectedFace.DetectedFace')
+  @DocsEditable()
+  factory DetectedFace() {
+    return DetectedFace._create_1();
+  }
+  static DetectedFace _create_1() => JS('DetectedFace', 'new DetectedFace()');
+
+  @DomName('DetectedFace.boundingBox')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Rectangle boundingBox;
+
+  @DomName('DetectedFace.landmarks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List landmarks;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('DetectedText')
+@Experimental() // untriaged
+@Native("DetectedText")
+class DetectedText extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory DetectedText._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('DetectedText.DetectedText')
+  @DocsEditable()
+  factory DetectedText() {
+    return DetectedText._create_1();
+  }
+  static DetectedText _create_1() => JS('DetectedText', 'new DetectedText()');
+
+  @DomName('DetectedText.boundingBox')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Rectangle boundingBox;
+
+  @DomName('DetectedText.cornerPoints')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List cornerPoints;
+
+  @DomName('DetectedText.rawValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String rawValue;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('DeviceAcceleration')
 // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
 @Experimental()
@@ -9369,48 +10975,15 @@
 
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  final double x;
+  final num x;
 
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  final double y;
+  final num y;
 
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  final double z;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('DeviceLightEvent')
-@Experimental() // untriaged
-@Native("DeviceLightEvent")
-class DeviceLightEvent extends Event {
-  // 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
-  final double value;
+  final num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -9427,6 +11000,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('DeviceMotionEvent.DeviceMotionEvent')
+  @DocsEditable()
+  factory DeviceMotionEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return DeviceMotionEvent._create_1(type, eventInitDict_1);
+    }
+    return DeviceMotionEvent._create_2(type);
+  }
+  static DeviceMotionEvent _create_1(type, eventInitDict) => JS(
+      'DeviceMotionEvent', 'new DeviceMotionEvent(#,#)', type, eventInitDict);
+  static DeviceMotionEvent _create_2(type) =>
+      JS('DeviceMotionEvent', 'new DeviceMotionEvent(#)', type);
+
   @DomName('DeviceMotionEvent.acceleration')
   @DocsEditable()
   final DeviceAcceleration acceleration;
@@ -9437,73 +11024,59 @@
 
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  final double interval;
+  final num interval;
 
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
   final DeviceRotationRate rotationRate;
-
-  @DomName('DeviceMotionEvent.initDeviceMotionEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void initDeviceMotionEvent(
-      String type,
-      bool bubbles,
-      bool cancelable,
-      DeviceAcceleration acceleration,
-      DeviceAcceleration accelerationIncludingGravity,
-      DeviceRotationRate rotationRate,
-      num interval) native;
 }
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
+@DocsEditable()
 @DomName('DeviceOrientationEvent')
 // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
 @Experimental()
 @Native("DeviceOrientationEvent")
 class DeviceOrientationEvent extends Event {
-  factory DeviceOrientationEvent(String type,
-      {bool canBubble: true,
-      bool cancelable: true,
-      num alpha: 0,
-      num beta: 0,
-      num gamma: 0,
-      bool absolute: false}) {
-    DeviceOrientationEvent e = document._createEvent("DeviceOrientationEvent");
-    e._initDeviceOrientationEvent(
-        type, canBubble, cancelable, alpha, beta, gamma, absolute);
-    return e;
-  }
   // To suppress missing implicit constructor warnings.
   factory DeviceOrientationEvent._() {
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('DeviceOrientationEvent.DeviceOrientationEvent')
+  @DocsEditable()
+  factory DeviceOrientationEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return DeviceOrientationEvent._create_1(type, eventInitDict_1);
+    }
+    return DeviceOrientationEvent._create_2(type);
+  }
+  static DeviceOrientationEvent _create_1(type, eventInitDict) => JS(
+      'DeviceOrientationEvent',
+      'new DeviceOrientationEvent(#,#)',
+      type,
+      eventInitDict);
+  static DeviceOrientationEvent _create_2(type) =>
+      JS('DeviceOrientationEvent', 'new DeviceOrientationEvent(#)', type);
+
   @DomName('DeviceOrientationEvent.absolute')
   @DocsEditable()
   final bool absolute;
 
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  final double alpha;
+  final num alpha;
 
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  final double beta;
+  final num beta;
 
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  final double gamma;
-
-  @JSName('initDeviceOrientationEvent')
-  @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
-  @DocsEditable()
-  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable,
-      num alpha, num beta, num gamma, bool absolute) native;
+  final num gamma;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -9522,15 +11095,15 @@
 
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  final double alpha;
+  final num alpha;
 
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  final double beta;
+  final num beta;
 
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  final double gamma;
+  final num gamma;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -9563,7 +11136,7 @@
 
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close(String returnValue) native;
+  void close([String returnValue]) native;
 
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
@@ -9917,10 +11490,17 @@
   static const EventStreamProvider<Event> selectionChangeEvent =
       const EventStreamProvider<Event>('selectionchange');
 
-  @DomName('Document.activeElement')
+  @DomName('Document.Document')
+  @DocsEditable()
+  factory Document() {
+    return Document._create_1();
+  }
+  static Document _create_1() => JS('Document', 'new Document()');
+
+  @DomName('Document.addressSpace')
   @DocsEditable()
   @Experimental() // untriaged
-  final Element activeElement;
+  final String addressSpace;
 
   @JSName('body')
   @DomName('Document.body')
@@ -9963,16 +11543,6 @@
   @DocsEditable()
   final String domain;
 
-  @DomName('Document.fonts')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final FontFaceSet fonts;
-
-  @DomName('Document.fullscreenElement')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final Element fullscreenElement;
-
   @DomName('Document.fullscreenEnabled')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10002,11 +11572,6 @@
   @Experimental() // untriaged
   final String origin;
 
-  @DomName('Document.pointerLockElement')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final Element pointerLockElement;
-
   @JSName('preferredStylesheetSet')
   @DomName('Document.preferredStylesheetSet')
   @DocsEditable()
@@ -10026,6 +11591,11 @@
   @Experimental() // untriaged
   final SvgSvgElement rootElement;
 
+  @DomName('Document.rootScroller')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element rootScroller;
+
   @DomName('Document.scrollingElement')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10036,13 +11606,6 @@
   @DocsEditable()
   String _selectedStylesheetSet;
 
-  @JSName('styleSheets')
-  @DomName('Document.styleSheets')
-  @DocsEditable()
-  @Returns('_StyleSheetList|Null')
-  @Creates('_StyleSheetList')
-  final List<StyleSheet> _styleSheets;
-
   @DomName('Document.suborigin')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10051,7 +11614,7 @@
   @DomName('Document.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  final AnimationTimeline timeline;
+  final DocumentTimeline timeline;
 
   @JSName('title')
   @DomName('Document.title')
@@ -10118,14 +11681,14 @@
   @JSName('createElement')
   @DomName('Document.createElement')
   @DocsEditable()
-  Element _createElement(String localName_OR_tagName, [String typeExtension])
-      native;
+  Element _createElement(String localName_OR_tagName,
+      [options_OR_typeExtension]) native;
 
   @JSName('createElementNS')
   @DomName('Document.createElementNS')
   @DocsEditable()
   Element _createElementNS(String namespaceURI, String qualifiedName,
-      [String typeExtension]) native;
+      [options_OR_typeExtension]) native;
 
   @JSName('createEvent')
   @DomName('Document.createEvent')
@@ -10145,21 +11708,32 @@
   @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 radiusX,
-      num radiusY,
-      num rotationAngle,
-      num force) {
+  Touch _createTouch(Window view, EventTarget target, int identifier, num pageX,
+      num pageY, num screenX, num screenY,
+      [num radiusX, num radiusY, num rotationAngle, num force]) {
+    if (force != null) {
+      var target_1 = _convertDartToNative_EventTarget(target);
+      return _createTouch_1(view, target_1, identifier, pageX, pageY, screenX,
+          screenY, radiusX, radiusY, rotationAngle, force);
+    }
+    if (rotationAngle != null) {
+      var target_1 = _convertDartToNative_EventTarget(target);
+      return _createTouch_2(view, target_1, identifier, pageX, pageY, screenX,
+          screenY, radiusX, radiusY, rotationAngle);
+    }
+    if (radiusY != null) {
+      var target_1 = _convertDartToNative_EventTarget(target);
+      return _createTouch_3(view, target_1, identifier, pageX, pageY, screenX,
+          screenY, radiusX, radiusY);
+    }
+    if (radiusX != null) {
+      var target_1 = _convertDartToNative_EventTarget(target);
+      return _createTouch_4(
+          view, target_1, identifier, pageX, pageY, screenX, screenY, radiusX);
+    }
     var target_1 = _convertDartToNative_EventTarget(target);
-    return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX,
-        screenY, radiusX, radiusY, rotationAngle, force);
+    return _createTouch_5(
+        view, target_1, identifier, pageX, pageY, screenX, screenY);
   }
 
   @JSName('createTouch')
@@ -10167,8 +11741,36 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch_1(Window window, target, identifier, pageX, pageY, screenX,
+  Touch _createTouch_1(Window view, target, identifier, pageX, pageY, screenX,
       screenY, radiusX, radiusY, rotationAngle, force) native;
+  @JSName('createTouch')
+  @DomName('Document.createTouch')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  Touch _createTouch_2(Window view, target, identifier, pageX, pageY, screenX,
+      screenY, radiusX, radiusY, rotationAngle) native;
+  @JSName('createTouch')
+  @DomName('Document.createTouch')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  Touch _createTouch_3(Window view, target, identifier, pageX, pageY, screenX,
+      screenY, radiusX, radiusY) native;
+  @JSName('createTouch')
+  @DomName('Document.createTouch')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  Touch _createTouch_4(Window view, target, identifier, pageX, pageY, screenX,
+      screenY, radiusX) native;
+  @JSName('createTouch')
+  @DomName('Document.createTouch')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  Touch _createTouch_5(
+      Window view, target, identifier, pageX, pageY, screenX, screenY) native;
 
   @JSName('createTouchList')
   @DomName('Document.createTouchList')
@@ -10177,16 +11779,6 @@
   @Experimental()
   TouchList _createTouchList(Touch touches) native;
 
-  @JSName('elementFromPoint')
-  @DomName('Document.elementFromPoint')
-  @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 commandId, [bool showUI, String value]) native;
@@ -10201,6 +11793,11 @@
   @Experimental() // untriaged
   void exitPointerLock() native;
 
+  @DomName('Document.getAnimations')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Animation> getAnimations() native;
+
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
@@ -10243,10 +11840,27 @@
   @DocsEditable()
   String queryCommandValue(String commandId) native;
 
-  @DomName('Document.transformDocumentToTreeView')
+  @DomName('Document.registerElement')
   @DocsEditable()
   @Experimental() // untriaged
-  void transformDocumentToTreeView(String noStyleMessage) native;
+  Function registerElement2(String type, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _registerElement2_1(type, options_1);
+    }
+    return _registerElement2_2(type);
+  }
+
+  @JSName('registerElement')
+  @DomName('Document.registerElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Function _registerElement2_1(type, options) native;
+  @JSName('registerElement')
+  @DomName('Document.registerElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Function _registerElement2_2(type) native;
 
   @JSName('webkitExitFullscreen')
   @DomName('Document.webkitExitFullscreen')
@@ -10263,6 +11877,47 @@
   @DocsEditable()
   Element getElementById(String elementId) native;
 
+  // From DocumentOrShadowRoot
+
+  @DomName('Document.activeElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element activeElement;
+
+  @DomName('Document.fullscreenElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element fullscreenElement;
+
+  @DomName('Document.pointerLockElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element pointerLockElement;
+
+  @JSName('styleSheets')
+  @DomName('Document.styleSheets')
+  @DocsEditable()
+  @Returns('_StyleSheetList|Null')
+  @Creates('_StyleSheetList')
+  final List<StyleSheet> _styleSheets;
+
+  @JSName('elementFromPoint')
+  @DomName('Document.elementFromPoint')
+  @DocsEditable()
+  Element _elementFromPoint(int x, int y) native;
+
+  @DomName('Document.elementsFromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Element> elementsFromPoint(int x, int y) native;
+
+  // From FontFaceSource
+
+  @DomName('Document.fonts')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final FontFaceSet fonts;
+
   // From ParentNode
 
   @JSName('childElementCount')
@@ -10748,6 +12403,12 @@
   @deprecated
   bool get supportsRegister => supportsRegisterElement;
 
+  void registerElement(String tag, Type customElementClass,
+      {String extendsTag}) {
+    registerElement2(
+        tag, {'prototype': customElementClass, 'extends': extendsTag});
+  }
+
   @DomName('Document.createElement')
   @ForceInline() // Almost all call sites have one argument.
   Element createElement(String tagName, [String typeExtension]) {
@@ -10974,6 +12635,85 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('DocumentOrShadowRoot')
+@Experimental() // untriaged
+@Native("DocumentOrShadowRoot")
+class DocumentOrShadowRoot extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory DocumentOrShadowRoot._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('DocumentOrShadowRoot.activeElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element activeElement;
+
+  @DomName('DocumentOrShadowRoot.fullscreenElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element fullscreenElement;
+
+  @DomName('DocumentOrShadowRoot.pointerLockElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element pointerLockElement;
+
+  @DomName('DocumentOrShadowRoot.styleSheets')
+  @DocsEditable()
+  @Experimental() // untriaged
+  @Returns('_StyleSheetList|Null')
+  @Creates('_StyleSheetList')
+  final List<StyleSheet> styleSheets;
+
+  @DomName('DocumentOrShadowRoot.elementFromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element elementFromPoint(int x, int y) native;
+
+  @DomName('DocumentOrShadowRoot.elementsFromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Element> elementsFromPoint(int x, int y) native;
+
+  @DomName('DocumentOrShadowRoot.getSelection')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Selection getSelection() 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('DocumentTimeline')
+@Experimental() // untriaged
+@Native("DocumentTimeline")
+class DocumentTimeline extends AnimationTimeline {
+  // To suppress missing implicit constructor warnings.
+  factory DocumentTimeline._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('DocumentTimeline.DocumentTimeline')
+  @DocsEditable()
+  factory DocumentTimeline([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return DocumentTimeline._create_1(options_1);
+    }
+    return DocumentTimeline._create_2();
+  }
+  static DocumentTimeline _create_1(options) =>
+      JS('DocumentTimeline', 'new DocumentTimeline(#)', options);
+  static DocumentTimeline _create_2() =>
+      JS('DocumentTimeline', 'new DocumentTimeline()');
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('DOMError')
 @Native("DOMError")
 class DomError extends Interceptor {
@@ -11085,7 +12825,7 @@
   @JSName('createHTMLDocument')
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
-  HtmlDocument createHtmlDocument(String title) native;
+  HtmlDocument createHtmlDocument([String title]) native;
 
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
@@ -11126,18 +12866,14 @@
 
   @DomName('DOMMatrix.DOMMatrix')
   @DocsEditable()
-  factory DomMatrix([DomMatrixReadOnly other]) {
-    if (other == null) {
-      return DomMatrix._create_1();
+  factory DomMatrix([Object init]) {
+    if (init != null) {
+      return DomMatrix._create_1(init);
     }
-    if ((other is DomMatrixReadOnly)) {
-      return DomMatrix._create_2(other);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return DomMatrix._create_2();
   }
-  static DomMatrix _create_1() => JS('DomMatrix', 'new DOMMatrix()');
-  static DomMatrix _create_2(other) =>
-      JS('DomMatrix', 'new DOMMatrix(#)', other);
+  static DomMatrix _create_1(init) => JS('DomMatrix', 'new DOMMatrix(#)', init);
+  static DomMatrix _create_2() => JS('DomMatrix', 'new DOMMatrix()');
 
   // Shadowing definition.
   num get a => JS("num", "#.a", this);
@@ -11293,37 +13029,138 @@
     JS("void", "#.m44 = #", this, value);
   }
 
+  @DomName('DOMMatrix.fromFloat32Array')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrix fromFloat32Array(Float32List array32) native;
+
+  @DomName('DOMMatrix.fromFloat64Array')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrix fromFloat64Array(Float64List array64) native;
+
+  @DomName('DOMMatrix.fromMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrix fromMatrix([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _fromMatrix_1(other_1);
+    }
+    return _fromMatrix_2();
+  }
+
+  @JSName('fromMatrix')
+  @DomName('DOMMatrix.fromMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrix _fromMatrix_1(other) native;
+  @JSName('fromMatrix')
+  @DomName('DOMMatrix.fromMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrix _fromMatrix_2() native;
+
+  @DomName('DOMMatrix.invertSelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix invertSelf() native;
+
   @DomName('DOMMatrix.multiplySelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix multiplySelf(DomMatrix other) native;
+  DomMatrix multiplySelf([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _multiplySelf_1(other_1);
+    }
+    return _multiplySelf_2();
+  }
+
+  @JSName('multiplySelf')
+  @DomName('DOMMatrix.multiplySelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix _multiplySelf_1(other) native;
+  @JSName('multiplySelf')
+  @DomName('DOMMatrix.multiplySelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix _multiplySelf_2() native;
 
   @DomName('DOMMatrix.preMultiplySelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix preMultiplySelf(DomMatrix other) native;
+  DomMatrix preMultiplySelf([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _preMultiplySelf_1(other_1);
+    }
+    return _preMultiplySelf_2();
+  }
+
+  @JSName('preMultiplySelf')
+  @DomName('DOMMatrix.preMultiplySelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix _preMultiplySelf_1(other) native;
+  @JSName('preMultiplySelf')
+  @DomName('DOMMatrix.preMultiplySelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix _preMultiplySelf_2() native;
+
+  @DomName('DOMMatrix.rotateAxisAngleSelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix rotateAxisAngleSelf([num x, num y, num z, num angle]) native;
+
+  @DomName('DOMMatrix.rotateFromVectorSelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix rotateFromVectorSelf([num x, num y]) native;
+
+  @DomName('DOMMatrix.rotateSelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix rotateSelf([num rotX, num rotY, num rotZ]) native;
 
   @DomName('DOMMatrix.scale3dSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale3dSelf(num scale, [num originX, num originY, num originZ])
+  DomMatrix scale3dSelf([num scale, num originX, num originY, num originZ])
       native;
 
-  @DomName('DOMMatrix.scaleNonUniformSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
-  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 originX, num originY]) native;
+  DomMatrix scaleSelf(
+      [num scaleX,
+      num scaleY,
+      num scaleZ,
+      num originX,
+      num originY,
+      num originZ]) native;
+
+  @DomName('DOMMatrix.setMatrixValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix setMatrixValue(String transformList) native;
+
+  @DomName('DOMMatrix.skewXSelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix skewXSelf([num sx]) native;
+
+  @DomName('DOMMatrix.skewYSelf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix skewYSelf([num sy]) native;
 
   @DomName('DOMMatrix.translateSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix translateSelf(num tx, num ty, [num tz]) native;
+  DomMatrix translateSelf([num tx, num ty, num tz]) 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
@@ -11339,6 +13176,19 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('DOMMatrixReadOnly.DOMMatrixReadOnly')
+  @DocsEditable()
+  factory DomMatrixReadOnly([Object init]) {
+    if (init != null) {
+      return DomMatrixReadOnly._create_1(init);
+    }
+    return DomMatrixReadOnly._create_2();
+  }
+  static DomMatrixReadOnly _create_1(init) =>
+      JS('DomMatrixReadOnly', 'new DOMMatrixReadOnly(#)', init);
+  static DomMatrixReadOnly _create_2() =>
+      JS('DomMatrixReadOnly', 'new DOMMatrixReadOnly()');
+
   num get a => JS("num", "#.a", this);
 
   num get b => JS("num", "#.b", this);
@@ -11387,26 +13237,115 @@
 
   num get m44 => JS("num", "#.m44", this);
 
+  @DomName('DOMMatrixReadOnly.flipX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix flipX() native;
+
+  @DomName('DOMMatrixReadOnly.flipY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix flipY() native;
+
+  @DomName('DOMMatrixReadOnly.fromFloat32Array')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrixReadOnly fromFloat32Array(Float32List array32) native;
+
+  @DomName('DOMMatrixReadOnly.fromFloat64Array')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrixReadOnly fromFloat64Array(Float64List array64) native;
+
+  @DomName('DOMMatrixReadOnly.fromMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrixReadOnly fromMatrix([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _fromMatrix_1(other_1);
+    }
+    return _fromMatrix_2();
+  }
+
+  @JSName('fromMatrix')
+  @DomName('DOMMatrixReadOnly.fromMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrixReadOnly _fromMatrix_1(other) native;
+  @JSName('fromMatrix')
+  @DomName('DOMMatrixReadOnly.fromMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomMatrixReadOnly _fromMatrix_2() native;
+
+  @DomName('DOMMatrixReadOnly.inverse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix inverse() native;
+
   @DomName('DOMMatrixReadOnly.multiply')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix multiply(DomMatrix other) native;
+  DomMatrix multiply([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _multiply_1(other_1);
+    }
+    return _multiply_2();
+  }
+
+  @JSName('multiply')
+  @DomName('DOMMatrixReadOnly.multiply')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix _multiply_1(other) native;
+  @JSName('multiply')
+  @DomName('DOMMatrixReadOnly.multiply')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix _multiply_2() native;
+
+  @DomName('DOMMatrixReadOnly.rotate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix rotate([num rotX, num rotY, num rotZ]) native;
+
+  @DomName('DOMMatrixReadOnly.rotateAxisAngle')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix rotateAxisAngle([num x, num y, num z, num angle]) native;
+
+  @DomName('DOMMatrixReadOnly.rotateFromVector')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix rotateFromVector([num x, num y]) native;
 
   @DomName('DOMMatrixReadOnly.scale')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale(num scale, [num originX, num originY]) native;
+  DomMatrix scale(
+      [num scaleX,
+      num scaleY,
+      num scaleZ,
+      num originX,
+      num originY,
+      num originZ]) native;
 
   @DomName('DOMMatrixReadOnly.scale3d')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale3d(num scale, [num originX, num originY, num originZ]) native;
+  DomMatrix scale3d([num scale, num originX, num originY, num originZ]) native;
 
-  @DomName('DOMMatrixReadOnly.scaleNonUniform')
+  @DomName('DOMMatrixReadOnly.skewX')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scaleNonUniform(num scaleX,
-      [num scaleY, num scaleZn, num originX, num originY, num originZ]) native;
+  DomMatrix skewX([num sx]) native;
+
+  @DomName('DOMMatrixReadOnly.skewY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomMatrix skewY([num sy]) native;
 
   @DomName('DOMMatrixReadOnly.toFloat32Array')
   @DocsEditable()
@@ -11418,10 +13357,32 @@
   @Experimental() // untriaged
   Float64List toFloat64Array() native;
 
+  @DomName('DOMMatrixReadOnly.transformPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint transformPoint([Map point]) {
+    if (point != null) {
+      var point_1 = convertDartToNative_Dictionary(point);
+      return _transformPoint_1(point_1);
+    }
+    return _transformPoint_2();
+  }
+
+  @JSName('transformPoint')
+  @DomName('DOMMatrixReadOnly.transformPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint _transformPoint_1(point) native;
+  @JSName('transformPoint')
+  @DomName('DOMMatrixReadOnly.transformPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint _transformPoint_2() native;
+
   @DomName('DOMMatrixReadOnly.translate')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix translate(num tx, num ty, [num tz]) native;
+  DomMatrix translate([num tx, num ty, num tz]) 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
@@ -11463,51 +13424,28 @@
 
   @DomName('DOMPoint.DOMPoint')
   @DocsEditable()
-  factory DomPoint([point_OR_x, num y, num z, num w]) {
-    if ((point_OR_x is Map) && y == null && z == null && w == null) {
-      var point_1 = convertDartToNative_Dictionary(point_OR_x);
-      return DomPoint._create_1(point_1);
+  factory DomPoint([num x, num y, num z, num w]) {
+    if (w != null) {
+      return DomPoint._create_1(x, y, z, w);
     }
-    if (point_OR_x == null && y == null && z == null && w == null) {
-      return DomPoint._create_2();
+    if (z != null) {
+      return DomPoint._create_2(x, y, z);
     }
-    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 != null) {
+      return DomPoint._create_3(x, y);
     }
-    if ((y is num || y == null) &&
-        (point_OR_x is num || point_OR_x == null) &&
-        z == null &&
-        w == null) {
-      return DomPoint._create_4(point_OR_x, y);
+    if (x != null) {
+      return DomPoint._create_4(x);
     }
-    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_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_6(point_OR_x, y, z, w);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return DomPoint._create_5();
   }
-  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);
+  static DomPoint _create_1(x, y, z, w) =>
+      JS('DomPoint', 'new DOMPoint(#,#,#,#)', x, y, z, w);
+  static DomPoint _create_2(x, y, z) =>
+      JS('DomPoint', 'new DOMPoint(#,#,#)', x, y, z);
+  static DomPoint _create_3(x, y) => JS('DomPoint', 'new DOMPoint(#,#)', x, y);
+  static DomPoint _create_4(x) => JS('DomPoint', 'new DOMPoint(#)', x);
+  static DomPoint _create_5() => JS('DomPoint', 'new DOMPoint()');
 
   /// Checks if this type is supported on the current platform.
   static bool get supported =>
@@ -11540,6 +13478,28 @@
   set z(num value) {
     JS("void", "#.z = #", this, value);
   }
+
+  @DomName('DOMPoint.fromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomPoint fromPoint([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _fromPoint_1(other_1);
+    }
+    return _fromPoint_2();
+  }
+
+  @JSName('fromPoint')
+  @DomName('DOMPoint.fromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomPoint _fromPoint_1(other) native;
+  @JSName('fromPoint')
+  @DomName('DOMPoint.fromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomPoint _fromPoint_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
@@ -11557,11 +13517,31 @@
 
   @DomName('DOMPointReadOnly.DOMPointReadOnly')
   @DocsEditable()
-  factory DomPointReadOnly(num x, num y, num z, num w) {
-    return DomPointReadOnly._create_1(x, y, z, w);
+  factory DomPointReadOnly([num x, num y, num z, num w]) {
+    if (w != null) {
+      return DomPointReadOnly._create_1(x, y, z, w);
+    }
+    if (z != null) {
+      return DomPointReadOnly._create_2(x, y, z);
+    }
+    if (y != null) {
+      return DomPointReadOnly._create_3(x, y);
+    }
+    if (x != null) {
+      return DomPointReadOnly._create_4(x);
+    }
+    return DomPointReadOnly._create_5();
   }
   static DomPointReadOnly _create_1(x, y, z, w) =>
       JS('DomPointReadOnly', 'new DOMPointReadOnly(#,#,#,#)', x, y, z, w);
+  static DomPointReadOnly _create_2(x, y, z) =>
+      JS('DomPointReadOnly', 'new DOMPointReadOnly(#,#,#)', x, y, z);
+  static DomPointReadOnly _create_3(x, y) =>
+      JS('DomPointReadOnly', 'new DOMPointReadOnly(#,#)', x, y);
+  static DomPointReadOnly _create_4(x) =>
+      JS('DomPointReadOnly', 'new DOMPointReadOnly(#)', x);
+  static DomPointReadOnly _create_5() =>
+      JS('DomPointReadOnly', 'new DOMPointReadOnly()');
 
   num get w => JS("num", "#.w", this);
 
@@ -11570,6 +13550,237 @@
   num get y => JS("num", "#.y", this);
 
   num get z => JS("num", "#.z", this);
+
+  @DomName('DOMPointReadOnly.fromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomPointReadOnly fromPoint([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _fromPoint_1(other_1);
+    }
+    return _fromPoint_2();
+  }
+
+  @JSName('fromPoint')
+  @DomName('DOMPointReadOnly.fromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomPointReadOnly _fromPoint_1(other) native;
+  @JSName('fromPoint')
+  @DomName('DOMPointReadOnly.fromPoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomPointReadOnly _fromPoint_2() native;
+
+  @DomName('DOMPointReadOnly.matrixTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint matrixTransform([Map matrix]) {
+    if (matrix != null) {
+      var matrix_1 = convertDartToNative_Dictionary(matrix);
+      return _matrixTransform_1(matrix_1);
+    }
+    return _matrixTransform_2();
+  }
+
+  @JSName('matrixTransform')
+  @DomName('DOMPointReadOnly.matrixTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint _matrixTransform_1(matrix) native;
+  @JSName('matrixTransform')
+  @DomName('DOMPointReadOnly.matrixTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DomPoint _matrixTransform_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('DOMQuad')
+@Experimental() // untriaged
+@Native("DOMQuad")
+class DomQuad extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory DomQuad._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('DOMQuad.DOMQuad')
+  @DocsEditable()
+  factory DomQuad([Map p1, Map p2, Map p3, Map p4]) {
+    if (p4 != null) {
+      var p1_1 = convertDartToNative_Dictionary(p1);
+      var p2_2 = convertDartToNative_Dictionary(p2);
+      var p3_3 = convertDartToNative_Dictionary(p3);
+      var p4_4 = convertDartToNative_Dictionary(p4);
+      return DomQuad._create_1(p1_1, p2_2, p3_3, p4_4);
+    }
+    if (p3 != null) {
+      var p1_1 = convertDartToNative_Dictionary(p1);
+      var p2_2 = convertDartToNative_Dictionary(p2);
+      var p3_3 = convertDartToNative_Dictionary(p3);
+      return DomQuad._create_2(p1_1, p2_2, p3_3);
+    }
+    if (p2 != null) {
+      var p1_1 = convertDartToNative_Dictionary(p1);
+      var p2_2 = convertDartToNative_Dictionary(p2);
+      return DomQuad._create_3(p1_1, p2_2);
+    }
+    if (p1 != null) {
+      var p1_1 = convertDartToNative_Dictionary(p1);
+      return DomQuad._create_4(p1_1);
+    }
+    return DomQuad._create_5();
+  }
+  static DomQuad _create_1(p1, p2, p3, p4) =>
+      JS('DomQuad', 'new DOMQuad(#,#,#,#)', p1, p2, p3, p4);
+  static DomQuad _create_2(p1, p2, p3) =>
+      JS('DomQuad', 'new DOMQuad(#,#,#)', p1, p2, p3);
+  static DomQuad _create_3(p1, p2) => JS('DomQuad', 'new DOMQuad(#,#)', p1, p2);
+  static DomQuad _create_4(p1) => JS('DomQuad', 'new DOMQuad(#)', p1);
+  static DomQuad _create_5() => JS('DomQuad', 'new DOMQuad()');
+
+  @DomName('DOMQuad.p1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint p1;
+
+  @DomName('DOMQuad.p2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint p2;
+
+  @DomName('DOMQuad.p3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint p3;
+
+  @DomName('DOMQuad.p4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomPoint p4;
+
+  @DomName('DOMQuad.fromQuad')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomQuad fromQuad([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _fromQuad_1(other_1);
+    }
+    return _fromQuad_2();
+  }
+
+  @JSName('fromQuad')
+  @DomName('DOMQuad.fromQuad')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomQuad _fromQuad_1(other) native;
+  @JSName('fromQuad')
+  @DomName('DOMQuad.fromQuad')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomQuad _fromQuad_2() native;
+
+  @DomName('DOMQuad.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomQuad fromRect([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _fromRect_1(other_1);
+    }
+    return _fromRect_2();
+  }
+
+  @JSName('fromRect')
+  @DomName('DOMQuad.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomQuad _fromRect_1(other) native;
+  @JSName('fromRect')
+  @DomName('DOMQuad.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomQuad _fromRect_2() native;
+
+  @DomName('DOMQuad.getBounds')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Rectangle getBounds() 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('DOMRectList')
+@Experimental() // untriaged
+@Native("ClientRectList,DOMRectList")
+class DomRectList extends Interceptor
+    with ListMixin<Rectangle>, ImmutableListMixin<Rectangle>
+    implements List<Rectangle>, JavaScriptIndexingBehavior<Rectangle> {
+  // To suppress missing implicit constructor warnings.
+  factory DomRectList._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('DOMRectList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => JS("int", "#.length", this);
+
+  Rectangle operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
+      throw new RangeError.index(index, this);
+    return JS("Rectangle", "#[#]", this, index);
+  }
+
+  void operator []=(int index, Rectangle value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Rectangle> mixins.
+  // Rectangle is the element type.
+
+  set length(int value) {
+    throw new UnsupportedError("Cannot resize immutable List.");
+  }
+
+  Rectangle get first {
+    if (this.length > 0) {
+      return JS('Rectangle', '#[0]', this);
+    }
+    throw new StateError("No elements");
+  }
+
+  Rectangle get last {
+    int len = this.length;
+    if (len > 0) {
+      return JS('Rectangle', '#[#]', this, len - 1);
+    }
+    throw new StateError("No elements");
+  }
+
+  Rectangle get single {
+    int len = this.length;
+    if (len == 1) {
+      return JS('Rectangle', '#[0]', this);
+    }
+    if (len == 0) throw new StateError("No elements");
+    throw new StateError("More than one element");
+  }
+
+  Rectangle elementAt(int index) => this[index];
+  // -- end List<Rectangle> mixins.
+
+  @DomName('DOMRectList.item')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Rectangle item(int index) 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
@@ -11676,11 +13887,31 @@
 
   @DomName('DOMRectReadOnly.DOMRectReadOnly')
   @DocsEditable()
-  factory DomRectReadOnly(num x, num y, num width, num height) {
-    return DomRectReadOnly._create_1(x, y, width, height);
+  factory DomRectReadOnly([num x, num y, num width, num height]) {
+    if (height != null) {
+      return DomRectReadOnly._create_1(x, y, width, height);
+    }
+    if (width != null) {
+      return DomRectReadOnly._create_2(x, y, width);
+    }
+    if (y != null) {
+      return DomRectReadOnly._create_3(x, y);
+    }
+    if (x != null) {
+      return DomRectReadOnly._create_4(x);
+    }
+    return DomRectReadOnly._create_5();
   }
   static DomRectReadOnly _create_1(x, y, width, height) => JS(
       'DomRectReadOnly', 'new DOMRectReadOnly(#,#,#,#)', x, y, width, height);
+  static DomRectReadOnly _create_2(x, y, width) =>
+      JS('DomRectReadOnly', 'new DOMRectReadOnly(#,#,#)', x, y, width);
+  static DomRectReadOnly _create_3(x, y) =>
+      JS('DomRectReadOnly', 'new DOMRectReadOnly(#,#)', x, y);
+  static DomRectReadOnly _create_4(x) =>
+      JS('DomRectReadOnly', 'new DOMRectReadOnly(#)', x);
+  static DomRectReadOnly _create_5() =>
+      JS('DomRectReadOnly', 'new DOMRectReadOnly()');
 
   num get bottom => JS("num", "#.bottom", this);
 
@@ -11697,6 +13928,28 @@
   num get x => JS("num", "#.x", this);
 
   num get y => JS("num", "#.y", this);
+
+  @DomName('DOMRectReadOnly.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomRectReadOnly fromRect([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _fromRect_1(other_1);
+    }
+    return _fromRect_2();
+  }
+
+  @JSName('fromRect')
+  @DomName('DOMRectReadOnly.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomRectReadOnly _fromRect_1(other) native;
+  @JSName('fromRect')
+  @DomName('DOMRectReadOnly.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static DomRectReadOnly _fromRect_2() native;
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11761,11 +14014,6 @@
   String elementAt(int index) => this[index];
   // -- end List<String> mixins.
 
-  @DomName('DOMStringList.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String __getter__(int index) native;
-
   @DomName('DOMStringList.item')
   @DocsEditable()
   String item(int index) native;
@@ -11785,15 +14033,11 @@
 
   @DomName('DOMStringMap.__delete__')
   @DocsEditable()
-  void __delete__(index_OR_name) native;
-
-  @DomName('DOMStringMap.__getter__')
-  @DocsEditable()
-  String __getter__(int index) native;
+  void __delete__(String name) native;
 
   @DomName('DOMStringMap.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, String value) native;
+  void __setter__(String name, String value) native;
 
   @DomName('DOMStringMap.item')
   @DocsEditable()
@@ -11840,6 +14084,11 @@
   @Experimental() // untriaged
   void remove(String tokens) native;
 
+  @DomName('DOMTokenList.replace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void replace(String token, String newToken) native;
+
   @DomName('DOMTokenList.supports')
   @DocsEditable()
   @Experimental() // untriaged
@@ -11853,20 +14102,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.
 
-@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.
@@ -12581,6 +14816,11 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenError;
+
+  @DomName('Element.onwheel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<WheelEvent> get onWheel;
 }
 
 // Wrapper over an immutable NodeList to make it implement ElementList.
@@ -13169,6 +15409,12 @@
   @Experimental()
   ElementStream<Event> get onFullscreenError =>
       Element.fullscreenErrorEvent._forElementList(this);
+
+  @DomName('Element.onwheel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<WheelEvent> get onWheel =>
+      Element.wheelEvent._forElementList(this);
 }
 
 @DocsEditable()
@@ -13638,6 +15884,24 @@
   @deprecated
   void enteredView() {}
 
+  @DomName('Element.getClientRects')
+  @DocsEditable()
+  @Returns('DomRectList|Null')
+  @Creates('DomRectList')
+  List<Rectangle> getClientRects() {
+    var value = _getClientRects();
+
+    // If no prototype we need one for the world to hookup to the proper Dart class.
+    var jsProto = JS('', '#.prototype', value);
+    if (jsProto == null) {
+      JS('', '#.prototype = Object.create(null)', value);
+    }
+
+    applyExtension('DOMRectList', value);
+
+    return value;
+  }
+
   /** *Deprecated*: override [detached] instead. */
   @Experimental()
   @deprecated
@@ -15120,15 +17384,16 @@
   static const EventStreamProvider<Event> fullscreenErrorEvent =
       const EventStreamProvider<Event>('webkitfullscreenerror');
 
+  @DomName('Element.wheelEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<WheelEvent> wheelEvent =
+      const EventStreamProvider<WheelEvent>('wheel');
+
   @DomName('Element.contentEditable')
   @DocsEditable()
   String contentEditable;
 
-  @DomName('Element.contextMenu')
-  @DocsEditable()
-  @Experimental() // untriaged
-  MenuElement contextMenu;
-
   @DomName('Element.dir')
   @DocsEditable()
   String dir;
@@ -15163,6 +17428,16 @@
   @DocsEditable()
   bool hidden;
 
+  @DomName('Element.inert')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool inert;
+
+  @DomName('Element.inputMode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String inputMode;
+
   // Using property as subclass shadows.
   bool get isContentEditable => JS("bool", "#.isContentEditable", this);
 
@@ -15204,29 +17479,6 @@
   @Experimental()
   bool translate;
 
-  @JSName('webkitdropzone')
-  /**
-   * A set of space-separated keywords that specify what kind of data this
-   * Element accepts on drop and what to do with that data.
-   *
-   * ## Other resources
-   *
-   * * [Drag and drop
-   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)
-   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
-   *   from HTML5Rocks.
-   * * [Drag and drop
-   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
-   *   from WHATWG.
-   */
-  @DomName('Element.webkitdropzone')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  String dropzone;
-
   @DomName('Element.blur')
   @DocsEditable()
   void blur() native;
@@ -15239,6 +17491,11 @@
   @DocsEditable()
   void focus() native;
 
+  @DomName('Element.accessibleNode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AccessibleNode accessibleNode;
+
   @DomName('Element.assignedSlot')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15328,6 +17585,11 @@
   @Experimental() // untriaged
   String slot;
 
+  @DomName('Element.styleMap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final StylePropertyMap styleMap;
+
   @DomName('Element.tagName')
   @DocsEditable()
   final String tagName;
@@ -15367,6 +17629,11 @@
   @Experimental() // untriaged
   String getAttributeNS(String namespaceURI, String localName) native;
 
+  @DomName('Element.getAttributeNames')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> getAttributeNames() native;
+
   /**
    * Returns the smallest bounding rectangle that encompasses this element's
    * padding, scrollbar, and border.
@@ -15381,10 +17648,11 @@
    */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
-  @Creates('_ClientRect')
-  @Returns('_ClientRect|Null')
+  @Creates('_DomRect')
+  @Returns('_DomRect|Null')
   Rectangle getBoundingClientRect() native;
 
+  @JSName('getClientRects')
   /**
    * Returns a list of bounding rectangles for each box associated with this
    * element.
@@ -15399,9 +17667,9 @@
    */
   @DomName('Element.getClientRects')
   @DocsEditable()
-  @Returns('_ClientRectList|Null')
-  @Creates('_ClientRectList')
-  List<Rectangle> getClientRects() native;
+  @Returns('DomRectList|Null')
+  @Creates('DomRectList')
+  List<Rectangle> _getClientRects() native;
 
   /**
    * Returns a list of shadow DOM insertion points to which this element is
@@ -15452,6 +17720,16 @@
   @DocsEditable()
   bool _hasAttributeNS(String namespaceURI, String localName) native;
 
+  @DomName('Element.hasPointerCapture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool hasPointerCapture(int pointerId) native;
+
+  @DomName('Element.releasePointerCapture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void releasePointerCapture(int pointerId) native;
+
   @JSName('removeAttribute')
   @DomName('Element.removeAttribute')
   @DocsEditable()
@@ -15547,7 +17825,7 @@
   @JSName('scrollIntoView')
   @DomName('Element.scrollIntoView')
   @DocsEditable()
-  void _scrollIntoView([bool alignWithTop]) native;
+  void _scrollIntoView([Object arg]) native;
 
   @JSName('scrollIntoViewIfNeeded')
   @DomName('Element.scrollIntoViewIfNeeded')
@@ -15612,8 +17890,23 @@
   void setDistributeScroll(ScrollStateCallback scrollStateCallback,
       String nativeScrollBehavior) native;
 
+  @DomName('Element.setPointerCapture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setPointerCapture(int pointerId) 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')
@@ -16154,6 +18447,11 @@
   @Experimental()
   ElementStream<Event> get onFullscreenError =>
       fullscreenErrorEvent.forElement(this);
+
+  @DomName('Element.onwheel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<WheelEvent> get onWheel => wheelEvent.forElement(this);
 }
 
 class _ElementFactoryProvider {
@@ -16243,11 +18541,11 @@
 
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) native;
+  Node __getter__(String name) native;
 
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) native;
+  void __setter__(String name, Node 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
@@ -16418,7 +18716,7 @@
 @DomName('ErrorCallback')
 // http://www.w3.org/TR/file-system-api/#the-errorcallback-interface
 @Experimental()
-typedef void _ErrorCallback(FileError error);
+typedef void _ErrorCallback(DomException error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -16528,6 +18826,12 @@
     throw new StateError('No selector matched for populating matchedTarget.');
   }
 
+  @DomName('Event.path')
+  @DocsEditable()
+  @Experimental()
+  List<EventTarget> get path =>
+      JS('bool', '!!#.composedPath', this) ? composedPath() : [];
+
   @DomName('Event.Event')
   @DocsEditable()
   factory Event._(String type, [Map eventInitDict]) {
@@ -16586,6 +18890,11 @@
   @DocsEditable()
   final bool cancelable;
 
+  @DomName('Event.composed')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool composed;
+
   @DomName('Event.currentTarget')
   @DocsEditable()
   EventTarget get currentTarget =>
@@ -16610,26 +18919,6 @@
   @Experimental() // untriaged
   final bool isTrusted;
 
-  /**
-   * This event's path, taking into account shadow DOM.
-   *
-   * ## Other resources
-   *
-   * * [Shadow DOM extensions to
-   *   Event](http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event)
-   *   from W3C.
-   */
-  @DomName('Event.path')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
-  @Experimental()
-  final List<EventTarget> path;
-
-  @DomName('Event.scoped')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final bool scoped;
-
   @DomName('Event.target')
   @DocsEditable()
   EventTarget get target => _convertNativeToDart_EventTarget(this._get_target);
@@ -16642,21 +18931,21 @@
 
   @DomName('Event.timeStamp')
   @DocsEditable()
-  final double timeStamp;
+  final num timeStamp;
 
   @DomName('Event.type')
   @DocsEditable()
   final String type;
 
-  @DomName('Event.deepPath')
+  @DomName('Event.composedPath')
   @DocsEditable()
   @Experimental() // untriaged
-  List<EventTarget> deepPath() native;
+  List<EventTarget> composedPath() native;
 
   @JSName('initEvent')
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String type, bool bubbles, bool cancelable) native;
+  void _initEvent(String type, [bool bubbles, bool cancelable]) native;
 
   @DomName('Event.preventDefault')
   @DocsEditable()
@@ -17005,10 +19294,67 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('External')
+@Experimental() // untriaged
+@Native("External")
+class External extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory External._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('External.AddSearchProvider')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void AddSearchProvider() native;
+
+  @DomName('External.IsSearchProviderInstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void IsSearchProviderInstalled() 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('FaceDetector')
+@Experimental() // untriaged
+@Native("FaceDetector")
+class FaceDetector extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory FaceDetector._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('FaceDetector.FaceDetector')
+  @DocsEditable()
+  factory FaceDetector([Map faceDetectorOptions]) {
+    if (faceDetectorOptions != null) {
+      var faceDetectorOptions_1 =
+          convertDartToNative_Dictionary(faceDetectorOptions);
+      return FaceDetector._create_1(faceDetectorOptions_1);
+    }
+    return FaceDetector._create_2();
+  }
+  static FaceDetector _create_1(faceDetectorOptions) =>
+      JS('FaceDetector', 'new FaceDetector(#)', faceDetectorOptions);
+  static FaceDetector _create_2() => JS('FaceDetector', 'new FaceDetector()');
+
+  @DomName('FaceDetector.detect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future detect(/*ImageBitmapSource*/ image) 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('FederatedCredential')
 @Experimental() // untriaged
 @Native("FederatedCredential")
-class FederatedCredential extends Credential {
+class FederatedCredential extends Credential implements CredentialUserData {
   // To suppress missing implicit constructor warnings.
   factory FederatedCredential._() {
     throw new UnsupportedError("Not supported");
@@ -17032,6 +19378,19 @@
   @DocsEditable()
   @Experimental() // untriaged
   final String provider;
+
+  // From CredentialUserData
+
+  @JSName('iconURL')
+  @DomName('FederatedCredential.iconURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String iconUrl;
+
+  @DomName('FederatedCredential.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
@@ -17066,6 +19425,11 @@
   @Experimental() // untriaged
   final bool isReload;
 
+  @DomName('FetchEvent.preloadResponse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Future preloadResponse;
+
   @DomName('FetchEvent.request')
   @DocsEditable()
   @Experimental() // untriaged
@@ -17110,7 +19474,9 @@
 
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  final HtmlFormControlsCollection elements;
+  @Returns('HtmlCollection|Null')
+  @Creates('HtmlCollection')
+  final List<Node> elements;
 
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
@@ -17274,73 +19640,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('FileError')
-// http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
-@Experimental()
-@Native("FileError")
-class FileError extends DomError {
-  // To suppress missing implicit constructor warnings.
-  factory FileError._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('FileError.ABORT_ERR')
-  @DocsEditable()
-  static const int ABORT_ERR = 3;
-
-  @DomName('FileError.ENCODING_ERR')
-  @DocsEditable()
-  static const int ENCODING_ERR = 5;
-
-  @DomName('FileError.INVALID_MODIFICATION_ERR')
-  @DocsEditable()
-  static const int INVALID_MODIFICATION_ERR = 9;
-
-  @DomName('FileError.INVALID_STATE_ERR')
-  @DocsEditable()
-  static const int INVALID_STATE_ERR = 7;
-
-  @DomName('FileError.NOT_FOUND_ERR')
-  @DocsEditable()
-  static const int NOT_FOUND_ERR = 1;
-
-  @DomName('FileError.NOT_READABLE_ERR')
-  @DocsEditable()
-  static const int NOT_READABLE_ERR = 4;
-
-  @DomName('FileError.NO_MODIFICATION_ALLOWED_ERR')
-  @DocsEditable()
-  static const int NO_MODIFICATION_ALLOWED_ERR = 6;
-
-  @DomName('FileError.PATH_EXISTS_ERR')
-  @DocsEditable()
-  static const int PATH_EXISTS_ERR = 12;
-
-  @DomName('FileError.QUOTA_EXCEEDED_ERR')
-  @DocsEditable()
-  static const int QUOTA_EXCEEDED_ERR = 10;
-
-  @DomName('FileError.SECURITY_ERR')
-  @DocsEditable()
-  static const int SECURITY_ERR = 2;
-
-  @DomName('FileError.SYNTAX_ERR')
-  @DocsEditable()
-  static const int SYNTAX_ERR = 8;
-
-  @DomName('FileError.TYPE_MISMATCH_ERR')
-  @DocsEditable()
-  static const int TYPE_MISMATCH_ERR = 11;
-
-  @DomName('FileError.code')
-  @DocsEditable()
-  final int code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('FileList')
 @Native("FileList")
 class FileList extends Interceptor
@@ -17444,8 +19743,8 @@
    */
   @DomName('FileReader.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent =
-      const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<ProgressEvent> errorEvent =
+      const EventStreamProvider<ProgressEvent>('error');
 
   /**
    * Static factory designed to expose `load` events to event
@@ -17512,7 +19811,7 @@
 
   @DomName('FileReader.error')
   @DocsEditable()
-  final FileError error;
+  final DomException error;
 
   @DomName('FileReader.readyState')
   @DocsEditable()
@@ -17543,7 +19842,7 @@
   /// Stream of `error` events handled by this [FileReader].
   @DomName('FileReader.onerror')
   @DocsEditable()
-  Stream<Event> get onError => errorEvent.forTarget(this);
+  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
 
   /// Stream of `load` events handled by this [FileReader].
   @DomName('FileReader.onload')
@@ -17570,25 +19869,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('Stream')
-@Experimental() // untriaged
-@Native("Stream")
-class FileStream extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory FileStream._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('Stream.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('DOMFileSystem')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
@@ -17716,7 +19996,7 @@
 
   @DomName('FileWriter.error')
   @DocsEditable()
-  final FileError error;
+  final DomException error;
 
   @DomName('FileWriter.length')
   @DocsEditable()
@@ -17851,6 +20131,11 @@
   static FontFace _create_2(family, source) =>
       JS('FontFace', 'new FontFace(#,#)', family, source);
 
+  @DomName('FontFace.display')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String display;
+
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
@@ -17915,10 +20200,23 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FontFaceSet.size')
+  @DomName('FontFaceSet.loadingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  final int size;
+  static const EventStreamProvider<FontFaceSetLoadEvent> loadingEvent =
+      const EventStreamProvider<FontFaceSetLoadEvent>('loading');
+
+  @DomName('FontFaceSet.loadingdoneEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<FontFaceSetLoadEvent> loadingDoneEvent =
+      const EventStreamProvider<FontFaceSetLoadEvent>('loadingdone');
+
+  @DomName('FontFaceSet.loadingerrorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<FontFaceSetLoadEvent> loadingErrorEvent =
+      const EventStreamProvider<FontFaceSetLoadEvent>('loadingerror');
 
   @DomName('FontFaceSet.status')
   @DocsEditable()
@@ -17954,6 +20252,23 @@
   @DocsEditable()
   @Experimental() // untriaged
   bool has(FontFace arg) native;
+
+  @DomName('FontFaceSet.onloading')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<FontFaceSetLoadEvent> get onLoading => loadingEvent.forTarget(this);
+
+  @DomName('FontFaceSet.onloadingdone')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<FontFaceSetLoadEvent> get onLoadingDone =>
+      loadingDoneEvent.forTarget(this);
+
+  @DomName('FontFaceSet.onloadingerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<FontFaceSetLoadEvent> get onLoadingError =>
+      loadingErrorEvent.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
@@ -17969,6 +20284,23 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('FontFaceSetLoadEvent.FontFaceSetLoadEvent')
+  @DocsEditable()
+  factory FontFaceSetLoadEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return FontFaceSetLoadEvent._create_1(type, eventInitDict_1);
+    }
+    return FontFaceSetLoadEvent._create_2(type);
+  }
+  static FontFaceSetLoadEvent _create_1(type, eventInitDict) => JS(
+      'FontFaceSetLoadEvent',
+      'new FontFaceSetLoadEvent(#,#)',
+      type,
+      eventInitDict);
+  static FontFaceSetLoadEvent _create_2(type) =>
+      JS('FontFaceSetLoadEvent', 'new FontFaceSetLoadEvent(#)', type);
+
   @DomName('FontFaceSetLoadEvent.fontfaces')
   @DocsEditable()
   @Experimental() // untriaged
@@ -17979,6 +20311,63 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('FontFaceSource')
+@Experimental() // untriaged
+@Native("FontFaceSource")
+class FontFaceSource extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory FontFaceSource._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('FontFaceSource.fonts')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final FontFaceSet fonts;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('ForeignFetchEvent')
+@Experimental() // untriaged
+@Native("ForeignFetchEvent")
+class ForeignFetchEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory ForeignFetchEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('ForeignFetchEvent.ForeignFetchEvent')
+  @DocsEditable()
+  factory ForeignFetchEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return ForeignFetchEvent._create_1(type, eventInitDict_1);
+  }
+  static ForeignFetchEvent _create_1(type, eventInitDict) => JS(
+      'ForeignFetchEvent', 'new ForeignFetchEvent(#,#)', type, eventInitDict);
+
+  @DomName('ForeignFetchEvent.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
+  @DomName('ForeignFetchEvent.request')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _Request request;
+
+  @DomName('ForeignFetchEvent.respondWith')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void respondWith(Future r) 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('FormData')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -18164,6 +20553,15 @@
 // for details. All rights reserved. Use of 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('FunctionStringCallback')
+@Experimental() // untriaged
+typedef void FunctionStringCallback(String data);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 @DocsEditable()
 @DomName('Gamepad')
 // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepad-interface
@@ -18190,6 +20588,16 @@
   @Experimental() // untriaged
   final bool connected;
 
+  @DomName('Gamepad.displayId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int displayId;
+
+  @DomName('Gamepad.hand')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String hand;
+
   @DomName('Gamepad.id')
   @DocsEditable()
   final String id;
@@ -18203,6 +20611,11 @@
   @Experimental() // untriaged
   final String mapping;
 
+  @DomName('Gamepad.pose')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final GamepadPose pose;
+
   @DomName('Gamepad.timestamp')
   @DocsEditable()
   final int timestamp;
@@ -18226,10 +20639,15 @@
   @Experimental() // untriaged
   final bool pressed;
 
+  @DomName('GamepadButton.touched')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool touched;
+
   @DomName('GamepadButton.value')
   @DocsEditable()
   @Experimental() // untriaged
-  final double value;
+  final num 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
@@ -18269,72 +20687,54 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('Geofencing')
+@DomName('GamepadPose')
 @Experimental() // untriaged
-@Native("Geofencing")
-class Geofencing extends Interceptor {
+@Native("GamepadPose")
+class GamepadPose extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Geofencing._() {
+  factory GamepadPose._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Geofencing.getRegisteredRegions')
+  @DomName('GamepadPose.angularAcceleration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegisteredRegions() native;
+  final Float32List angularAcceleration;
 
-  @DomName('Geofencing.registerRegion')
+  @DomName('GamepadPose.angularVelocity')
   @DocsEditable()
   @Experimental() // untriaged
-  Future registerRegion(GeofencingRegion region) native;
+  final Float32List angularVelocity;
 
-  @DomName('Geofencing.unregisterRegion')
+  @DomName('GamepadPose.hasOrientation')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregisterRegion(String regionId) 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.
+  final bool hasOrientation;
 
-@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')
+  @DomName('GamepadPose.hasPosition')
   @DocsEditable()
   @Experimental() // untriaged
-  final String id;
+  final bool hasPosition;
 
-  @DomName('GeofencingEvent.region')
+  @DomName('GamepadPose.linearAcceleration')
   @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.
+  final Float32List linearAcceleration;
 
-@DocsEditable()
-@DomName('GeofencingRegion')
-@Experimental() // untriaged
-@Native("GeofencingRegion")
-class GeofencingRegion extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory GeofencingRegion._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('GeofencingRegion.id')
+  @DomName('GamepadPose.linearVelocity')
   @DocsEditable()
   @Experimental() // untriaged
-  final String id;
+  final Float32List linearVelocity;
+
+  @DomName('GamepadPose.orientation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List orientation;
+
+  @DomName('GamepadPose.position')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List position;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18507,21 +20907,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('Geoposition')
-@Unstable()
-@Native("Geoposition")
+@DomName('Position')
+@Experimental() // untriaged
+@Native("Position")
 class Geoposition extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory Geoposition._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Geoposition.coords')
+  @DomName('Position.coords')
   @DocsEditable()
+  @Experimental() // untriaged
   final Coordinates coords;
 
-  @DomName('Geoposition.timestamp')
+  @DomName('Position.timestamp')
   @DocsEditable()
+  @Experimental() // untriaged
   final int timestamp;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18883,6 +21285,12 @@
   static const EventStreamProvider<Event> waitingEvent =
       const EventStreamProvider<Event>('waiting');
 
+  @DomName('GlobalEventHandlers.wheelEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<WheelEvent> wheelEvent =
+      const EventStreamProvider<WheelEvent>('wheel');
+
   @DomName('GlobalEventHandlers.onabort')
   @DocsEditable()
   @Experimental() // untriaged
@@ -19162,6 +21570,53 @@
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onWaiting => waitingEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onwheel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<WheelEvent> get onWheel => wheelEvent.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('Gyroscope')
+@Experimental() // untriaged
+@Native("Gyroscope")
+class Gyroscope extends Sensor {
+  // To suppress missing implicit constructor warnings.
+  factory Gyroscope._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('Gyroscope.Gyroscope')
+  @DocsEditable()
+  factory Gyroscope([Map sensorOptions]) {
+    if (sensorOptions != null) {
+      var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
+      return Gyroscope._create_1(sensorOptions_1);
+    }
+    return Gyroscope._create_2();
+  }
+  static Gyroscope _create_1(sensorOptions) =>
+      JS('Gyroscope', 'new Gyroscope(#)', sensorOptions);
+  static Gyroscope _create_2() => JS('Gyroscope', 'new Gyroscope()');
+
+  @DomName('Gyroscope.x')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num x;
+
+  @DomName('Gyroscope.y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num y;
+
+  @DomName('Gyroscope.z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -19293,26 +21748,14 @@
 
   @DomName('Headers.Headers')
   @DocsEditable()
-  factory Headers([input]) {
-    if (input == null) {
-      return Headers._create_1();
+  factory Headers([Object init]) {
+    if (init != null) {
+      return Headers._create_1(init);
     }
-    if ((input is Headers)) {
-      return Headers._create_2(input);
-    }
-    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");
+    return Headers._create_2();
   }
-  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);
-  static Headers _create_4(input) => JS('Headers', 'new Headers(#)', input);
+  static Headers _create_1(init) => JS('Headers', 'new Headers(#)', init);
+  static Headers _create_2() => JS('Headers', 'new Headers()');
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -19482,30 +21925,6 @@
 // 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
-// BSD-style license that can be found in the LICENSE file.
-
-@DocsEditable()
 @DomName('HTMLCollection')
 @Native("HTMLCollection")
 class HtmlCollection extends Interceptor
@@ -19733,10 +22152,8 @@
    * `<input is="x-bar"></input>`
    *
    */
-  void registerElement(String tag, Type customElementClass,
-      {String extendsTag}) {
-    _registerCustomElement(
-        JS('', 'window'), this, tag, customElementClass, extendsTag);
+  Function registerElement2(String tag, [Map options]) {
+    return _registerCustomElement(JS('', 'window'), this, tag, options);
   }
 
   /** *Deprecated*: use [registerElement] instead. */
@@ -19848,6 +22265,75 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('HTMLHyperlinkElementUtils')
+@Experimental() // untriaged
+@Native("HTMLHyperlinkElementUtils")
+class HtmlHyperlinkElementUtils extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory HtmlHyperlinkElementUtils._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('HTMLHyperlinkElementUtils.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String hash;
+
+  @DomName('HTMLHyperlinkElementUtils.host')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String host;
+
+  @DomName('HTMLHyperlinkElementUtils.hostname')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String hostname;
+
+  @DomName('HTMLHyperlinkElementUtils.href')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String href;
+
+  @DomName('HTMLHyperlinkElementUtils.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
+  @DomName('HTMLHyperlinkElementUtils.password')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String password;
+
+  @DomName('HTMLHyperlinkElementUtils.pathname')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String pathname;
+
+  @DomName('HTMLHyperlinkElementUtils.port')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String port;
+
+  @DomName('HTMLHyperlinkElementUtils.protocol')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String protocol;
+
+  @DomName('HTMLHyperlinkElementUtils.search')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String search;
+
+  @DomName('HTMLHyperlinkElementUtils.username')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String username;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLOptionsCollection')
 @Native("HTMLOptionsCollection")
 class HtmlOptionsCollection extends HtmlCollection {
@@ -19860,7 +22346,7 @@
   @DomName('HTMLOptionsCollection.item')
   @DocsEditable()
   @Experimental() // untriaged
-  Node _item(int index) native;
+  Element _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
@@ -20278,8 +22764,8 @@
    */
   @DomName('XMLHttpRequest.readystatechangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> readyStateChangeEvent =
-      const EventStreamProvider<ProgressEvent>('readystatechange');
+  static const EventStreamProvider<Event> readyStateChangeEvent =
+      const EventStreamProvider<Event>('readystatechange');
 
   /**
    * General constructor for any type of request (GET, POST, etc).
@@ -20585,8 +23071,7 @@
    */
   @DomName('XMLHttpRequest.onreadystatechange')
   @DocsEditable()
-  Stream<ProgressEvent> get onReadyStateChange =>
-      readyStateChangeEvent.forTarget(this);
+  Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -20778,11 +23263,21 @@
    */
   IFrameElement.created() : super.created();
 
+  @DomName('HTMLIFrameElement.allow')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String allow;
+
   @DomName('HTMLIFrameElement.allowFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
   bool allowFullscreen;
 
+  @DomName('HTMLIFrameElement.allowPaymentRequest')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool allowPaymentRequest;
+
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
   WindowBase get contentWindow =>
@@ -20794,6 +23289,11 @@
   @Returns('Window|=Object')
   final dynamic _get_contentWindow;
 
+  @DomName('HTMLIFrameElement.csp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String csp;
+
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
   String height;
@@ -20802,10 +23302,10 @@
   @DocsEditable()
   String name;
 
-  @DomName('HTMLIFrameElement.referrerpolicy')
+  @DomName('HTMLIFrameElement.referrerPolicy')
   @DocsEditable()
   @Experimental() // untriaged
-  String referrerpolicy;
+  String referrerPolicy;
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
@@ -20904,10 +23404,88 @@
   @Experimental() // untriaged
   final CanvasElement canvas;
 
-  @DomName('ImageBitmapRenderingContext.transferImageBitmap')
+  @DomName('ImageBitmapRenderingContext.transferFromImageBitmap')
   @DocsEditable()
   @Experimental() // untriaged
-  void transferImageBitmap(ImageBitmap bitmap) native;
+  void transferFromImageBitmap(ImageBitmap bitmap) 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('ImageCapture')
+@Experimental() // untriaged
+@Native("ImageCapture")
+class ImageCapture extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ImageCapture._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('ImageCapture.ImageCapture')
+  @DocsEditable()
+  factory ImageCapture(MediaStreamTrack track) {
+    return ImageCapture._create_1(track);
+  }
+  static ImageCapture _create_1(track) =>
+      JS('ImageCapture', 'new ImageCapture(#)', track);
+
+  @DomName('ImageCapture.track')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaStreamTrack track;
+
+  @DomName('ImageCapture.getPhotoCapabilities')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getPhotoCapabilities() native;
+
+  @DomName('ImageCapture.getPhotoSettings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getPhotoSettings() native;
+
+  @DomName('ImageCapture.grabFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future grabFrame() native;
+
+  @DomName('ImageCapture.setOptions')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future setOptions(Map photoSettings) {
+    var photoSettings_1 = convertDartToNative_Dictionary(photoSettings);
+    return _setOptions_1(photoSettings_1);
+  }
+
+  @JSName('setOptions')
+  @DomName('ImageCapture.setOptions')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _setOptions_1(photoSettings) native;
+
+  @DomName('ImageCapture.takePhoto')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future takePhoto([Map photoSettings]) {
+    if (photoSettings != null) {
+      var photoSettings_1 = convertDartToNative_Dictionary(photoSettings);
+      return _takePhoto_1(photoSettings_1);
+    }
+    return _takePhoto_2();
+  }
+
+  @JSName('takePhoto')
+  @DomName('ImageCapture.takePhoto')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _takePhoto_1(photoSettings) native;
+  @JSName('takePhoto')
+  @DomName('ImageCapture.takePhoto')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _takePhoto_2() 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
@@ -20989,6 +23567,11 @@
   @DocsEditable()
   String alt;
 
+  @DomName('HTMLImageElement.async')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String async;
+
   @DomName('HTMLImageElement.complete')
   @DocsEditable()
   final bool complete;
@@ -21018,10 +23601,10 @@
   @DocsEditable()
   final int naturalWidth;
 
-  @DomName('HTMLImageElement.referrerpolicy')
+  @DomName('HTMLImageElement.referrerPolicy')
   @DocsEditable()
   @Experimental() // untriaged
-  String referrerpolicy;
+  String referrerPolicy;
 
   @DomName('HTMLImageElement.sizes')
   @DocsEditable()
@@ -21044,25 +23627,11 @@
   @DomName('HTMLImageElement.width')
   @DocsEditable()
   int 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('InjectedScriptHost')
-@Experimental() // untriaged
-@Native("InjectedScriptHost")
-class InjectedScriptHost extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory InjectedScriptHost._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('InjectedScriptHost.inspect')
+  @DomName('HTMLImageElement.decode')
   @DocsEditable()
   @Experimental() // untriaged
-  void inspect(Object objectId, Object hints) native;
+  Future decode() 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
@@ -21174,7 +23743,7 @@
   @DomName('HTMLInputElement.capture')
   @DocsEditable()
   @Experimental() // untriaged
-  bool capture;
+  String capture;
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
@@ -21240,11 +23809,6 @@
   @DocsEditable()
   bool indeterminate;
 
-  @DomName('HTMLInputElement.inputMode')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String inputMode;
-
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
   @Returns('NodeList|Null')
@@ -21999,20 +24563,20 @@
   static InstallEvent _create_2(type) =>
       JS('InstallEvent', 'new InstallEvent(#)', type);
 
-  @DomName('InstallEvent.registerForeignFetchScopes')
+  @DomName('InstallEvent.registerForeignFetch')
   @DocsEditable()
   @Experimental() // untriaged
-  void registerForeignFetchScopes(List<String> subScopes, Object origins) {
-    List subScopes_1 = convertDartToNative_StringArray(subScopes);
-    _registerForeignFetchScopes_1(subScopes_1, origins);
+  void registerForeignFetch(Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    _registerForeignFetch_1(options_1);
     return;
   }
 
-  @JSName('registerForeignFetchScopes')
-  @DomName('InstallEvent.registerForeignFetchScopes')
+  @JSName('registerForeignFetch')
+  @DomName('InstallEvent.registerForeignFetch')
   @DocsEditable()
   @Experimental() // untriaged
-  void _registerForeignFetchScopes_1(List subScopes, origins) native;
+  void _registerForeignFetch_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
@@ -22028,6 +24592,24 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('IntersectionObserver.IntersectionObserver')
+  @DocsEditable()
+  factory IntersectionObserver(IntersectionObserverCallback callback,
+      [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return IntersectionObserver._create_1(callback, options_1);
+    }
+    return IntersectionObserver._create_2(callback);
+  }
+  static IntersectionObserver _create_1(callback, options) => JS(
+      'IntersectionObserver',
+      'new IntersectionObserver(#,#)',
+      callback,
+      options);
+  static IntersectionObserver _create_2(callback) =>
+      JS('IntersectionObserver', 'new IntersectionObserver(#)', callback);
+
   @DomName('IntersectionObserver.root')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22067,6 +24649,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('IntersectionObserverCallback')
+@Experimental() // untriaged
+typedef void IntersectionObserverCallback(
+    List<IntersectionObserverEntry> entries, IntersectionObserver observer);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 @DocsEditable()
 @DomName('IntersectionObserverEntry')
 @Experimental() // untriaged
@@ -22080,17 +24672,27 @@
   @DomName('IntersectionObserverEntry.boundingClientRect')
   @DocsEditable()
   @Experimental() // untriaged
-  final Rectangle boundingClientRect;
+  final DomRectReadOnly boundingClientRect;
+
+  @DomName('IntersectionObserverEntry.intersectionRatio')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num intersectionRatio;
 
   @DomName('IntersectionObserverEntry.intersectionRect')
   @DocsEditable()
   @Experimental() // untriaged
-  final Rectangle intersectionRect;
+  final DomRectReadOnly intersectionRect;
+
+  @DomName('IntersectionObserverEntry.isIntersecting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isIntersecting;
 
   @DomName('IntersectionObserverEntry.rootBounds')
   @DocsEditable()
   @Experimental() // untriaged
-  final Rectangle rootBounds;
+  final DomRectReadOnly rootBounds;
 
   @DomName('IntersectionObserverEntry.target')
   @DocsEditable()
@@ -22100,7 +24702,36 @@
   @DomName('IntersectionObserverEntry.time')
   @DocsEditable()
   @Experimental() // untriaged
-  final double time;
+  final num time;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('InterventionReport')
+@Experimental() // untriaged
+@Native("InterventionReport")
+class InterventionReport extends ReportBody {
+  // To suppress missing implicit constructor warnings.
+  factory InterventionReport._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('InterventionReport.lineNumber')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int lineNumber;
+
+  @DomName('InterventionReport.message')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String message;
+
+  @DomName('InterventionReport.sourceFile')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String sourceFile;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -22248,6 +24879,11 @@
   @DocsEditable()
   final bool ctrlKey;
 
+  @DomName('KeyboardEvent.isComposing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isComposing;
+
   @DomName('KeyboardEvent.key')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22259,12 +24895,6 @@
   @Experimental() // untriaged
   final int _keyCode;
 
-  @JSName('keyIdentifier')
-  @DomName('KeyboardEvent.keyIdentifier')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  final String _keyIdentifier;
-
   @DomName('KeyboardEvent.location')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22283,9 +24913,6 @@
   @DocsEditable()
   final bool shiftKey;
 
-  // Use implementation from UIEvent.
-  // final int _which;
-
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22299,7 +24926,7 @@
 @DomName('KeyframeEffect')
 @Experimental() // untriaged
 @Native("KeyframeEffect")
-class KeyframeEffect extends AnimationEffectReadOnly {
+class KeyframeEffect extends KeyframeEffectReadOnly {
   // To suppress missing implicit constructor warnings.
   factory KeyframeEffect._() {
     throw new UnsupportedError("Not supported");
@@ -22307,150 +24934,51 @@
 
   @DomName('KeyframeEffect.KeyframeEffect')
   @DocsEditable()
-  factory KeyframeEffect(Element target, Object effect, [timing]) {
-    if (effect != null &&
-        (target is Element || target == null) &&
-        timing == null) {
-      return KeyframeEffect._create_1(target, effect);
+  factory KeyframeEffect(Element target, Object effect, [Object options]) {
+    if (options != null) {
+      return KeyframeEffect._create_1(target, effect, options);
     }
-    if ((timing is num) &&
-        effect != null &&
-        (target is Element || target == null)) {
-      return KeyframeEffect._create_2(target, effect, timing);
-    }
-    if ((timing is Map) &&
-        effect != null &&
-        (target is Element || target == null)) {
-      var timing_1 = convertDartToNative_Dictionary(timing);
-      return KeyframeEffect._create_3(target, effect, timing_1);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+    return KeyframeEffect._create_2(target, effect);
   }
-  static KeyframeEffect _create_1(target, effect) =>
+  static KeyframeEffect _create_1(target, effect, options) => JS(
+      'KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, effect, options);
+  static KeyframeEffect _create_2(target, effect) =>
       JS('KeyframeEffect', 'new KeyframeEffect(#,#)', target, effect);
-  static KeyframeEffect _create_2(target, effect, timing) =>
-      JS('KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, effect, timing);
-  static KeyframeEffect _create_3(target, effect, timing) =>
-      JS('KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, effect, 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)
-@Experimental()
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-keygen-element
-@Native("HTMLKeygenElement")
-class KeygenElement extends HtmlElement {
-  // To suppress missing implicit constructor warnings.
-  factory KeygenElement._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('HTMLKeygenElement.HTMLKeygenElement')
-  @DocsEditable()
-  factory KeygenElement() => document.createElement("keygen");
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  KeygenElement.created() : super.created();
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported =>
-      Element.isTagSupported('keygen') &&
-      (new Element.tag('keygen') is KeygenElement);
-
-  @DomName('HTMLKeygenElement.autofocus')
-  @DocsEditable()
-  bool autofocus;
-
-  @DomName('HTMLKeygenElement.challenge')
-  @DocsEditable()
-  String challenge;
-
-  @DomName('HTMLKeygenElement.disabled')
-  @DocsEditable()
-  bool disabled;
-
-  @DomName('HTMLKeygenElement.form')
-  @DocsEditable()
-  final FormElement form;
-
-  @DomName('HTMLKeygenElement.keytype')
-  @DocsEditable()
-  String keytype;
-
-  @DomName('HTMLKeygenElement.labels')
-  @DocsEditable()
-  @Unstable()
-  @Returns('NodeList|Null')
-  @Creates('NodeList')
-  final List<Node> labels;
-
-  @DomName('HTMLKeygenElement.name')
-  @DocsEditable()
-  String name;
-
-  @DomName('HTMLKeygenElement.type')
-  @DocsEditable()
-  final String type;
-
-  @DomName('HTMLKeygenElement.validationMessage')
-  @DocsEditable()
-  final String validationMessage;
-
-  @DomName('HTMLKeygenElement.validity')
-  @DocsEditable()
-  final ValidityState validity;
-
-  @DomName('HTMLKeygenElement.willValidate')
-  @DocsEditable()
-  final bool willValidate;
-
-  @DomName('HTMLKeygenElement.checkValidity')
-  @DocsEditable()
-  bool checkValidity() native;
-
-  @DomName('HTMLKeygenElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool reportValidity() native;
-
-  @DomName('HTMLKeygenElement.setCustomValidity')
-  @DocsEditable()
-  void setCustomValidity(String error) 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('KeywordValue')
+@DomName('KeyframeEffectReadOnly')
 @Experimental() // untriaged
-@Native("KeywordValue")
-class KeywordValue extends StyleValue {
+@Native("KeyframeEffectReadOnly")
+class KeyframeEffectReadOnly extends AnimationEffectReadOnly {
   // To suppress missing implicit constructor warnings.
-  factory KeywordValue._() {
+  factory KeyframeEffectReadOnly._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('KeywordValue.KeywordValue')
+  @DomName('KeyframeEffectReadOnly.KeyframeEffectReadOnly')
   @DocsEditable()
-  factory KeywordValue(String keyword) {
-    return KeywordValue._create_1(keyword);
+  factory KeyframeEffectReadOnly(Element target, Object effect,
+      [Object options]) {
+    if (options != null) {
+      return KeyframeEffectReadOnly._create_1(target, effect, options);
+    }
+    return KeyframeEffectReadOnly._create_2(target, effect);
   }
-  static KeywordValue _create_1(keyword) =>
-      JS('KeywordValue', 'new KeywordValue(#)', keyword);
-
-  @DomName('KeywordValue.keywordValue')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String keywordValue;
+  static KeyframeEffectReadOnly _create_1(target, effect, options) => JS(
+      'KeyframeEffectReadOnly',
+      'new KeyframeEffectReadOnly(#,#,#)',
+      target,
+      effect,
+      options);
+  static KeyframeEffectReadOnly _create_2(target, effect) => JS(
+      'KeyframeEffectReadOnly',
+      'new KeyframeEffectReadOnly(#,#)',
+      target,
+      effect);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -22555,58 +25083,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('LengthValue')
+@DomName('LinearAccelerationSensor')
 @Experimental() // untriaged
-@Native("LengthValue")
-class LengthValue extends StyleValue {
+@Native("LinearAccelerationSensor")
+class LinearAccelerationSensor extends Accelerometer {
   // To suppress missing implicit constructor warnings.
-  factory LengthValue._() {
+  factory LinearAccelerationSensor._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('LengthValue.add')
+  @DomName('LinearAccelerationSensor.LinearAccelerationSensor')
   @DocsEditable()
-  @Experimental() // untriaged
-  LengthValue add(LengthValue other) native;
-
-  @DomName('LengthValue.divide')
-  @DocsEditable()
-  @Experimental() // untriaged
-  LengthValue divide(num value) native;
-
-  @DomName('LengthValue.fromDictionary')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static LengthValue fromDictionary(Map dictionary) {
-    var dictionary_1 = convertDartToNative_Dictionary(dictionary);
-    return _fromDictionary_1(dictionary_1);
+  factory LinearAccelerationSensor([Map sensorOptions]) {
+    if (sensorOptions != null) {
+      var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
+      return LinearAccelerationSensor._create_1(sensorOptions_1);
+    }
+    return LinearAccelerationSensor._create_2();
   }
-
-  @JSName('fromDictionary')
-  @DomName('LengthValue.fromDictionary')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static LengthValue _fromDictionary_1(dictionary) native;
-
-  @DomName('LengthValue.fromValue')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static LengthValue fromValue(num value, String type) native;
-
-  @DomName('LengthValue.multiply')
-  @DocsEditable()
-  @Experimental() // untriaged
-  LengthValue multiply(num value) native;
-
-  @DomName('LengthValue.parse')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static LengthValue parse(String cssString) native;
-
-  @DomName('LengthValue.subtract')
-  @DocsEditable()
-  @Experimental() // untriaged
-  LengthValue subtract(LengthValue other) native;
+  static LinearAccelerationSensor _create_1(sensorOptions) => JS(
+      'LinearAccelerationSensor',
+      'new LinearAccelerationSensor(#)',
+      sensorOptions);
+  static LinearAccelerationSensor _create_2() =>
+      JS('LinearAccelerationSensor', 'new LinearAccelerationSensor()');
 }
 // 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
@@ -22672,6 +25172,11 @@
   @DocsEditable()
   String media;
 
+  @DomName('HTMLLinkElement.referrerPolicy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String referrerPolicy;
+
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
   String rel;
@@ -22681,6 +25186,11 @@
   @Experimental() // untriaged
   final DomTokenList relList;
 
+  @DomName('HTMLLinkElement.scope')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String scope;
+
   @DomName('HTMLLinkElement.sheet')
   @DocsEditable()
   final StyleSheet sheet;
@@ -22750,6 +25260,11 @@
   @DocsEditable()
   String search;
 
+  @DomName('Location.trustedHref')
+  @DocsEditable()
+  @Experimental() // untriaged
+  TrustedUrl trustedHref;
+
   @DomName('Location.assign')
   @DocsEditable()
   void assign([String url]) native;
@@ -22779,6 +25294,48 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('Magnetometer')
+@Experimental() // untriaged
+@Native("Magnetometer")
+class Magnetometer extends Sensor {
+  // To suppress missing implicit constructor warnings.
+  factory Magnetometer._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('Magnetometer.Magnetometer')
+  @DocsEditable()
+  factory Magnetometer([Map sensorOptions]) {
+    if (sensorOptions != null) {
+      var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
+      return Magnetometer._create_1(sensorOptions_1);
+    }
+    return Magnetometer._create_2();
+  }
+  static Magnetometer _create_1(sensorOptions) =>
+      JS('Magnetometer', 'new Magnetometer(#)', sensorOptions);
+  static Magnetometer _create_2() => JS('Magnetometer', 'new Magnetometer()');
+
+  @DomName('Magnetometer.x')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num x;
+
+  @DomName('Magnetometer.y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num y;
+
+  @DomName('Magnetometer.z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num z;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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')
 @Native("HTMLMapElement")
 class MapElement extends HtmlElement {
@@ -22813,204 +25370,71 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('Matrix')
+@DomName('MediaCapabilities')
 @Experimental() // untriaged
-@Native("Matrix")
-class Matrix extends TransformComponent {
+@Native("MediaCapabilities")
+class MediaCapabilities extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Matrix._() {
+  factory MediaCapabilities._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Matrix.Matrix')
+  @DomName('MediaCapabilities.decodingInfo')
   @DocsEditable()
-  factory Matrix(num a_OR_m11, num b_OR_m12, num c_OR_m13, num d_OR_m14,
-      num e_OR_m21, num f_OR_m22,
-      [num m23,
-      num m24,
-      num m31,
-      num m32,
-      num m33,
-      num m34,
-      num m41,
-      num m42,
-      num m43,
-      num m44]) {
-    if ((f_OR_m22 is num) &&
-        (e_OR_m21 is num) &&
-        (d_OR_m14 is num) &&
-        (c_OR_m13 is num) &&
-        (b_OR_m12 is num) &&
-        (a_OR_m11 is num) &&
-        m23 == null &&
-        m24 == null &&
-        m31 == null &&
-        m32 == null &&
-        m33 == null &&
-        m34 == null &&
-        m41 == null &&
-        m42 == null &&
-        m43 == null &&
-        m44 == null) {
-      return Matrix._create_1(
-          a_OR_m11, b_OR_m12, c_OR_m13, d_OR_m14, e_OR_m21, f_OR_m22);
-    }
-    if ((m44 is num) &&
-        (m43 is num) &&
-        (m42 is num) &&
-        (m41 is num) &&
-        (m34 is num) &&
-        (m33 is num) &&
-        (m32 is num) &&
-        (m31 is num) &&
-        (m24 is num) &&
-        (m23 is num) &&
-        (f_OR_m22 is num) &&
-        (e_OR_m21 is num) &&
-        (d_OR_m14 is num) &&
-        (c_OR_m13 is num) &&
-        (b_OR_m12 is num) &&
-        (a_OR_m11 is num)) {
-      return Matrix._create_2(a_OR_m11, b_OR_m12, c_OR_m13, d_OR_m14, e_OR_m21,
-          f_OR_m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+  @Experimental() // untriaged
+  Future decodingInfo(Map configuration) {
+    var configuration_1 = convertDartToNative_Dictionary(configuration);
+    return _decodingInfo_1(configuration_1);
   }
-  static Matrix _create_1(
-          a_OR_m11, b_OR_m12, c_OR_m13, d_OR_m14, e_OR_m21, f_OR_m22) =>
-      JS('Matrix', 'new Matrix(#,#,#,#,#,#)', a_OR_m11, b_OR_m12, c_OR_m13,
-          d_OR_m14, e_OR_m21, f_OR_m22);
-  static Matrix _create_2(a_OR_m11, b_OR_m12, c_OR_m13, d_OR_m14, e_OR_m21,
-          f_OR_m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44) =>
-      JS(
-          'Matrix',
-          'new Matrix(#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#)',
-          a_OR_m11,
-          b_OR_m12,
-          c_OR_m13,
-          d_OR_m14,
-          e_OR_m21,
-          f_OR_m22,
-          m23,
-          m24,
-          m31,
-          m32,
-          m33,
-          m34,
-          m41,
-          m42,
-          m43,
-          m44);
 
-  @DomName('Matrix.a')
+  @JSName('decodingInfo')
+  @DomName('MediaCapabilities.decodingInfo')
   @DocsEditable()
   @Experimental() // untriaged
-  final double a;
+  Future _decodingInfo_1(configuration) native;
 
-  @DomName('Matrix.b')
+  @DomName('MediaCapabilities.encodingInfo')
   @DocsEditable()
   @Experimental() // untriaged
-  final double b;
+  Future encodingInfo(Map configuration) {
+    var configuration_1 = convertDartToNative_Dictionary(configuration);
+    return _encodingInfo_1(configuration_1);
+  }
 
-  @DomName('Matrix.c')
+  @JSName('encodingInfo')
+  @DomName('MediaCapabilities.encodingInfo')
   @DocsEditable()
   @Experimental() // untriaged
-  final double c;
+  Future _encodingInfo_1(configuration) 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.
 
-  @DomName('Matrix.d')
+@DocsEditable()
+@DomName('MediaCapabilitiesInfo')
+@Experimental() // untriaged
+@Native("MediaCapabilitiesInfo")
+class MediaCapabilitiesInfo extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory MediaCapabilitiesInfo._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('MediaCapabilitiesInfo.powerEfficient')
   @DocsEditable()
   @Experimental() // untriaged
-  final double d;
+  final bool powerEfficient;
 
-  @DomName('Matrix.e')
+  @DomName('MediaCapabilitiesInfo.smooth')
   @DocsEditable()
   @Experimental() // untriaged
-  final double e;
+  final bool smooth;
 
-  @DomName('Matrix.f')
+  @DomName('MediaCapabilitiesInfo.supported')
   @DocsEditable()
   @Experimental() // untriaged
-  final double f;
-
-  @DomName('Matrix.m11')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m11;
-
-  @DomName('Matrix.m12')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m12;
-
-  @DomName('Matrix.m13')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m13;
-
-  @DomName('Matrix.m14')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m14;
-
-  @DomName('Matrix.m21')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m21;
-
-  @DomName('Matrix.m22')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m22;
-
-  @DomName('Matrix.m23')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m23;
-
-  @DomName('Matrix.m24')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m24;
-
-  @DomName('Matrix.m31')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m31;
-
-  @DomName('Matrix.m32')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m32;
-
-  @DomName('Matrix.m33')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m33;
-
-  @DomName('Matrix.m34')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m34;
-
-  @DomName('Matrix.m41')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m41;
-
-  @DomName('Matrix.m42')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m42;
-
-  @DomName('Matrix.m43')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m43;
-
-  @DomName('Matrix.m44')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double m44;
+  final bool 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
@@ -23054,7 +25478,7 @@
 @DomName('MediaDevices')
 @Experimental() // untriaged
 @Native("MediaDevices")
-class MediaDevices extends Interceptor {
+class MediaDevices extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory MediaDevices._() {
     throw new UnsupportedError("Not supported");
@@ -23065,19 +25489,18 @@
   @Experimental() // untriaged
   Future enumerateDevices() native;
 
-  @DomName('MediaDevices.getUserMedia')
+  @DomName('MediaDevices.getSupportedConstraints')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getUserMedia(Map options) {
-    var options_1 = convertDartToNative_Dictionary(options);
-    return _getUserMedia_1(options_1);
+  Map getSupportedConstraints() {
+    return convertNativeToDart_Dictionary(_getSupportedConstraints_1());
   }
 
-  @JSName('getUserMedia')
-  @DomName('MediaDevices.getUserMedia')
+  @JSName('getSupportedConstraints')
+  @DomName('MediaDevices.getSupportedConstraints')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _getUserMedia_1(options) native;
+  _getSupportedConstraints_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
@@ -23138,9 +25561,7 @@
   @DomName('HTMLMediaElement.audioTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  @Returns('AudioTrackList|Null')
-  @Creates('AudioTrackList')
-  final List<AudioTrack> audioTracks;
+  final AudioTrackList audioTracks;
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
@@ -23154,6 +25575,11 @@
   @DocsEditable()
   bool controls;
 
+  @DomName('HTMLMediaElement.controlsList')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final DomTokenList controlsList;
+
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23182,7 +25608,7 @@
 
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  final double duration;
+  final num duration;
 
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
@@ -23230,6 +25656,11 @@
   @DocsEditable()
   final int readyState;
 
+  @DomName('HTMLMediaElement.remote')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final RemotePlayback remote;
+
   @DomName('HTMLMediaElement.seekable')
   @DocsEditable()
   final TimeRanges seekable;
@@ -23238,11 +25669,6 @@
   @DocsEditable()
   final bool seeking;
 
-  @DomName('HTMLMediaElement.session')
-  @DocsEditable()
-  @Experimental() // untriaged
-  MediaSession session;
-
   @DomName('HTMLMediaElement.sinkId')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23252,6 +25678,11 @@
   @DocsEditable()
   String src;
 
+  @DomName('HTMLMediaElement.srcObject')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStream srcObject;
+
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
@@ -23397,6 +25828,11 @@
   @DomName('MediaError.code')
   @DocsEditable()
   final int code;
+
+  @DomName('MediaError.message')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String 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
@@ -23415,20 +25851,15 @@
 
   @DomName('MediaKeyMessageEvent.MediaKeyMessageEvent')
   @DocsEditable()
-  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);
+  factory MediaKeyMessageEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return MediaKeyMessageEvent._create_1(type, eventInitDict_1);
   }
   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()
@@ -23454,6 +25885,12 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('MediaKeySession.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
+
   @DomName('MediaKeySession.closed')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23462,7 +25899,7 @@
   @DomName('MediaKeySession.expiration')
   @DocsEditable()
   @Experimental() // untriaged
-  final double expiration;
+  final num expiration;
 
   @DomName('MediaKeySession.keyStatuses')
   @DocsEditable()
@@ -23496,6 +25933,11 @@
   @DomName('MediaKeySession.update')
   @DocsEditable()
   Future _update(/*BufferSource*/ response) native;
+
+  @DomName('MediaKeySession.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
@@ -23515,6 +25957,16 @@
   @DocsEditable()
   @Experimental() // untriaged
   final int size;
+
+  @DomName('MediaKeyStatusMap.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object get(/*BufferSource*/ keyId) native;
+
+  @DomName('MediaKeyStatusMap.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool has(/*BufferSource*/ keyId) 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
@@ -23573,6 +26025,11 @@
   @DocsEditable()
   MediaKeySession _createSession([String sessionType]) native;
 
+  @DomName('MediaKeys.getStatusForPolicy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getStatusForPolicy(MediaKeysPolicy policy) native;
+
   @DomName('MediaKeys.setServerCertificate')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23583,6 +26040,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('MediaKeysPolicy')
+@Experimental() // untriaged
+@Native("MediaKeysPolicy")
+class MediaKeysPolicy extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory MediaKeysPolicy._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('MediaKeysPolicy.MediaKeysPolicy')
+  @DocsEditable()
+  factory MediaKeysPolicy(Map init) {
+    var init_1 = convertDartToNative_Dictionary(init);
+    return MediaKeysPolicy._create_1(init_1);
+  }
+  static MediaKeysPolicy _create_1(init) =>
+      JS('MediaKeysPolicy', 'new MediaKeysPolicy(#)', init);
+
+  @DomName('MediaKeysPolicy.minHdcpVersion')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String minHdcpVersion;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('MediaList')
 @Unstable()
 @Native("MediaList")
@@ -23628,27 +26113,37 @@
 
   @DomName('MediaMetadata.MediaMetadata')
   @DocsEditable()
-  factory MediaMetadata(Map metadata) {
-    var metadata_1 = convertDartToNative_Dictionary(metadata);
-    return MediaMetadata._create_1(metadata_1);
+  factory MediaMetadata([Map metadata]) {
+    if (metadata != null) {
+      var metadata_1 = convertDartToNative_Dictionary(metadata);
+      return MediaMetadata._create_1(metadata_1);
+    }
+    return MediaMetadata._create_2();
   }
   static MediaMetadata _create_1(metadata) =>
       JS('MediaMetadata', 'new MediaMetadata(#)', metadata);
+  static MediaMetadata _create_2() =>
+      JS('MediaMetadata', 'new MediaMetadata()');
 
   @DomName('MediaMetadata.album')
   @DocsEditable()
   @Experimental() // untriaged
-  final String album;
+  String album;
 
   @DomName('MediaMetadata.artist')
   @DocsEditable()
   @Experimental() // untriaged
-  final String artist;
+  String artist;
+
+  @DomName('MediaMetadata.artwork')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List artwork;
 
   @DomName('MediaMetadata.title')
   @DocsEditable()
   @Experimental() // untriaged
-  final String title;
+  String title;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -23777,11 +26272,6 @@
   @Experimental() // untriaged
   final int audioBitsPerSecond;
 
-  @DomName('MediaRecorder.ignoreMutedMedia')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool ignoreMutedMedia;
-
   @DomName('MediaRecorder.mimeType')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23856,27 +26346,59 @@
     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.metadata')
   @DocsEditable()
   @Experimental() // untriaged
   MediaMetadata metadata;
 
-  @DomName('MediaSession.activate')
+  @DomName('MediaSession.playbackState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future activate() native;
+  String playbackState;
 
-  @DomName('MediaSession.deactivate')
+  @DomName('MediaSession.setActionHandler')
   @DocsEditable()
   @Experimental() // untriaged
-  Future deactivate() native;
+  void setActionHandler(String action, MediaSessionActionHandler handler)
+      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.
+
+// WARNING: Do not edit - generated code.
+
+@DomName('MediaSessionActionHandler')
+@Experimental() // untriaged
+typedef void MediaSessionActionHandler();
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('MediaSettingsRange')
+@Experimental() // untriaged
+@Native("MediaSettingsRange")
+class MediaSettingsRange extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory MediaSettingsRange._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('MediaSettingsRange.max')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num max;
+
+  @DomName('MediaSettingsRange.min')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num min;
+
+  @DomName('MediaSettingsRange.step')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num step;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -23925,6 +26447,11 @@
   @DocsEditable()
   SourceBuffer addSourceBuffer(String type) native;
 
+  @DomName('MediaSource.clearLiveSeekableRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearLiveSeekableRange() native;
+
   @DomName('MediaSource.endOfStream')
   @DocsEditable()
   void endOfStream([String error]) native;
@@ -23936,6 +26463,11 @@
   @DomName('MediaSource.removeSourceBuffer')
   @DocsEditable()
   void removeSourceBuffer(SourceBuffer buffer) native;
+
+  @DomName('MediaSource.setLiveSeekableRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setLiveSeekableRange(num start, num end) 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
@@ -23964,17 +26496,6 @@
       const EventStreamProvider<Event>('addtrack');
 
   /**
-   * Static factory designed to expose `ended` events to event
-   * handlers that are not necessarily instances of [MediaStream].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('MediaStream.endedEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> endedEvent =
-      const EventStreamProvider<Event>('ended');
-
-  /**
    * Static factory designed to expose `removetrack` events to event
    * handlers that are not necessarily instances of [MediaStream].
    *
@@ -24053,11 +26574,6 @@
   @DocsEditable()
   Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);
 
-  /// Stream of `ended` events handled by this [MediaStream].
-  @DomName('MediaStream.onended')
-  @DocsEditable()
-  Stream<Event> get onEnded => endedEvent.forTarget(this);
-
   /// Stream of `removetrack` events handled by this [MediaStream].
   @DomName('MediaStream.onremovetrack')
   @DocsEditable()
@@ -24165,6 +26681,11 @@
   static const EventStreamProvider<Event> unmuteEvent =
       const EventStreamProvider<Event>('unmute');
 
+  @DomName('MediaStreamTrack.contentHint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String contentHint;
+
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
   bool enabled;
@@ -24190,34 +26711,72 @@
   @DocsEditable()
   final String readyState;
 
-  @DomName('MediaStreamTrack.remote')
+  @DomName('MediaStreamTrack.applyConstraints')
   @DocsEditable()
   @Experimental() // untriaged
-  final bool remote;
+  Future applyConstraints([Map constraints]) {
+    if (constraints != null) {
+      var constraints_1 = convertDartToNative_Dictionary(constraints);
+      return _applyConstraints_1(constraints_1);
+    }
+    return _applyConstraints_2();
+  }
+
+  @JSName('applyConstraints')
+  @DomName('MediaStreamTrack.applyConstraints')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _applyConstraints_1(constraints) native;
+  @JSName('applyConstraints')
+  @DomName('MediaStreamTrack.applyConstraints')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _applyConstraints_2() native;
 
   @DomName('MediaStreamTrack.clone')
   @DocsEditable()
   @Experimental() // untriaged
   MediaStreamTrack clone() native;
 
-  @JSName('getSources')
-  @DomName('MediaStreamTrack.getSources')
+  @DomName('MediaStreamTrack.getCapabilities')
   @DocsEditable()
   @Experimental() // untriaged
-  static void _getSources(MediaStreamTrackSourcesCallback callback) native;
-
-  @JSName('getSources')
-  @DomName('MediaStreamTrack.getSources')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static Future<List<SourceInfo>> getSources() {
-    var completer = new Completer<List<SourceInfo>>();
-    _getSources((value) {
-      completer.complete(value);
-    });
-    return completer.future;
+  Map getCapabilities() {
+    return convertNativeToDart_Dictionary(_getCapabilities_1());
   }
 
+  @JSName('getCapabilities')
+  @DomName('MediaStreamTrack.getCapabilities')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _getCapabilities_1() native;
+
+  @DomName('MediaStreamTrack.getConstraints')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Map getConstraints() {
+    return convertNativeToDart_Dictionary(_getConstraints_1());
+  }
+
+  @JSName('getConstraints')
+  @DomName('MediaStreamTrack.getConstraints')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _getConstraints_1() native;
+
+  @DomName('MediaStreamTrack.getSettings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Map getSettings() {
+    return convertNativeToDart_Dictionary(_getSettings_1());
+  }
+
+  @JSName('getSettings')
+  @DomName('MediaStreamTrack.getSettings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _getSettings_1() native;
+
   @DomName('MediaStreamTrack.stop')
   @DocsEditable()
   @Experimental() // untriaged
@@ -24254,6 +26813,18 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('MediaStreamTrackEvent.MediaStreamTrackEvent')
+  @DocsEditable()
+  factory MediaStreamTrackEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return MediaStreamTrackEvent._create_1(type, eventInitDict_1);
+  }
+  static MediaStreamTrackEvent _create_1(type, eventInitDict) => JS(
+      'MediaStreamTrackEvent',
+      'new MediaStreamTrackEvent(#,#)',
+      type,
+      eventInitDict);
+
   /// Checks if this type is supported on the current platform.
   static bool get supported =>
       Device.isEventTypeSupported('MediaStreamTrackEvent');
@@ -24266,15 +26837,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('MediaStreamTrackSourcesCallback')
-@Experimental() // untriaged
-typedef void MediaStreamTrackSourcesCallback(List<SourceInfo> sources);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('MemoryInfo')
 @Experimental() // nonstandard
@@ -24333,73 +26895,16 @@
    * This can only be called by subclasses from their created constructor.
    */
   MenuElement.created() : super.created();
-
-  @DomName('HTMLMenuElement.label')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String label;
-
-  @DomName('HTMLMenuElement.type')
-  @DocsEditable()
-  @Experimental() // untriaged
-  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('HTMLMenuItemElement')
+// WARNING: Do not edit - generated code.
+
+@DomName('MessageCallback')
 @Experimental() // untriaged
-@Native("HTMLMenuItemElement")
-class MenuItemElement extends HtmlElement {
-  // To suppress missing implicit constructor warnings.
-  factory MenuItemElement._() {
-    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.
-   */
-  MenuItemElement.created() : super.created();
-
-  @DomName('HTMLMenuItemElement.checked')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool checked;
-
-  @JSName('default')
-  @DomName('HTMLMenuItemElement.default')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool defaultValue;
-
-  @DomName('HTMLMenuItemElement.disabled')
-  @DocsEditable()
-  @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
-  String type;
-}
+typedef void MessageCallback(Map 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.
@@ -24515,7 +27020,6 @@
   @Experimental() // untriaged
   final String suborigin;
 
-  @JSName('initMessageEvent')
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
   void _initMessageEvent(
@@ -24525,8 +27029,19 @@
       Object dataArg,
       String originArg,
       String lastEventIdArg,
-      Window sourceArg,
-      List<MessagePort> portsArg) native;
+      EventTarget sourceArg,
+      List<MessagePort> portsArg) {
+    var sourceArg_1 = _convertDartToNative_EventTarget(sourceArg);
+    _initMessageEvent_1(typeArg, canBubbleArg, cancelableArg, dataArg,
+        originArg, lastEventIdArg, sourceArg_1, portsArg);
+    return;
+  }
+
+  @JSName('initMessageEvent')
+  @DomName('MessageEvent.initMessageEvent')
+  @DocsEditable()
+  void _initMessageEvent_1(typeArg, canBubbleArg, cancelableArg, dataArg,
+      originArg, lastEventIdArg, sourceArg, List<MessagePort> portsArg) 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
@@ -24559,7 +27074,7 @@
 
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void postMessage(/*any*/ message, [List<MessagePort> transfer]) {
+  void postMessage(/*any*/ message, [List<Object> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, transfer);
@@ -24573,7 +27088,7 @@
   @JSName('postMessage')
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<Object> transfer) native;
   @JSName('postMessage')
   @DomName('MessagePort.postMessage')
   @DocsEditable()
@@ -24836,11 +27351,6 @@
   factory MidiInputMap._() {
     throw new UnsupportedError("Not supported");
   }
-
-  @DomName('MIDIInputMap.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
@@ -24874,10 +27384,6 @@
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
   final Uint8List data;
-
-  @DomName('MIDIMessageEvent.receivedTime')
-  @DocsEditable()
-  final double receivedTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -24911,11 +27417,6 @@
   factory MidiOutputMap._() {
     throw new UnsupportedError("Not supported");
   }
-
-  @DomName('MIDIOutputMap.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
@@ -25105,6 +27606,15 @@
 // for details. All rights reserved. Use of 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('MojoWatchCallback')
+@Experimental() // untriaged
+typedef void MojoWatchCallback(int result);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 @DomName('MouseEvent')
 @Native("MouseEvent,DragEvent")
 class MouseEvent extends UIEvent {
@@ -25176,12 +27686,12 @@
   @JSName('clientX')
   @DomName('MouseEvent.clientX')
   @DocsEditable()
-  final int _clientX;
+  final num _clientX;
 
   @JSName('clientY')
   @DomName('MouseEvent.clientY')
   @DocsEditable()
-  final int _clientY;
+  final num _clientY;
 
   @DomName('MouseEvent.ctrlKey')
   @DocsEditable()
@@ -25231,13 +27741,13 @@
   @DomName('MouseEvent.pageX')
   @DocsEditable()
   @Experimental() // untriaged
-  final int _pageX;
+  final num _pageX;
 
   @JSName('pageY')
   @DomName('MouseEvent.pageY')
   @DocsEditable()
   @Experimental() // untriaged
-  final int _pageY;
+  final num _pageY;
 
   @DomName('MouseEvent.region')
   @DocsEditable()
@@ -25258,12 +27768,12 @@
   @JSName('screenX')
   @DomName('MouseEvent.screenX')
   @DocsEditable()
-  final int _screenX;
+  final num _screenX;
 
   @JSName('screenY')
   @DomName('MouseEvent.screenY')
   @DocsEditable()
-  final int _screenY;
+  final num _screenY;
 
   @DomName('MouseEvent.shiftKey')
   @DocsEditable()
@@ -25281,9 +27791,6 @@
   @deprecated
   final Node toElement;
 
-  // Use implementation from UIEvent.
-  // final int _which;
-
   @DomName('MouseEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25482,9 +27989,13 @@
 
   @DomName('MutationObserver.observe')
   @DocsEditable()
-  void _observe(Node target, Map options) {
-    var options_1 = convertDartToNative_Dictionary(options);
-    _observe_1(target, options_1);
+  void _observe(Node target, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      _observe_1(target, options_1);
+      return;
+    }
+    _observe_2(target);
     return;
   }
 
@@ -25492,6 +28003,10 @@
   @DomName('MutationObserver.observe')
   @DocsEditable()
   void _observe_1(Node target, options) native;
+  @JSName('observe')
+  @DomName('MutationObserver.observe')
+  @DocsEditable()
+  void _observe_2(Node target) native;
 
   @DomName('MutationObserver.takeRecords')
   @DocsEditable()
@@ -25634,14 +28149,43 @@
 // for 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('NavigationPreloadManager')
+@Experimental() // untriaged
+@Native("NavigationPreloadManager")
+class NavigationPreloadManager extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NavigationPreloadManager._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('NavigationPreloadManager.disable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future disable() native;
+
+  @DomName('NavigationPreloadManager.enable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future enable() native;
+
+  @DomName('NavigationPreloadManager.getState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getState() 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.
+
 @DomName('Navigator')
 @Native("Navigator")
-class Navigator extends Interceptor
+class Navigator extends NavigatorConcurrentHardware
     implements
-        NavigatorStorageUtils,
-        NavigatorCpu,
+        NavigatorCookies,
         NavigatorLanguage,
         NavigatorOnLine,
+        NavigatorAutomationInformation,
         NavigatorID {
   @DomName('Navigator.language')
   String get language =>
@@ -25722,6 +28266,16 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('Navigator.budget')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _BudgetService budget;
+
+  @DomName('Navigator.clipboard')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _Clipboard clipboard;
+
   @DomName('Navigator.connection')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25732,6 +28286,11 @@
   @Experimental() // untriaged
   final CredentialsContainer credentials;
 
+  @DomName('Navigator.deviceMemory')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num deviceMemory;
+
   @DomName('Navigator.doNotTrack')
   @DocsEditable()
   // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
@@ -25748,11 +28307,21 @@
   @Experimental() // untriaged
   final int maxTouchPoints;
 
+  @DomName('Navigator.mediaCapabilities')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaCapabilities mediaCapabilities;
+
   @DomName('Navigator.mediaDevices')
   @DocsEditable()
   @Experimental() // untriaged
   final MediaDevices mediaDevices;
 
+  @DomName('Navigator.mediaSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaSession mediaSession;
+
   @DomName('Navigator.mimeTypes')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -25783,21 +28352,11 @@
   @Experimental() // untriaged
   final ServiceWorkerContainer serviceWorker;
 
-  @DomName('Navigator.services')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final ServicePortCollection services;
-
   @DomName('Navigator.storage')
   @DocsEditable()
   @Experimental() // untriaged
   final StorageManager storage;
 
-  @DomName('Navigator.storageQuota')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final StorageQuota storageQuota;
-
   @DomName('Navigator.vendor')
   @DocsEditable()
   @Unstable()
@@ -25808,6 +28367,11 @@
   @Unstable()
   final String vendorSub;
 
+  @DomName('Navigator.vr')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VR vr;
+
   @JSName('webkitPersistentStorage')
   @DomName('Navigator.webkitPersistentStorage')
   @DocsEditable()
@@ -25826,6 +28390,11 @@
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
   final DeprecatedStorageQuota temporaryStorage;
 
+  @DomName('Navigator.cancelKeyboardLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cancelKeyboardLock() native;
+
   @DomName('Navigator.getBattery')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25838,16 +28407,43 @@
   @Creates('_GamepadList')
   List<Gamepad> getGamepads() native;
 
-  @DomName('Navigator.getVRDevices')
+  @DomName('Navigator.getInstalledRelatedApps')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getVRDevices() native;
+  Future getInstalledRelatedApps() native;
+
+  @DomName('Navigator.getVRDisplays')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getVRDisplays() native;
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
   void registerProtocolHandler(String scheme, String url, String title) native;
 
+  @DomName('Navigator.requestKeyboardLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestKeyboardLock([List<String> keyCodes]) {
+    if (keyCodes != null) {
+      List keyCodes_1 = convertDartToNative_StringArray(keyCodes);
+      return _requestKeyboardLock_1(keyCodes_1);
+    }
+    return _requestKeyboardLock_2();
+  }
+
+  @JSName('requestKeyboardLock')
+  @DomName('Navigator.requestKeyboardLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _requestKeyboardLock_1(List keyCodes) native;
+  @JSName('requestKeyboardLock')
+  @DomName('Navigator.requestKeyboardLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _requestKeyboardLock_2() native;
+
   @DomName('Navigator.requestMIDIAccess')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25881,12 +28477,41 @@
   @Experimental() // untriaged
   bool sendBeacon(String url, Object data) native;
 
-  // From NavigatorCPU
-
-  @DomName('Navigator.hardwareConcurrency')
+  @DomName('Navigator.share')
   @DocsEditable()
   @Experimental() // untriaged
-  final int hardwareConcurrency;
+  Future share([Map data]) {
+    if (data != null) {
+      var data_1 = convertDartToNative_Dictionary(data);
+      return _share_1(data_1);
+    }
+    return _share_2();
+  }
+
+  @JSName('share')
+  @DomName('Navigator.share')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _share_1(data) native;
+  @JSName('share')
+  @DomName('Navigator.share')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _share_2() native;
+
+  // From NavigatorAutomationInformation
+
+  @DomName('Navigator.webdriver')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool webdriver;
+
+  // From NavigatorCookies
+
+  @DomName('Navigator.cookieEnabled')
+  @DocsEditable()
+  @Unstable()
+  final bool cookieEnabled;
 
   // From NavigatorID
 
@@ -25934,27 +28559,43 @@
   @DocsEditable()
   @Unstable()
   final bool onLine;
-
-  // From NavigatorStorageUtils
-
-  @DomName('Navigator.cookieEnabled')
-  @DocsEditable()
-  @Unstable()
-  final bool cookieEnabled;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('NavigatorCPU')
+@DomName('NavigatorAutomationInformation')
 @Experimental() // untriaged
-abstract class NavigatorCpu extends Interceptor {
+@Native("NavigatorAutomationInformation")
+class NavigatorAutomationInformation extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NavigatorCpu._() {
+  factory NavigatorAutomationInformation._() {
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('NavigatorAutomationInformation.webdriver')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool webdriver;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('NavigatorConcurrentHardware')
+@Experimental() // untriaged
+@Native("NavigatorConcurrentHardware")
+class NavigatorConcurrentHardware extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NavigatorConcurrentHardware._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('NavigatorConcurrentHardware.hardwareConcurrency')
+  @DocsEditable()
+  @Experimental() // untriaged
   final int hardwareConcurrency;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25962,6 +28603,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('NavigatorCookies')
+@Experimental() // untriaged
+@Native("NavigatorCookies")
+class NavigatorCookies extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NavigatorCookies._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('NavigatorCookies.cookieEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool cookieEnabled;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('NavigatorID')
 @Experimental() // untriaged
 abstract class NavigatorID extends Interceptor {
@@ -26021,25 +28681,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @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;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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()
@@ -26102,10 +28743,25 @@
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
+  @DomName('NetworkInformation.downlink')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num downlink;
+
   @DomName('NetworkInformation.downlinkMax')
   @DocsEditable()
   @Experimental() // untriaged
-  final double downlinkMax;
+  final num downlinkMax;
+
+  @DomName('NetworkInformation.effectiveType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String effectiveType;
+
+  @DomName('NetworkInformation.rtt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int rtt;
 
   @DomName('NetworkInformation.type')
   @DocsEditable()
@@ -26462,6 +29118,11 @@
   @DocsEditable()
   final Node firstChild;
 
+  @DomName('Node.isConnected')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isConnected;
+
   /**
    * The last child of this node.
    *
@@ -26612,11 +29273,6 @@
   @DocsEditable()
   String text;
 
-  @DomName('Node.treeRoot')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final Node treeRoot;
-
   @JSName('appendChild')
   /**
    * Adds a node to the end of the child [nodes] list of this node.
@@ -26659,6 +29315,28 @@
   @DocsEditable()
   bool contains(Node other) native;
 
+  @DomName('Node.getRootNode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Node getRootNode([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _getRootNode_1(options_1);
+    }
+    return _getRootNode_2();
+  }
+
+  @JSName('getRootNode')
+  @DomName('Node.getRootNode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Node _getRootNode_1(options) native;
+  @JSName('getRootNode')
+  @DomName('Node.getRootNode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Node _getRootNode_2() native;
+
   /**
    * Returns true if this node has any children.
    *
@@ -26905,6 +29583,25 @@
   @Experimental() // untriaged
   Element getElementById(String elementId) 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('NoncedElement')
+@Experimental() // untriaged
+@Native("NoncedElement")
+class NoncedElement extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NoncedElement._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('NoncedElement.nonce')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String nonce;
+}
 // 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.
@@ -27000,6 +29697,11 @@
   @Experimental() // untriaged
   final List actions;
 
+  @DomName('Notification.badge')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String badge;
+
   @DomName('Notification.body')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27022,6 +29724,11 @@
   @Experimental() // untriaged
   final String icon;
 
+  @DomName('Notification.image')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String image;
+
   @DomName('Notification.lang')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27144,6 +29851,11 @@
   @DocsEditable()
   @Experimental() // untriaged
   final Notification notification;
+
+  @DomName('NotificationEvent.reply')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String reply;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27160,33 +29872,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('NumberValue')
-@Experimental() // untriaged
-@Native("NumberValue")
-class NumberValue extends StyleValue {
-  // To suppress missing implicit constructor warnings.
-  factory NumberValue._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('NumberValue.NumberValue')
-  @DocsEditable()
-  factory NumberValue(num value) {
-    return NumberValue._create_1(value);
-  }
-  static NumberValue _create_1(value) =>
-      JS('NumberValue', 'new NumberValue(#)', value);
-
-  @DomName('NumberValue.value')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@DocsEditable()
 @DomName('HTMLOListElement')
 @Native("HTMLOListElement")
 class OListElement extends HtmlElement {
@@ -27251,6 +29936,19 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('object');
 
+  @DomName('HTMLObjectElement.contentWindow')
+  @DocsEditable()
+  @Experimental() // untriaged
+  WindowBase get contentWindow =>
+      _convertNativeToDart_Window(this._get_contentWindow);
+  @JSName('contentWindow')
+  @DomName('HTMLObjectElement.contentWindow')
+  @DocsEditable()
+  @Experimental() // untriaged
+  @Creates('Window|=Object')
+  @Returns('Window|=Object')
+  final dynamic _get_contentWindow;
+
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
   String data;
@@ -27293,11 +29991,11 @@
 
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) native;
+  Node __getter__(String name) native;
 
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) native;
+  void __setter__(String name, Node value) native;
 
   @DomName('HTMLObjectElement.checkValidity')
   @DocsEditable()
@@ -27320,7 +30018,7 @@
 @DomName('OffscreenCanvas')
 @Experimental() // untriaged
 @Native("OffscreenCanvas")
-class OffscreenCanvas extends Interceptor {
+class OffscreenCanvas extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory OffscreenCanvas._() {
     throw new UnsupportedError("Not supported");
@@ -27343,6 +30041,486 @@
   @DocsEditable()
   @Experimental() // untriaged
   int width;
+
+  @DomName('OffscreenCanvas.convertToBlob')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future convertToBlob([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _convertToBlob_1(options_1);
+    }
+    return _convertToBlob_2();
+  }
+
+  @JSName('convertToBlob')
+  @DomName('OffscreenCanvas.convertToBlob')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _convertToBlob_1(options) native;
+  @JSName('convertToBlob')
+  @DomName('OffscreenCanvas.convertToBlob')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _convertToBlob_2() native;
+
+  @DomName('OffscreenCanvas.getContext')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getContext(String contextType, [Map attributes]) {
+    if (attributes != null) {
+      var attributes_1 = convertDartToNative_Dictionary(attributes);
+      return _getContext_1(contextType, attributes_1);
+    }
+    return _getContext_2(contextType);
+  }
+
+  @JSName('getContext')
+  @DomName('OffscreenCanvas.getContext')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object _getContext_1(contextType, attributes) native;
+  @JSName('getContext')
+  @DomName('OffscreenCanvas.getContext')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object _getContext_2(contextType) native;
+
+  @DomName('OffscreenCanvas.transferToImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ImageBitmap transferToImageBitmap() 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('OffscreenCanvasRenderingContext2D')
+@Experimental() // untriaged
+@Native("OffscreenCanvasRenderingContext2D")
+class OffscreenCanvasRenderingContext2D extends Interceptor
+    implements _CanvasPath {
+  // To suppress missing implicit constructor warnings.
+  factory OffscreenCanvasRenderingContext2D._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('OffscreenCanvasRenderingContext2D.canvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final OffscreenCanvas canvas;
+
+  @DomName('OffscreenCanvasRenderingContext2D.direction')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String direction;
+
+  @DomName('OffscreenCanvasRenderingContext2D.fillStyle')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object fillStyle;
+
+  @DomName('OffscreenCanvasRenderingContext2D.filter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String filter;
+
+  @DomName('OffscreenCanvasRenderingContext2D.font')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String font;
+
+  @DomName('OffscreenCanvasRenderingContext2D.globalAlpha')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num globalAlpha;
+
+  @DomName('OffscreenCanvasRenderingContext2D.globalCompositeOperation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String globalCompositeOperation;
+
+  @DomName('OffscreenCanvasRenderingContext2D.imageSmoothingEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool imageSmoothingEnabled;
+
+  @DomName('OffscreenCanvasRenderingContext2D.imageSmoothingQuality')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String imageSmoothingQuality;
+
+  @DomName('OffscreenCanvasRenderingContext2D.lineCap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String lineCap;
+
+  @DomName('OffscreenCanvasRenderingContext2D.lineDashOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num lineDashOffset;
+
+  @DomName('OffscreenCanvasRenderingContext2D.lineJoin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String lineJoin;
+
+  @DomName('OffscreenCanvasRenderingContext2D.lineWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num lineWidth;
+
+  @DomName('OffscreenCanvasRenderingContext2D.miterLimit')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num miterLimit;
+
+  @DomName('OffscreenCanvasRenderingContext2D.shadowBlur')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num shadowBlur;
+
+  @DomName('OffscreenCanvasRenderingContext2D.shadowColor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String shadowColor;
+
+  @DomName('OffscreenCanvasRenderingContext2D.shadowOffsetX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num shadowOffsetX;
+
+  @DomName('OffscreenCanvasRenderingContext2D.shadowOffsetY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num shadowOffsetY;
+
+  @DomName('OffscreenCanvasRenderingContext2D.strokeStyle')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object strokeStyle;
+
+  @DomName('OffscreenCanvasRenderingContext2D.textAlign')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String textAlign;
+
+  @DomName('OffscreenCanvasRenderingContext2D.textBaseline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String textBaseline;
+
+  @DomName('OffscreenCanvasRenderingContext2D.beginPath')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void beginPath() native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.clearRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearRect(num x, num y, num width, num height) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.clip')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clip([Path2D path]) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.commit')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future commit() native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ImageData createImageData(data_OR_imagedata_OR_sw,
+      [int sh_OR_sw,
+      imageDataColorSettings_OR_sh,
+      Map imageDataColorSettings]) {
+    if ((data_OR_imagedata_OR_sw is ImageData) &&
+        sh_OR_sw == null &&
+        imageDataColorSettings_OR_sh == null &&
+        imageDataColorSettings == null) {
+      var imagedata_1 = convertDartToNative_ImageData(data_OR_imagedata_OR_sw);
+      return convertNativeToDart_ImageData(_createImageData_1(imagedata_1));
+    }
+    if (sh_OR_sw != null &&
+        (data_OR_imagedata_OR_sw is int) &&
+        imageDataColorSettings_OR_sh == null &&
+        imageDataColorSettings == null) {
+      return convertNativeToDart_ImageData(
+          _createImageData_2(data_OR_imagedata_OR_sw, sh_OR_sw));
+    }
+    if ((imageDataColorSettings_OR_sh is Map) &&
+        sh_OR_sw != null &&
+        (data_OR_imagedata_OR_sw is int) &&
+        imageDataColorSettings == null) {
+      var imageDataColorSettings_1 =
+          convertDartToNative_Dictionary(imageDataColorSettings_OR_sh);
+      return convertNativeToDart_ImageData(_createImageData_3(
+          data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_1));
+    }
+    if (imageDataColorSettings != null &&
+        (imageDataColorSettings_OR_sh is int) &&
+        sh_OR_sw != null &&
+        data_OR_imagedata_OR_sw != null) {
+      var imageDataColorSettings_1 =
+          convertDartToNative_Dictionary(imageDataColorSettings);
+      return convertNativeToDart_ImageData(_createImageData_4(
+          data_OR_imagedata_OR_sw,
+          sh_OR_sw,
+          imageDataColorSettings_OR_sh,
+          imageDataColorSettings_1));
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @JSName('createImageData')
+  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _createImageData_1(imagedata) native;
+  @JSName('createImageData')
+  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _createImageData_2(int sw, sh) native;
+  @JSName('createImageData')
+  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _createImageData_3(int sw, sh, imageDataColorSettings) native;
+  @JSName('createImageData')
+  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _createImageData_4(data, sw, int sh, imageDataColorSettings) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.createLinearGradient')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.createPattern')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasPattern createPattern(
+      /*CanvasImageSource*/ image,
+      String repetitionType) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.createRadialGradient')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasGradient createRadialGradient(
+      num x0, num y0, num r0, num x1, num y1, num r1) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.drawImage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawImage(/*CanvasImageSource*/ 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]) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.fill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void fill([path_OR_winding, String winding]) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.fillRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void fillRect(num x, num y, num width, num height) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.fillText')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void fillText(String text, num x, num y, [num maxWidth]) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.getImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ImageData getImageData(int sx, int sy, int sw, int sh) {
+    return convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
+  }
+
+  @JSName('getImageData')
+  @DomName('OffscreenCanvasRenderingContext2D.getImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _getImageData_1(sx, sy, sw, sh) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.getLineDash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<num> getLineDash() native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.isPointInPath')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding])
+      native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.isPointInStroke')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.measureText')
+  @DocsEditable()
+  @Experimental() // untriaged
+  TextMetrics measureText(String text) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.putImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void putImageData(ImageData imagedata, int dx, int dy,
+      [int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight]) {
+    if (dirtyX == null &&
+        dirtyY == null &&
+        dirtyWidth == null &&
+        dirtyHeight == null) {
+      var imagedata_1 = convertDartToNative_ImageData(imagedata);
+      _putImageData_1(imagedata_1, dx, dy);
+      return;
+    }
+    if (dirtyHeight != null &&
+        dirtyWidth != null &&
+        dirtyY != null &&
+        dirtyX != null) {
+      var imagedata_1 = convertDartToNative_ImageData(imagedata);
+      _putImageData_2(
+          imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @JSName('putImageData')
+  @DomName('OffscreenCanvasRenderingContext2D.putImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _putImageData_1(imagedata, dx, dy) native;
+  @JSName('putImageData')
+  @DomName('OffscreenCanvasRenderingContext2D.putImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _putImageData_2(
+      imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.resetTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void resetTransform() native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.restore')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void restore() native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.rotate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void rotate(num angle) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.save')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void save() native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.scale')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scale(num x, num y) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.setLineDash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setLineDash(List<num> dash) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.setTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setTransform(num a, num b, num c, num d, num e, num f) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.stroke')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stroke([Path2D path]) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.strokeRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void strokeRect(num x, num y, num width, num height) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.strokeText')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void strokeText(String text, num x, num y, [num maxWidth]) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.transform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void transform(num a, num b, num c, num d, num e, num f) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.translate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void translate(num x, num y) native;
+
+  // From CanvasPath
+
+  @DomName('OffscreenCanvasRenderingContext2D.arc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void arc(num x, num y, num radius, num startAngle, num endAngle,
+      bool anticlockwise) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.arcTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void arcTo(num x1, num y1, num x2, num y2, num radius) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.bezierCurveTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y)
+      native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.closePath')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void closePath() native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.ellipse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation,
+      num startAngle, num endAngle, bool anticlockwise) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.lineTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void lineTo(num x, num y) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.moveTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void moveTo(num x, num y) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.quadraticCurveTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
+
+  @DomName('OffscreenCanvasRenderingContext2D.rect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void rect(num x, num y, num width, num 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
@@ -27463,6 +30641,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('OrientationSensor')
+@Experimental() // untriaged
+@Native("OrientationSensor")
+class OrientationSensor extends Sensor {
+  // To suppress missing implicit constructor warnings.
+  factory OrientationSensor._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('OrientationSensor.quaternion')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<num> quaternion;
+
+  @DomName('OrientationSensor.populateMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void populateMatrix(Object targetBuffer) 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('HTMLOutputElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -27548,6 +30750,46 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('OverconstrainedError')
+@Experimental() // untriaged
+@Native("OverconstrainedError")
+class OverconstrainedError extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory OverconstrainedError._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('OverconstrainedError.OverconstrainedError')
+  @DocsEditable()
+  factory OverconstrainedError(String constraint, String message) {
+    return OverconstrainedError._create_1(constraint, message);
+  }
+  static OverconstrainedError _create_1(constraint, message) => JS(
+      'OverconstrainedError',
+      'new OverconstrainedError(#,#)',
+      constraint,
+      message);
+
+  @DomName('OverconstrainedError.constraint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String constraint;
+
+  @DomName('OverconstrainedError.message')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String message;
+
+  @DomName('OverconstrainedError.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('PageTransitionEvent')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#pagetransitionevent
 @Experimental()
@@ -27584,6 +30826,328 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('PaintRenderingContext2D')
+@Experimental() // untriaged
+@Native("PaintRenderingContext2D")
+class PaintRenderingContext2D extends Interceptor implements _CanvasPath {
+  // To suppress missing implicit constructor warnings.
+  factory PaintRenderingContext2D._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaintRenderingContext2D.currentTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Matrix currentTransform;
+
+  @DomName('PaintRenderingContext2D.fillStyle')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object fillStyle;
+
+  @DomName('PaintRenderingContext2D.filter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String filter;
+
+  @DomName('PaintRenderingContext2D.globalAlpha')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num globalAlpha;
+
+  @DomName('PaintRenderingContext2D.globalCompositeOperation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String globalCompositeOperation;
+
+  @DomName('PaintRenderingContext2D.imageSmoothingEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool imageSmoothingEnabled;
+
+  @DomName('PaintRenderingContext2D.imageSmoothingQuality')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String imageSmoothingQuality;
+
+  @DomName('PaintRenderingContext2D.lineCap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String lineCap;
+
+  @DomName('PaintRenderingContext2D.lineDashOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num lineDashOffset;
+
+  @DomName('PaintRenderingContext2D.lineJoin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String lineJoin;
+
+  @DomName('PaintRenderingContext2D.lineWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num lineWidth;
+
+  @DomName('PaintRenderingContext2D.miterLimit')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num miterLimit;
+
+  @DomName('PaintRenderingContext2D.shadowBlur')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num shadowBlur;
+
+  @DomName('PaintRenderingContext2D.shadowColor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String shadowColor;
+
+  @DomName('PaintRenderingContext2D.shadowOffsetX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num shadowOffsetX;
+
+  @DomName('PaintRenderingContext2D.shadowOffsetY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num shadowOffsetY;
+
+  @DomName('PaintRenderingContext2D.strokeStyle')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object strokeStyle;
+
+  @DomName('PaintRenderingContext2D.beginPath')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void beginPath() native;
+
+  @DomName('PaintRenderingContext2D.clearRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearRect(num x, num y, num width, num height) native;
+
+  @DomName('PaintRenderingContext2D.clip')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clip([path_OR_winding, String winding]) native;
+
+  @DomName('PaintRenderingContext2D.createLinearGradient')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
+
+  @DomName('PaintRenderingContext2D.createPattern')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasPattern createPattern(
+      /*CanvasImageSource*/ image,
+      String repetitionType) native;
+
+  @DomName('PaintRenderingContext2D.createRadialGradient')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasGradient createRadialGradient(
+      num x0, num y0, num r0, num x1, num y1, num r1) native;
+
+  @DomName('PaintRenderingContext2D.drawImage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawImage(/*CanvasImageSource*/ 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]) native;
+
+  @DomName('PaintRenderingContext2D.fill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void fill([path_OR_winding, String winding]) native;
+
+  @DomName('PaintRenderingContext2D.fillRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void fillRect(num x, num y, num width, num height) native;
+
+  @DomName('PaintRenderingContext2D.getLineDash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<num> getLineDash() native;
+
+  @DomName('PaintRenderingContext2D.isPointInPath')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding])
+      native;
+
+  @DomName('PaintRenderingContext2D.isPointInStroke')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) native;
+
+  @DomName('PaintRenderingContext2D.resetTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void resetTransform() native;
+
+  @DomName('PaintRenderingContext2D.restore')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void restore() native;
+
+  @DomName('PaintRenderingContext2D.rotate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void rotate(num angle) native;
+
+  @DomName('PaintRenderingContext2D.save')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void save() native;
+
+  @DomName('PaintRenderingContext2D.scale')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scale(num x, num y) native;
+
+  @DomName('PaintRenderingContext2D.setLineDash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setLineDash(List<num> dash) native;
+
+  @DomName('PaintRenderingContext2D.setTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setTransform(num a, num b, num c, num d, num e, num f) native;
+
+  @DomName('PaintRenderingContext2D.stroke')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stroke([Path2D path]) native;
+
+  @DomName('PaintRenderingContext2D.strokeRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void strokeRect(num x, num y, num width, num height) native;
+
+  @DomName('PaintRenderingContext2D.transform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void transform(num a, num b, num c, num d, num e, num f) native;
+
+  @DomName('PaintRenderingContext2D.translate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void translate(num x, num y) native;
+
+  // From CanvasPath
+
+  @DomName('PaintRenderingContext2D.arc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void arc(num x, num y, num radius, num startAngle, num endAngle,
+      bool anticlockwise) native;
+
+  @DomName('PaintRenderingContext2D.arcTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void arcTo(num x1, num y1, num x2, num y2, num radius) native;
+
+  @DomName('PaintRenderingContext2D.bezierCurveTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y)
+      native;
+
+  @DomName('PaintRenderingContext2D.closePath')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void closePath() native;
+
+  @DomName('PaintRenderingContext2D.ellipse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation,
+      num startAngle, num endAngle, bool anticlockwise) native;
+
+  @DomName('PaintRenderingContext2D.lineTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void lineTo(num x, num y) native;
+
+  @DomName('PaintRenderingContext2D.moveTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void moveTo(num x, num y) native;
+
+  @DomName('PaintRenderingContext2D.quadraticCurveTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
+
+  @DomName('PaintRenderingContext2D.rect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void rect(num x, num y, num width, num 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('PaintSize')
+@Experimental() // untriaged
+@Native("PaintSize")
+class PaintSize extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PaintSize._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaintSize.height')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num height;
+
+  @DomName('PaintSize.width')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num 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('PaintWorkletGlobalScope')
+@Experimental() // untriaged
+@Native("PaintWorkletGlobalScope")
+class PaintWorkletGlobalScope extends WorkletGlobalScope {
+  // To suppress missing implicit constructor warnings.
+  factory PaintWorkletGlobalScope._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaintWorkletGlobalScope.devicePixelRatio')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num devicePixelRatio;
+
+  @DomName('PaintWorkletGlobalScope.registerPaint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void registerPaint(String name, Object paintCtor) 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('HTMLParagraphElement')
 @Native("HTMLParagraphElement")
 class ParagraphElement extends HtmlElement {
@@ -27675,7 +31239,7 @@
 @DomName('PasswordCredential')
 @Experimental() // untriaged
 @Native("PasswordCredential")
-class PasswordCredential extends Credential {
+class PasswordCredential extends Credential implements CredentialUserData {
   // To suppress missing implicit constructor warnings.
   factory PasswordCredential._() {
     throw new UnsupportedError("Not supported");
@@ -27683,12 +31247,20 @@
 
   @DomName('PasswordCredential.PasswordCredential')
   @DocsEditable()
-  factory PasswordCredential(Map data) {
-    var data_1 = convertDartToNative_Dictionary(data);
-    return PasswordCredential._create_1(data_1);
+  factory PasswordCredential(data_OR_form) {
+    if ((data_OR_form is Map)) {
+      var data_1 = convertDartToNative_Dictionary(data_OR_form);
+      return PasswordCredential._create_1(data_1);
+    }
+    if ((data_OR_form is FormElement)) {
+      return PasswordCredential._create_2(data_OR_form);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static PasswordCredential _create_1(data) =>
-      JS('PasswordCredential', 'new PasswordCredential(#)', data);
+  static PasswordCredential _create_1(data_OR_form) =>
+      JS('PasswordCredential', 'new PasswordCredential(#)', data_OR_form);
+  static PasswordCredential _create_2(data_OR_form) =>
+      JS('PasswordCredential', 'new PasswordCredential(#)', data_OR_form);
 
   @DomName('PasswordCredential.additionalData')
   @DocsEditable()
@@ -27700,10 +31272,28 @@
   @Experimental() // untriaged
   String idName;
 
+  @DomName('PasswordCredential.password')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String password;
+
   @DomName('PasswordCredential.passwordName')
   @DocsEditable()
   @Experimental() // untriaged
   String passwordName;
+
+  // From CredentialUserData
+
+  @JSName('iconURL')
+  @DomName('PasswordCredential.iconURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String iconUrl;
+
+  @DomName('PasswordCredential.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
@@ -27713,7 +31303,7 @@
 @DomName('Path2D')
 @Experimental() // untriaged
 @Native("Path2D")
-class Path2D extends Interceptor implements _CanvasPathMethods {
+class Path2D extends Interceptor implements _CanvasPath {
   // To suppress missing implicit constructor warnings.
   factory Path2D._() {
     throw new UnsupportedError("Not supported");
@@ -27744,7 +31334,7 @@
   @Experimental() // untriaged
   void addPath(Path2D path, [Matrix transform]) native;
 
-  // From CanvasPathMethods
+  // From CanvasPath
 
   @DomName('Path2D.arc')
   @DocsEditable()
@@ -27799,6 +31389,391 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('PaymentAddress')
+@Experimental() // untriaged
+@Native("PaymentAddress")
+class PaymentAddress extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PaymentAddress._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaymentAddress.addressLine')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<String> addressLine;
+
+  @DomName('PaymentAddress.city')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String city;
+
+  @DomName('PaymentAddress.country')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String country;
+
+  @DomName('PaymentAddress.dependentLocality')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String dependentLocality;
+
+  @DomName('PaymentAddress.languageCode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String languageCode;
+
+  @DomName('PaymentAddress.organization')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String organization;
+
+  @DomName('PaymentAddress.phone')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String phone;
+
+  @DomName('PaymentAddress.postalCode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String postalCode;
+
+  @DomName('PaymentAddress.recipient')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String recipient;
+
+  @DomName('PaymentAddress.region')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String region;
+
+  @DomName('PaymentAddress.sortingCode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String sortingCode;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PaymentInstruments')
+@Experimental() // untriaged
+@Native("PaymentInstruments")
+class PaymentInstruments extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PaymentInstruments._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaymentInstruments.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future clear() native;
+
+  @DomName('PaymentInstruments.delete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future delete(String instrumentKey) native;
+
+  @DomName('PaymentInstruments.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future get(String instrumentKey) native;
+
+  @DomName('PaymentInstruments.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future has(String instrumentKey) native;
+
+  @DomName('PaymentInstruments.keys')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future keys() native;
+
+  @DomName('PaymentInstruments.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future set(String instrumentKey, Map details) {
+    var details_1 = convertDartToNative_Dictionary(details);
+    return _set_1(instrumentKey, details_1);
+  }
+
+  @JSName('set')
+  @DomName('PaymentInstruments.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _set_1(instrumentKey, details) 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('PaymentManager')
+@Experimental() // untriaged
+@Native("PaymentManager")
+class PaymentManager extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PaymentManager._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaymentManager.instruments')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PaymentInstruments instruments;
+
+  @DomName('PaymentManager.userHint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String userHint;
+}
+// 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.
+
+@DocsEditable()
+@DomName('PaymentRequest')
+@Experimental() // untriaged
+@Native("PaymentRequest")
+class PaymentRequest extends EventTarget {
+  factory PaymentRequest(List<Map> methodData, Map details, [Map options]) {
+    var methodData_1 = [];
+    for (var i in methodData) {
+      methodData_1.add(convertDartToNative_Dictionary(i));
+    }
+    if (options != null) {
+      var details_1 = convertDartToNative_Dictionary(details);
+      var options_2 = convertDartToNative_Dictionary(options);
+      return PaymentRequest._create_1(methodData_1, details_1, options_2);
+    }
+    var details_1 = convertDartToNative_Dictionary(details);
+    return PaymentRequest._create_2(methodData_1, details_1);
+  }
+
+  static PaymentRequest _create_1(methodData, details, options) => JS(
+      'PaymentRequest',
+      'new PaymentRequest(#,#,#)',
+      methodData,
+      details,
+      options);
+  static PaymentRequest _create_2(methodData, details) =>
+      JS('PaymentRequest', 'new PaymentRequest(#,#)', methodData, details);
+
+  // To suppress missing implicit constructor warnings.
+  factory PaymentRequest._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaymentRequest.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('PaymentRequest.shippingAddress')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PaymentAddress shippingAddress;
+
+  @DomName('PaymentRequest.shippingOption')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String shippingOption;
+
+  @DomName('PaymentRequest.shippingType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String shippingType;
+
+  @DomName('PaymentRequest.abort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future abort() native;
+
+  @DomName('PaymentRequest.canMakePayment')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future canMakePayment() native;
+
+  @DomName('PaymentRequest.show')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future show() 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('PaymentRequestEvent')
+@Experimental() // untriaged
+@Native("PaymentRequestEvent")
+class PaymentRequestEvent extends ExtendableEvent {
+  // To suppress missing implicit constructor warnings.
+  factory PaymentRequestEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaymentRequestEvent.PaymentRequestEvent')
+  @DocsEditable()
+  factory PaymentRequestEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return PaymentRequestEvent._create_1(type, eventInitDict_1);
+  }
+  static PaymentRequestEvent _create_1(type, eventInitDict) => JS(
+      'PaymentRequestEvent',
+      'new PaymentRequestEvent(#,#)',
+      type,
+      eventInitDict);
+
+  @DomName('PaymentRequestEvent.instrumentKey')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String instrumentKey;
+
+  @DomName('PaymentRequestEvent.methodData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List methodData;
+
+  @DomName('PaymentRequestEvent.modifiers')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List modifiers;
+
+  @DomName('PaymentRequestEvent.paymentRequestId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String paymentRequestId;
+
+  @DomName('PaymentRequestEvent.paymentRequestOrigin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String paymentRequestOrigin;
+
+  @DomName('PaymentRequestEvent.topLevelOrigin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String topLevelOrigin;
+
+  @DomName('PaymentRequestEvent.total')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Object total;
+
+  @DomName('PaymentRequestEvent.openWindow')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future openWindow(String url) native;
+
+  @DomName('PaymentRequestEvent.respondWith')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void 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
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('PaymentRequestUpdateEvent')
+@Experimental() // untriaged
+@Native("PaymentRequestUpdateEvent")
+class PaymentRequestUpdateEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory PaymentRequestUpdateEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaymentRequestUpdateEvent.PaymentRequestUpdateEvent')
+  @DocsEditable()
+  factory PaymentRequestUpdateEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return PaymentRequestUpdateEvent._create_1(type, eventInitDict_1);
+    }
+    return PaymentRequestUpdateEvent._create_2(type);
+  }
+  static PaymentRequestUpdateEvent _create_1(type, eventInitDict) => JS(
+      'PaymentRequestUpdateEvent',
+      'new PaymentRequestUpdateEvent(#,#)',
+      type,
+      eventInitDict);
+  static PaymentRequestUpdateEvent _create_2(type) =>
+      JS('PaymentRequestUpdateEvent', 'new PaymentRequestUpdateEvent(#)', type);
+
+  @DomName('PaymentRequestUpdateEvent.updateWith')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void updateWith(Future detailsPromise) 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('PaymentResponse')
+@Experimental() // untriaged
+@Native("PaymentResponse")
+class PaymentResponse extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PaymentResponse._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PaymentResponse.details')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Object details;
+
+  @DomName('PaymentResponse.methodName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String methodName;
+
+  @DomName('PaymentResponse.payerEmail')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String payerEmail;
+
+  @DomName('PaymentResponse.payerName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String payerName;
+
+  @DomName('PaymentResponse.payerPhone')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String payerPhone;
+
+  @DomName('PaymentResponse.requestId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String requestId;
+
+  @DomName('PaymentResponse.shippingAddress')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PaymentAddress shippingAddress;
+
+  @DomName('PaymentResponse.shippingOption')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String shippingOption;
+
+  @DomName('PaymentResponse.complete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future complete([String paymentResult]) 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('Performance')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -27822,15 +31797,15 @@
   @DocsEditable()
   final PerformanceNavigation navigation;
 
+  @DomName('Performance.timeOrigin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num timeOrigin;
+
   @DomName('Performance.timing')
   @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
@@ -27882,11 +31857,6 @@
   @DocsEditable()
   double now() native;
 
-  @DomName('Performance.setFrameTimingBufferSize')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void setFrameTimingBufferSize(int maxSize) native;
-
   @DomName('Performance.setResourceTimingBufferSize')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27897,25 +31867,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @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()
@@ -27928,7 +31879,7 @@
 
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  final double duration;
+  final num duration;
 
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
@@ -27940,7 +31891,26 @@
 
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  final double startTime;
+  final num startTime;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PerformanceLongTaskTiming')
+@Experimental() // untriaged
+@Native("PerformanceLongTaskTiming")
+class PerformanceLongTaskTiming extends PerformanceEntry {
+  // To suppress missing implicit constructor warnings.
+  factory PerformanceLongTaskTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PerformanceLongTaskTiming.attribution')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<TaskAttributionTiming> attribution;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28015,6 +31985,70 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('PerformanceNavigationTiming')
+@Experimental() // untriaged
+@Native("PerformanceNavigationTiming")
+class PerformanceNavigationTiming extends PerformanceResourceTiming {
+  // To suppress missing implicit constructor warnings.
+  factory PerformanceNavigationTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PerformanceNavigationTiming.domComplete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num domComplete;
+
+  @DomName('PerformanceNavigationTiming.domContentLoadedEventEnd')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num domContentLoadedEventEnd;
+
+  @DomName('PerformanceNavigationTiming.domContentLoadedEventStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num domContentLoadedEventStart;
+
+  @DomName('PerformanceNavigationTiming.domInteractive')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num domInteractive;
+
+  @DomName('PerformanceNavigationTiming.loadEventEnd')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num loadEventEnd;
+
+  @DomName('PerformanceNavigationTiming.loadEventStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num loadEventStart;
+
+  @DomName('PerformanceNavigationTiming.redirectCount')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int redirectCount;
+
+  @DomName('PerformanceNavigationTiming.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+
+  @DomName('PerformanceNavigationTiming.unloadEventEnd')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num unloadEventEnd;
+
+  @DomName('PerformanceNavigationTiming.unloadEventStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num unloadEventStart;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PerformanceObserver')
 @Experimental() // untriaged
 @Native("PerformanceObserver")
@@ -28024,6 +32058,14 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('PerformanceObserver.PerformanceObserver')
+  @DocsEditable()
+  factory PerformanceObserver(PerformanceObserverCallback callback) {
+    return PerformanceObserver._create_1(callback);
+  }
+  static PerformanceObserver _create_1(callback) =>
+      JS('PerformanceObserver', 'new PerformanceObserver(#)', callback);
+
   @DomName('PerformanceObserver.disconnect')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28048,6 +32090,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('PerformanceObserverCallback')
+@Experimental() // untriaged
+typedef void PerformanceObserverCallback(
+    PerformanceObserverEntryList entries, PerformanceObserver observer);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 @DocsEditable()
 @DomName('PerformanceObserverEntryList')
 @Experimental() // untriaged
@@ -28078,19 +32130,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('PerformanceRenderTiming')
+@DomName('PerformancePaintTiming')
 @Experimental() // untriaged
-@Native("PerformanceRenderTiming")
-class PerformanceRenderTiming extends PerformanceEntry {
+@Native("PerformancePaintTiming")
+class PerformancePaintTiming extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceRenderTiming._() {
+  factory PerformancePaintTiming._() {
     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
@@ -28109,59 +32156,113 @@
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  final double connectEnd;
+  final num connectEnd;
 
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  final double connectStart;
+  final num connectStart;
+
+  @DomName('PerformanceResourceTiming.decodedBodySize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int decodedBodySize;
 
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  final double domainLookupEnd;
+  final num domainLookupEnd;
 
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  final double domainLookupStart;
+  final num domainLookupStart;
+
+  @DomName('PerformanceResourceTiming.encodedBodySize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int encodedBodySize;
 
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  final double fetchStart;
+  final num fetchStart;
 
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
   final String initiatorType;
 
+  @DomName('PerformanceResourceTiming.nextHopProtocol')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String nextHopProtocol;
+
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  final double redirectEnd;
+  final num redirectEnd;
 
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  final double redirectStart;
+  final num redirectStart;
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  final double requestStart;
+  final num requestStart;
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  final double responseEnd;
+  final num responseEnd;
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  final double responseStart;
+  final num responseStart;
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  final double secureConnectionStart;
+  final num secureConnectionStart;
+
+  @DomName('PerformanceResourceTiming.serverTiming')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<PerformanceServerTiming> serverTiming;
+
+  @DomName('PerformanceResourceTiming.transferSize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int transferSize;
 
   @DomName('PerformanceResourceTiming.workerStart')
   @DocsEditable()
   @Experimental() // untriaged
-  final double workerStart;
+  final num 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
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('PerformanceServerTiming')
+@Experimental() // untriaged
+@Native("PerformanceServerTiming")
+class PerformanceServerTiming extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PerformanceServerTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PerformanceServerTiming.description')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String description;
+
+  @DomName('PerformanceServerTiming.duration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num duration;
+
+  @DomName('PerformanceServerTiming.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
@@ -28357,27 +32458,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('Perspective')
+@DomName('PhotoCapabilities')
 @Experimental() // untriaged
-@Native("Perspective")
-class Perspective extends TransformComponent {
+@Native("PhotoCapabilities")
+class PhotoCapabilities extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Perspective._() {
+  factory PhotoCapabilities._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Perspective.Perspective')
-  @DocsEditable()
-  factory Perspective(LengthValue length) {
-    return Perspective._create_1(length);
-  }
-  static Perspective _create_1(length) =>
-      JS('Perspective', 'new Perspective(#)', length);
-
-  @DomName('Perspective.length')
+  @DomName('PhotoCapabilities.fillLightMode')
   @DocsEditable()
   @Experimental() // untriaged
-  final LengthValue length;
+  final List fillLightMode;
+
+  @DomName('PhotoCapabilities.imageHeight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaSettingsRange imageHeight;
+
+  @DomName('PhotoCapabilities.imageWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaSettingsRange imageWidth;
+
+  @DomName('PhotoCapabilities.redEyeReduction')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String redEyeReduction;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28543,7 +32651,7 @@
   @DomName('PointerEvent.height')
   @DocsEditable()
   @Experimental() // untriaged
-  final double height;
+  final num height;
 
   @DomName('PointerEvent.isPrimary')
   @DocsEditable()
@@ -28563,7 +32671,12 @@
   @DomName('PointerEvent.pressure')
   @DocsEditable()
   @Experimental() // untriaged
-  final double pressure;
+  final num pressure;
+
+  @DomName('PointerEvent.tangentialPressure')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num tangentialPressure;
 
   @DomName('PointerEvent.tiltX')
   @DocsEditable()
@@ -28575,10 +32688,20 @@
   @Experimental() // untriaged
   final int tiltY;
 
+  @DomName('PointerEvent.twist')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int twist;
+
   @DomName('PointerEvent.width')
   @DocsEditable()
   @Experimental() // untriaged
-  final double width;
+  final num width;
+
+  @DomName('PointerEvent.getCoalescedEvents')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<PointerEvent> getCoalescedEvents() 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
@@ -28679,67 +32802,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @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('PositionValue')
-@Experimental() // untriaged
-@Native("PositionValue")
-class PositionValue extends StyleValue {
-  // To suppress missing implicit constructor warnings.
-  factory PositionValue._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('PositionValue.PositionValue')
-  @DocsEditable()
-  factory PositionValue(LengthValue x, LengthValue y) {
-    return PositionValue._create_1(x, y);
-  }
-  static PositionValue _create_1(x, y) =>
-      JS('PositionValue', 'new PositionValue(#,#)', x, y);
-
-  @DomName('PositionValue.x')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final LengthValue x;
-
-  @DomName('PositionValue.y')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final LengthValue 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.
-
-@DocsEditable()
 @DomName('HTMLPreElement')
 @Native("HTMLPreElement")
 class PreElement extends HtmlElement {
@@ -28848,6 +32910,11 @@
   @Experimental() // untriaged
   final String state;
 
+  @DomName('PresentationConnection.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String url;
+
   @DomName('PresentationConnection.close')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28940,24 +33007,38 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('PresentationConnectionList')
+@Experimental() // untriaged
+@Native("PresentationConnectionList")
+class PresentationConnectionList extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory PresentationConnectionList._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PresentationConnectionList.connections')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<PresentationConnection> connections;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('PresentationReceiver')
 @Experimental() // untriaged
 @Native("PresentationReceiver")
-class PresentationReceiver extends EventTarget {
+class PresentationReceiver extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory PresentationReceiver._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PresentationReceiver.getConnection')
+  @DomName('PresentationReceiver.connectionList')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getConnection() native;
-
-  @DomName('PresentationReceiver.getConnections')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future getConnections() native;
+  final Future connectionList;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28975,11 +33056,20 @@
 
   @DomName('PresentationRequest.PresentationRequest')
   @DocsEditable()
-  factory PresentationRequest(String url) {
-    return PresentationRequest._create_1(url);
+  factory PresentationRequest(url_OR_urls) {
+    if ((url_OR_urls is String)) {
+      return PresentationRequest._create_1(url_OR_urls);
+    }
+    if ((url_OR_urls is List<String>)) {
+      List urls_1 = convertDartToNative_StringArray(url_OR_urls);
+      return PresentationRequest._create_2(urls_1);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static PresentationRequest _create_1(url) =>
-      JS('PresentationRequest', 'new PresentationRequest(#)', url);
+  static PresentationRequest _create_1(url_OR_urls) =>
+      JS('PresentationRequest', 'new PresentationRequest(#)', url_OR_urls);
+  static PresentationRequest _create_2(url_OR_urls) =>
+      JS('PresentationRequest', 'new PresentationRequest(#)', url_OR_urls);
 
   @DomName('PresentationRequest.getAvailability')
   @DocsEditable()
@@ -29062,7 +33152,7 @@
 
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  final double position;
+  final num position;
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
@@ -29148,6 +33238,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('PublicKeyCredential')
+@Experimental() // untriaged
+@Native("PublicKeyCredential")
+class PublicKeyCredential extends Credential {
+  // To suppress missing implicit constructor warnings.
+  factory PublicKeyCredential._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PublicKeyCredential.rawId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final ByteBuffer rawId;
+
+  @DomName('PublicKeyCredential.response')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AuthenticatorResponse 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.
+
+@DocsEditable()
 @DomName('PushEvent')
 @Experimental() // untriaged
 @Native("PushEvent")
@@ -29189,6 +33303,11 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('PushManager.supportedContentEncodings')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<String> supportedContentEncodings;
+
   @DomName('PushManager.getSubscription')
   @DocsEditable()
   @Experimental() // untriaged
@@ -29291,6 +33410,16 @@
   @Experimental() // untriaged
   final String endpoint;
 
+  @DomName('PushSubscription.expirationTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int expirationTime;
+
+  @DomName('PushSubscription.options')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PushSubscriptionOptions options;
+
   @DomName('PushSubscription.getKey')
   @DocsEditable()
   @Experimental() // untriaged
@@ -29306,6 +33435,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('PushSubscriptionOptions')
+@Experimental() // untriaged
+@Native("PushSubscriptionOptions")
+class PushSubscriptionOptions extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PushSubscriptionOptions._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('PushSubscriptionOptions.applicationServerKey')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final ByteBuffer applicationServerKey;
+
+  @DomName('PushSubscriptionOptions.userVisibleOnly')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool userVisibleOnly;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLQuoteElement')
 @Native("HTMLQuoteElement")
 class QuoteElement extends HtmlElement {
@@ -29466,11 +33619,12 @@
   @DocsEditable()
   Rectangle getBoundingClientRect() native;
 
+  @JSName('getClientRects')
   @DomName('Range.getClientRects')
   @DocsEditable()
-  @Returns('_ClientRectList|Null')
-  @Creates('_ClientRectList')
-  List<Rectangle> getClientRects() native;
+  @Returns('DomRectList|Null')
+  @Creates('DomRectList')
+  List<Rectangle> _getClientRects() native;
 
   @DomName('Range.insertNode')
   @DocsEditable()
@@ -29516,6 +33670,24 @@
   @DocsEditable()
   void surroundContents(Node newParent) native;
 
+  @DomName('Range.getClientRects')
+  @DocsEditable()
+  @Returns('DomRectList|Null')
+  @Creates('DomRectList')
+  List<Rectangle> getClientRects() {
+    var value = _getClientRects();
+
+    // If no prototype we need one for the world to hookup to the proper Dart class.
+    var jsProto = JS('', '#.prototype', value);
+    if (jsProto == null) {
+      JS('', '#.prototype = Object.create(null)', value);
+    }
+
+    applyExtension('DOMRectList', value);
+
+    return value;
+  }
+
   /**
    * Checks if createContextualFragment is supported.
    *
@@ -29531,136 +33703,163 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('ReadableByteStream')
+@DomName('RelatedApplication')
 @Experimental() // untriaged
-@Native("ReadableByteStream")
-class ReadableByteStream extends Interceptor {
+@Native("RelatedApplication")
+class RelatedApplication extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ReadableByteStream._() {
+  factory RelatedApplication._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ReadableByteStream.cancel')
+  @DomName('RelatedApplication.id')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel([Object reason]) native;
+  final String id;
 
-  @DomName('ReadableByteStream.getReader')
+  @DomName('RelatedApplication.platform')
   @DocsEditable()
   @Experimental() // untriaged
-  ReadableByteStreamReader getReader() native;
+  final String platform;
+
+  @DomName('RelatedApplication.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String url;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('ReadableByteStreamReader')
+@DomName('RelativeOrientationSensor')
 @Experimental() // untriaged
-@Native("ReadableByteStreamReader")
-class ReadableByteStreamReader extends Interceptor {
+@Native("RelativeOrientationSensor")
+class RelativeOrientationSensor extends OrientationSensor {
   // To suppress missing implicit constructor warnings.
-  factory ReadableByteStreamReader._() {
+  factory RelativeOrientationSensor._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ReadableByteStreamReader.closed')
+  @DomName('RelativeOrientationSensor.RelativeOrientationSensor')
   @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('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('ReadableStreamReader.cancel')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future cancel([Object reason]) native;
-
-  @DomName('ReadableStreamReader.read')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future read() native;
-
-  @DomName('ReadableStreamReader.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('RelatedEvent')
-@Experimental() // untriaged
-@Native("RelatedEvent")
-class RelatedEvent extends Event {
-  // 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);
+  factory RelativeOrientationSensor([Map sensorOptions]) {
+    if (sensorOptions != null) {
+      var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
+      return RelativeOrientationSensor._create_1(sensorOptions_1);
     }
-    return RelatedEvent._create_2(type);
+    return RelativeOrientationSensor._create_2();
   }
-  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
-  EventTarget get relatedTarget =>
-      _convertNativeToDart_EventTarget(this._get_relatedTarget);
-  @JSName('relatedTarget')
-  @DomName('RelatedEvent.relatedTarget')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final dynamic _get_relatedTarget;
+  static RelativeOrientationSensor _create_1(sensorOptions) => JS(
+      'RelativeOrientationSensor',
+      'new RelativeOrientationSensor(#)',
+      sensorOptions);
+  static RelativeOrientationSensor _create_2() =>
+      JS('RelativeOrientationSensor', 'new RelativeOrientationSensor()');
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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('RemotePlayback')
+@Experimental() // untriaged
+@Native("RemotePlayback")
+class RemotePlayback extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory RemotePlayback._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('RemotePlayback.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String state;
+
+  @DomName('RemotePlayback.cancelWatchAvailability')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future cancelWatchAvailability([int id]) native;
+
+  @DomName('RemotePlayback.prompt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future prompt() native;
+
+  @DomName('RemotePlayback.watchAvailability')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future watchAvailability(RemotePlaybackAvailabilityCallback callback) 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.
+
+// WARNING: Do not edit - generated code.
+
+@DomName('RemotePlaybackAvailabilityCallback')
+@Experimental() // untriaged
+typedef void RemotePlaybackAvailabilityCallback(bool available);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('ReportBody')
+@Experimental() // untriaged
+@Native("ReportBody")
+class ReportBody extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ReportBody._() {
+    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('ReportingObserver')
+@Experimental() // untriaged
+@Native("ReportingObserver")
+class ReportingObserver extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ReportingObserver._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('ReportingObserver.ReportingObserver')
+  @DocsEditable()
+  factory ReportingObserver(ReportingObserverCallback callback) {
+    return ReportingObserver._create_1(callback);
+  }
+  static ReportingObserver _create_1(callback) =>
+      JS('ReportingObserver', 'new ReportingObserver(#)', callback);
+
+  @DomName('ReportingObserver.disconnect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disconnect() native;
+
+  @DomName('ReportingObserver.observe')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void observe() 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.
+
+// WARNING: Do not edit - generated code.
+
+@DomName('ReportingObserverCallback')
+@Experimental() // untriaged
+typedef void ReportingObserverCallback(
+    List<_Report> reports, ReportingObserver observer);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 // WARNING: Do not edit - generated code.
 
 @DomName('RequestAnimationFrameCallback')
@@ -29670,49 +33869,71 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('Rotation')
+@DomName('ResizeObserver')
 @Experimental() // untriaged
-@Native("Rotation")
-class Rotation extends TransformComponent {
+@Native("ResizeObserver")
+class ResizeObserver extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Rotation._() {
+  factory ResizeObserver._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Rotation.Rotation')
+  @DomName('ResizeObserver.ResizeObserver')
   @DocsEditable()
-  factory Rotation(num angle, [num x, num y, num z]) {
-    if ((angle is num) && x == null && y == null && z == null) {
-      return Rotation._create_1(angle);
-    }
-    if ((z is num) && (y is num) && (x is num) && (angle is num)) {
-      return Rotation._create_2(angle, x, y, z);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
+  factory ResizeObserver(ResizeObserverCallback callback) {
+    return ResizeObserver._create_1(callback);
   }
-  static Rotation _create_1(angle) => JS('Rotation', 'new Rotation(#)', angle);
-  static Rotation _create_2(angle, x, y, z) =>
-      JS('Rotation', 'new Rotation(#,#,#,#)', angle, x, y, z);
+  static ResizeObserver _create_1(callback) =>
+      JS('ResizeObserver', 'new ResizeObserver(#)', callback);
 
-  @DomName('Rotation.angle')
+  @DomName('ResizeObserver.disconnect')
   @DocsEditable()
   @Experimental() // untriaged
-  final double angle;
+  void disconnect() native;
 
-  @DomName('Rotation.x')
+  @DomName('ResizeObserver.observe')
   @DocsEditable()
   @Experimental() // untriaged
-  final double x;
+  void observe(Element target) native;
 
-  @DomName('Rotation.y')
+  @DomName('ResizeObserver.unobserve')
   @DocsEditable()
   @Experimental() // untriaged
-  final double y;
+  void unobserve(Element target) 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.
 
-  @DomName('Rotation.z')
+// WARNING: Do not edit - generated code.
+
+@DomName('ResizeObserverCallback')
+@Experimental() // untriaged
+typedef void ResizeObserverCallback(
+    List<ResizeObserverEntry> entries, ResizeObserver observer);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('ResizeObserverEntry')
+@Experimental() // untriaged
+@Native("ResizeObserverEntry")
+class ResizeObserverEntry extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ResizeObserverEntry._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('ResizeObserverEntry.contentRect')
   @DocsEditable()
   @Experimental() // untriaged
-  final double z;
+  final DomRectReadOnly contentRect;
+
+  @DomName('ResizeObserverEntry.target')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -29732,6 +33953,11 @@
   @DocsEditable()
   @Experimental() // untriaged
   final int expires;
+
+  @DomName('RTCCertificate.getFingerprints')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Map> getFingerprints() 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
@@ -29910,6 +34136,18 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('RTCDataChannelEvent.RTCDataChannelEvent')
+  @DocsEditable()
+  factory RtcDataChannelEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return RtcDataChannelEvent._create_1(type, eventInitDict_1);
+  }
+  static RtcDataChannelEvent _create_1(type, eventInitDict) => JS(
+      'RtcDataChannelEvent',
+      'new RTCDataChannelEvent(#,#)',
+      type,
+      eventInitDict);
+
   @DomName('RTCDataChannelEvent.channel')
   @DocsEditable()
   final RtcDataChannel channel;
@@ -30048,19 +34286,44 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('RTCIceCandidateEvent')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcicecandidate-type
-@Experimental()
-@Native("RTCIceCandidateEvent,RTCPeerConnectionIceEvent")
-class RtcIceCandidateEvent extends Event {
+@DomName('RTCLegacyStatsReport')
+@Experimental() // untriaged
+@Native("RTCLegacyStatsReport")
+class RtcLegacyStatsReport extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory RtcIceCandidateEvent._() {
+  factory RtcLegacyStatsReport._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCIceCandidateEvent.candidate')
+  @DomName('RTCLegacyStatsReport.id')
   @DocsEditable()
-  final RtcIceCandidate candidate;
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('RTCLegacyStatsReport.timestamp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DateTime get timestamp => convertNativeToDart_DateTime(this._get_timestamp);
+  @JSName('timestamp')
+  @DomName('RTCLegacyStatsReport.timestamp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final dynamic _get_timestamp;
+
+  @DomName('RTCLegacyStatsReport.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+
+  @DomName('RTCLegacyStatsReport.names')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> names() native;
+
+  @DomName('RTCLegacyStatsReport.stat')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String stat(String name) 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
@@ -30180,8 +34443,9 @@
    */
   @DomName('RTCPeerConnection.icecandidateEvent')
   @DocsEditable()
-  static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent =
-      const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
+  static const EventStreamProvider<RtcPeerConnectionIceEvent>
+      iceCandidateEvent =
+      const EventStreamProvider<RtcPeerConnectionIceEvent>('icecandidate');
 
   /**
    * Static factory designed to expose `iceconnectionstatechange` events to event
@@ -30249,7 +34513,7 @@
 
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
-  Future addIceCandidate(candidate,
+  Future addIceCandidate(Object candidate,
       [VoidCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback]) native;
 
@@ -30274,34 +34538,66 @@
   @DocsEditable()
   void _addStream_2(MediaStream stream) native;
 
+  @DomName('RTCPeerConnection.addTrack')
+  @DocsEditable()
+  @Experimental() // untriaged
+  RtcRtpSender addTrack(MediaStreamTrack track, MediaStream streams) native;
+
   @DomName('RTCPeerConnection.close')
   @DocsEditable()
   void close() native;
 
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer(_RtcSessionDescriptionCallback successCallback,
+  Future _createAnswer(
+      [options_OR_successCallback,
       RtcPeerConnectionErrorCallback failureCallback,
-      [Map mediaConstraints]) {
-    if (mediaConstraints != null) {
-      var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
-      _createAnswer_1(successCallback, failureCallback, mediaConstraints_1);
-      return;
+      Map mediaConstraints]) {
+    if (options_OR_successCallback == null &&
+        failureCallback == null &&
+        mediaConstraints == null) {
+      return _createAnswer_1();
     }
-    _createAnswer_2(successCallback, failureCallback);
-    return;
+    if ((options_OR_successCallback is Map) &&
+        failureCallback == null &&
+        mediaConstraints == null) {
+      var options_1 =
+          convertDartToNative_Dictionary(options_OR_successCallback);
+      return _createAnswer_2(options_1);
+    }
+    if (failureCallback != null &&
+        (options_OR_successCallback is _RtcSessionDescriptionCallback) &&
+        mediaConstraints == null) {
+      return _createAnswer_3(options_OR_successCallback, failureCallback);
+    }
+    if (mediaConstraints != null &&
+        failureCallback != null &&
+        (options_OR_successCallback is _RtcSessionDescriptionCallback)) {
+      var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
+      return _createAnswer_4(
+          options_OR_successCallback, failureCallback, mediaConstraints_1);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @JSName('createAnswer')
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer_1(_RtcSessionDescriptionCallback successCallback,
-      RtcPeerConnectionErrorCallback failureCallback, mediaConstraints) native;
+  Future _createAnswer_1() native;
   @JSName('createAnswer')
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer_2(_RtcSessionDescriptionCallback successCallback,
+  Future _createAnswer_2(options) native;
+  @JSName('createAnswer')
+  @DomName('RTCPeerConnection.createAnswer')
+  @DocsEditable()
+  Future _createAnswer_3(_RtcSessionDescriptionCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback) native;
+  @JSName('createAnswer')
+  @DomName('RTCPeerConnection.createAnswer')
+  @DocsEditable()
+  Future _createAnswer_4(_RtcSessionDescriptionCallback successCallback,
+      RtcPeerConnectionErrorCallback failureCallback, mediaConstraints) native;
 
   @JSName('createDTMFSender')
   @DomName('RTCPeerConnection.createDTMFSender')
@@ -30310,10 +34606,10 @@
 
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
-  RtcDataChannel createDataChannel(String label, [Map options]) {
-    if (options != null) {
-      var options_1 = convertDartToNative_Dictionary(options);
-      return _createDataChannel_1(label, options_1);
+  RtcDataChannel createDataChannel(String label, [Map dataChannelDict]) {
+    if (dataChannelDict != null) {
+      var dataChannelDict_1 = convertDartToNative_Dictionary(dataChannelDict);
+      return _createDataChannel_1(label, dataChannelDict_1);
     }
     return _createDataChannel_2(label);
   }
@@ -30321,7 +34617,7 @@
   @JSName('createDataChannel')
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
-  RtcDataChannel _createDataChannel_1(label, options) native;
+  RtcDataChannel _createDataChannel_1(label, dataChannelDict) native;
   @JSName('createDataChannel')
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
@@ -30329,62 +34625,123 @@
 
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer(_RtcSessionDescriptionCallback successCallback,
+  Future _createOffer(
+      [options_OR_successCallback,
       RtcPeerConnectionErrorCallback failureCallback,
-      [Map rtcOfferOptions]) {
-    if (rtcOfferOptions != null) {
-      var rtcOfferOptions_1 = convertDartToNative_Dictionary(rtcOfferOptions);
-      _createOffer_1(successCallback, failureCallback, rtcOfferOptions_1);
-      return;
+      Map rtcOfferOptions]) {
+    if (options_OR_successCallback == null &&
+        failureCallback == null &&
+        rtcOfferOptions == null) {
+      return _createOffer_1();
     }
-    _createOffer_2(successCallback, failureCallback);
-    return;
+    if ((options_OR_successCallback is Map) &&
+        failureCallback == null &&
+        rtcOfferOptions == null) {
+      var options_1 =
+          convertDartToNative_Dictionary(options_OR_successCallback);
+      return _createOffer_2(options_1);
+    }
+    if (failureCallback != null &&
+        (options_OR_successCallback is _RtcSessionDescriptionCallback) &&
+        rtcOfferOptions == null) {
+      return _createOffer_3(options_OR_successCallback, failureCallback);
+    }
+    if (rtcOfferOptions != null &&
+        failureCallback != null &&
+        (options_OR_successCallback is _RtcSessionDescriptionCallback)) {
+      var rtcOfferOptions_1 = convertDartToNative_Dictionary(rtcOfferOptions);
+      return _createOffer_4(
+          options_OR_successCallback, failureCallback, rtcOfferOptions_1);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @JSName('createOffer')
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer_1(_RtcSessionDescriptionCallback successCallback,
-      RtcPeerConnectionErrorCallback failureCallback, rtcOfferOptions) native;
+  Future _createOffer_1() native;
   @JSName('createOffer')
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer_2(_RtcSessionDescriptionCallback successCallback,
+  Future _createOffer_2(options) native;
+  @JSName('createOffer')
+  @DomName('RTCPeerConnection.createOffer')
+  @DocsEditable()
+  Future _createOffer_3(_RtcSessionDescriptionCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback) native;
+  @JSName('createOffer')
+  @DomName('RTCPeerConnection.createOffer')
+  @DocsEditable()
+  Future _createOffer_4(_RtcSessionDescriptionCallback successCallback,
+      RtcPeerConnectionErrorCallback failureCallback, rtcOfferOptions) native;
 
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
   List<MediaStream> getLocalStreams() native;
 
+  @DomName('RTCPeerConnection.getReceivers')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<RtcRtpReceiver> getReceivers() native;
+
   @DomName('RTCPeerConnection.getRemoteStreams')
   @DocsEditable()
   List<MediaStream> getRemoteStreams() native;
 
+  @DomName('RTCPeerConnection.getSenders')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<RtcRtpSender> getSenders() native;
+
   @JSName('getStats')
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector)
-      native;
-
-  @DomName('RTCPeerConnection.getStreamById')
-  @DocsEditable()
-  MediaStream getStreamById(String streamId) native;
+  Future _getStats(
+      [RtcStatsCallback successCallback, MediaStreamTrack selector]) native;
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
   void removeStream(MediaStream stream) native;
 
-  @JSName('setLocalDescription')
+  @DomName('RTCPeerConnection.removeTrack')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void removeTrack(RtcRtpSender sender) native;
+
+  @DomName('RTCPeerConnection.setConfiguration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void setConfiguration(Map configuration) {
+    var configuration_1 = convertDartToNative_Dictionary(configuration);
+    _setConfiguration_1(configuration_1);
+    return;
+  }
+
+  @JSName('setConfiguration')
+  @DomName('RTCPeerConnection.setConfiguration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _setConfiguration_1(configuration) native;
+
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  Future _setLocalDescription(
-      RtcSessionDescription description, VoidCallback successCallback,
-      [RtcPeerConnectionErrorCallback failureCallback]) native;
+  Future _setLocalDescription(Map description, VoidCallback successCallback,
+      [RtcPeerConnectionErrorCallback failureCallback]) {
+    var description_1 = convertDartToNative_Dictionary(description);
+    return _setLocalDescription_1(
+        description_1, successCallback, failureCallback);
+  }
 
   @JSName('setLocalDescription')
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  Future setLocalDescription(RtcSessionDescription description) {
+  Future _setLocalDescription_1(description, VoidCallback successCallback,
+      RtcPeerConnectionErrorCallback failureCallback) native;
+
+  @JSName('setLocalDescription')
+  @DomName('RTCPeerConnection.setLocalDescription')
+  @DocsEditable()
+  Future setLocalDescription(Map description) {
     var completer = new Completer();
     _setLocalDescription(description, () {
       completer.complete();
@@ -30394,17 +34751,25 @@
     return completer.future;
   }
 
-  @JSName('setRemoteDescription')
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  Future _setRemoteDescription(
-      RtcSessionDescription description, VoidCallback successCallback,
-      [RtcPeerConnectionErrorCallback failureCallback]) native;
+  Future _setRemoteDescription(Map description, VoidCallback successCallback,
+      [RtcPeerConnectionErrorCallback failureCallback]) {
+    var description_1 = convertDartToNative_Dictionary(description);
+    return _setRemoteDescription_1(
+        description_1, successCallback, failureCallback);
+  }
 
   @JSName('setRemoteDescription')
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  Future setRemoteDescription(RtcSessionDescription description) {
+  Future _setRemoteDescription_1(description, VoidCallback successCallback,
+      RtcPeerConnectionErrorCallback failureCallback) native;
+
+  @JSName('setRemoteDescription')
+  @DomName('RTCPeerConnection.setRemoteDescription')
+  @DocsEditable()
+  Future setRemoteDescription(Map description) {
     var completer = new Completer();
     _setRemoteDescription(description, () {
       completer.complete();
@@ -30414,37 +34779,6 @@
     return completer.future;
   }
 
-  @DomName('RTCPeerConnection.updateIce')
-  @DocsEditable()
-  void updateIce([Map configuration, Map mediaConstraints]) {
-    if (mediaConstraints != null) {
-      var configuration_1 = convertDartToNative_Dictionary(configuration);
-      var mediaConstraints_2 = convertDartToNative_Dictionary(mediaConstraints);
-      _updateIce_1(configuration_1, mediaConstraints_2);
-      return;
-    }
-    if (configuration != null) {
-      var configuration_1 = convertDartToNative_Dictionary(configuration);
-      _updateIce_2(configuration_1);
-      return;
-    }
-    _updateIce_3();
-    return;
-  }
-
-  @JSName('updateIce')
-  @DomName('RTCPeerConnection.updateIce')
-  @DocsEditable()
-  void _updateIce_1(configuration, mediaConstraints) native;
-  @JSName('updateIce')
-  @DomName('RTCPeerConnection.updateIce')
-  @DocsEditable()
-  void _updateIce_2(configuration) native;
-  @JSName('updateIce')
-  @DomName('RTCPeerConnection.updateIce')
-  @DocsEditable()
-  void _updateIce_3() native;
-
   /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
   @DocsEditable()
@@ -30459,7 +34793,7 @@
   /// Stream of `icecandidate` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onicecandidate')
   @DocsEditable()
-  Stream<RtcIceCandidateEvent> get onIceCandidate =>
+  Stream<RtcPeerConnectionIceEvent> get onIceCandidate =>
       iceCandidateEvent.forTarget(this);
 
   /// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection].
@@ -30486,6 +34820,109 @@
   Stream<Event> get onSignalingStateChange =>
       signalingStateChangeEvent.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('RTCPeerConnectionIceEvent')
+@Experimental() // untriaged
+@Native("RTCPeerConnectionIceEvent")
+class RtcPeerConnectionIceEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory RtcPeerConnectionIceEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('RTCPeerConnectionIceEvent.RTCPeerConnectionIceEvent')
+  @DocsEditable()
+  factory RtcPeerConnectionIceEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return RtcPeerConnectionIceEvent._create_1(type, eventInitDict_1);
+    }
+    return RtcPeerConnectionIceEvent._create_2(type);
+  }
+  static RtcPeerConnectionIceEvent _create_1(type, eventInitDict) => JS(
+      'RtcPeerConnectionIceEvent',
+      'new RTCPeerConnectionIceEvent(#,#)',
+      type,
+      eventInitDict);
+  static RtcPeerConnectionIceEvent _create_2(type) =>
+      JS('RtcPeerConnectionIceEvent', 'new RTCPeerConnectionIceEvent(#)', type);
+
+  @DomName('RTCPeerConnectionIceEvent.candidate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final RtcIceCandidate candidate;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('RTCRtpContributingSource')
+@Experimental() // untriaged
+@Native("RTCRtpContributingSource")
+class RtcRtpContributingSource extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory RtcRtpContributingSource._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('RTCRtpContributingSource.source')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int source;
+
+  @DomName('RTCRtpContributingSource.timestamp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num 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('RTCRtpReceiver')
+@Experimental() // untriaged
+@Native("RTCRtpReceiver")
+class RtcRtpReceiver extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory RtcRtpReceiver._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('RTCRtpReceiver.track')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaStreamTrack track;
+
+  @DomName('RTCRtpReceiver.getContributingSources')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<RtcRtpContributingSource> getContributingSources() 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('RTCRtpSender')
+@Experimental() // untriaged
+@Native("RTCRtpSender")
+class RtcRtpSender extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory RtcRtpSender._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('RTCRtpSender.track')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaStreamTrack track;
+}
 // 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.
@@ -30536,31 +34973,6 @@
   factory RtcStatsReport._() {
     throw new UnsupportedError("Not supported");
   }
-
-  @DomName('RTCStatsReport.id')
-  @DocsEditable()
-  final String id;
-
-  @DomName('RTCStatsReport.timestamp')
-  @DocsEditable()
-  DateTime get timestamp => convertNativeToDart_DateTime(this._get_timestamp);
-  @JSName('timestamp')
-  @DomName('RTCStatsReport.timestamp')
-  @DocsEditable()
-  @Creates('Null')
-  final dynamic _get_timestamp;
-
-  @DomName('RTCStatsReport.type')
-  @DocsEditable()
-  final String type;
-
-  @DomName('RTCStatsReport.names')
-  @DocsEditable()
-  List<String> names() native;
-
-  @DomName('RTCStatsReport.stat')
-  @DocsEditable()
-  String stat(String 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
@@ -30579,11 +34991,49 @@
 
   @DomName('RTCStatsResponse.namedItem')
   @DocsEditable()
-  RtcStatsReport namedItem(String name) native;
+  RtcLegacyStatsReport namedItem(String name) native;
 
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
-  List<RtcStatsReport> result() native;
+  List<RtcLegacyStatsReport> result() 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('RTCTrackEvent')
+@Experimental() // untriaged
+@Native("RTCTrackEvent")
+class RtcTrackEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory RtcTrackEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('RTCTrackEvent.RTCTrackEvent')
+  @DocsEditable()
+  factory RtcTrackEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return RtcTrackEvent._create_1(type, eventInitDict_1);
+  }
+  static RtcTrackEvent _create_1(type, eventInitDict) =>
+      JS('RtcTrackEvent', 'new RTCTrackEvent(#,#)', type, eventInitDict);
+
+  @DomName('RTCTrackEvent.receiver')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final RtcRtpReceiver receiver;
+
+  @DomName('RTCTrackEvent.streams')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<MediaStream> streams;
+
+  @DomName('RTCTrackEvent.track')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MediaStreamTrack track;
 }
 // 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
@@ -30747,11 +35197,10 @@
   @Experimental() // untriaged
   String integrity;
 
-  @DomName('HTMLScriptElement.nonce')
+  @DomName('HTMLScriptElement.noModule')
   @DocsEditable()
-  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
-  @Experimental()
-  String nonce;
+  @Experimental() // untriaged
+  bool noModule;
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
@@ -30791,17 +35240,17 @@
   @DomName('ScrollState.deltaGranularity')
   @DocsEditable()
   @Experimental() // untriaged
-  final double deltaGranularity;
+  final num deltaGranularity;
 
   @DomName('ScrollState.deltaX')
   @DocsEditable()
   @Experimental() // untriaged
-  final double deltaX;
+  final num deltaX;
 
   @DomName('ScrollState.deltaY')
   @DocsEditable()
   @Experimental() // untriaged
-  final double deltaY;
+  final num deltaY;
 
   @DomName('ScrollState.fromUserInput')
   @DocsEditable()
@@ -30828,30 +35277,25 @@
   @Experimental() // untriaged
   final bool isEnding;
 
-  @DomName('ScrollState.shouldPropagate')
+  @DomName('ScrollState.positionX')
   @DocsEditable()
   @Experimental() // untriaged
-  final bool shouldPropagate;
+  final int positionX;
 
-  @DomName('ScrollState.startPositionX')
+  @DomName('ScrollState.positionY')
   @DocsEditable()
   @Experimental() // untriaged
-  final int startPositionX;
-
-  @DomName('ScrollState.startPositionY')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int startPositionY;
+  final int positionY;
 
   @DomName('ScrollState.velocityX')
   @DocsEditable()
   @Experimental() // untriaged
-  final double velocityX;
+  final num velocityX;
 
   @DomName('ScrollState.velocityY')
   @DocsEditable()
   @Experimental() // untriaged
-  final double velocityY;
+  final num velocityY;
 
   @DomName('ScrollState.consumeDelta')
   @DocsEditable()
@@ -30877,6 +35321,49 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('ScrollTimeline')
+@Experimental() // untriaged
+@Native("ScrollTimeline")
+class ScrollTimeline extends AnimationTimeline {
+  // To suppress missing implicit constructor warnings.
+  factory ScrollTimeline._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('ScrollTimeline.ScrollTimeline')
+  @DocsEditable()
+  factory ScrollTimeline([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return ScrollTimeline._create_1(options_1);
+    }
+    return ScrollTimeline._create_2();
+  }
+  static ScrollTimeline _create_1(options) =>
+      JS('ScrollTimeline', 'new ScrollTimeline(#)', options);
+  static ScrollTimeline _create_2() =>
+      JS('ScrollTimeline', 'new ScrollTimeline()');
+
+  @DomName('ScrollTimeline.orientation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String orientation;
+
+  @DomName('ScrollTimeline.scrollSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element scrollSource;
+
+  @DomName('ScrollTimeline.timeRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Object timeRange;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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()
@@ -30915,6 +35402,11 @@
   @DocsEditable()
   final int columnNumber;
 
+  @DomName('SecurityPolicyViolationEvent.disposition')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String disposition;
+
   @JSName('documentURI')
   @DomName('SecurityPolicyViolationEvent.documentURI')
   @DocsEditable()
@@ -30936,6 +35428,11 @@
   @DocsEditable()
   final String referrer;
 
+  @DomName('SecurityPolicyViolationEvent.sample')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String sample;
+
   @DomName('SecurityPolicyViolationEvent.sourceFile')
   @DocsEditable()
   final String sourceFile;
@@ -31194,6 +35691,11 @@
   @DocsEditable()
   void removeAllRanges() native;
 
+  @DomName('Selection.removeRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void removeRange(Range range) native;
+
   @DomName('Selection.selectAllChildren')
   @DocsEditable()
   void selectAllChildren(Node node) native;
@@ -31214,191 +35716,78 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('ServicePort')
+@DomName('Sensor')
 @Experimental() // untriaged
-@Native("ServicePort")
-class ServicePort extends Interceptor {
+@Native("Sensor")
+class Sensor extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory ServicePort._() {
+  factory Sensor._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ServicePort.data')
+  @DomName('Sensor.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  final Object data;
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
-  @DomName('ServicePort.name')
+  @DomName('Sensor.activated')
   @DocsEditable()
   @Experimental() // untriaged
-  final String name;
+  final bool activated;
 
-  @JSName('targetURL')
-  @DomName('ServicePort.targetURL')
+  @DomName('Sensor.hasReading')
   @DocsEditable()
   @Experimental() // untriaged
-  final String targetUrl;
+  final bool hasReading;
 
-  @DomName('ServicePort.close')
+  @DomName('Sensor.timestamp')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() native;
+  final num timestamp;
 
-  @DomName('ServicePort.postMessage')
+  @DomName('Sensor.start')
   @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;
-  }
+  void start() native;
 
-  @JSName('postMessage')
-  @DomName('ServicePort.postMessage')
+  @DomName('Sensor.stop')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_1(message, List<MessagePort> transfer) native;
-  @JSName('postMessage')
-  @DomName('ServicePort.postMessage')
+  void stop() native;
+
+  @DomName('Sensor.onerror')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_2(message) native;
+  Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('ServicePortCollection')
+@DomName('SensorErrorEvent')
 @Experimental() // untriaged
-@Native("ServicePortCollection")
-class ServicePortCollection extends EventTarget {
+@Native("SensorErrorEvent")
+class SensorErrorEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory ServicePortCollection._() {
+  factory SensorErrorEvent._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ServicePortCollection.messageEvent')
+  @DomName('SensorErrorEvent.SensorErrorEvent')
   @DocsEditable()
-  @Experimental() // untriaged
-  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 _connect_1(url, options_1);
-    }
-    return _connect_2(url);
+  factory SensorErrorEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return SensorErrorEvent._create_1(type, eventInitDict_1);
   }
+  static SensorErrorEvent _create_1(type, eventInitDict) =>
+      JS('SensorErrorEvent', 'new SensorErrorEvent(#,#)', type, eventInitDict);
 
-  @JSName('connect')
-  @DomName('ServicePortCollection.connect')
+  @DomName('SensorErrorEvent.error')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _connect_1(url, options) native;
-  @JSName('connect')
-  @DomName('ServicePortCollection.connect')
-  @DocsEditable()
-  @Experimental() // untriaged
-  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;
+  final DomException error;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -31481,6 +35870,30 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('ServiceWorkerGlobalScope.activateEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> activateEvent =
+      const EventStreamProvider<Event>('activate');
+
+  @DomName('ServiceWorkerGlobalScope.fetchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> fetchEvent =
+      const EventStreamProvider<Event>('fetch');
+
+  @DomName('ServiceWorkerGlobalScope.foreignfetchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ForeignFetchEvent> foreignfetchEvent =
+      const EventStreamProvider<ForeignFetchEvent>('foreignfetch');
+
+  @DomName('ServiceWorkerGlobalScope.installEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> installEvent =
+      const EventStreamProvider<Event>('install');
+
   @DomName('ServiceWorkerGlobalScope.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -31502,64 +35915,32 @@
   @Experimental() // untriaged
   Future skipWaiting() native;
 
+  @DomName('ServiceWorkerGlobalScope.onactivate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onActivate => activateEvent.forTarget(this);
+
+  @DomName('ServiceWorkerGlobalScope.onfetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onFetch => fetchEvent.forTarget(this);
+
+  @DomName('ServiceWorkerGlobalScope.onforeignfetch')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ForeignFetchEvent> get onForeignfetch =>
+      foreignfetchEvent.forTarget(this);
+
+  @DomName('ServiceWorkerGlobalScope.oninstall')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onInstall => installEvent.forTarget(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
-@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.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.
@@ -31579,16 +35960,26 @@
   @Experimental() // untriaged
   final _ServiceWorker active;
 
-  @DomName('ServiceWorkerRegistration.geofencing')
+  @DomName('ServiceWorkerRegistration.backgroundFetch')
   @DocsEditable()
   @Experimental() // untriaged
-  final Geofencing geofencing;
+  final BackgroundFetchManager backgroundFetch;
 
   @DomName('ServiceWorkerRegistration.installing')
   @DocsEditable()
   @Experimental() // untriaged
   final _ServiceWorker installing;
 
+  @DomName('ServiceWorkerRegistration.navigationPreload')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final NavigationPreloadManager navigationPreload;
+
+  @DomName('ServiceWorkerRegistration.paymentManager')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PaymentManager paymentManager;
+
   @DomName('ServiceWorkerRegistration.pushManager')
   @DocsEditable()
   @Experimental() // untriaged
@@ -31710,16 +36101,12 @@
 @Experimental()
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-root
 @Native("ShadowRoot")
-class ShadowRoot extends DocumentFragment {
+class ShadowRoot extends DocumentFragment implements DocumentOrShadowRoot {
   // To suppress missing implicit constructor warnings.
   factory ShadowRoot._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ShadowRoot.activeElement')
-  @DocsEditable()
-  final Element activeElement;
-
   @DomName('ShadowRoot.delegatesFocus')
   @DocsEditable()
   @Experimental() // untriaged
@@ -31735,11 +36122,32 @@
   @DocsEditable()
   String innerHtml;
 
+  @DomName('ShadowRoot.mode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String mode;
+
   @DomName('ShadowRoot.olderShadowRoot')
   @DocsEditable()
   @Experimental() // untriaged
   final ShadowRoot olderShadowRoot;
 
+  // From DocumentOrShadowRoot
+
+  @DomName('ShadowRoot.activeElement')
+  @DocsEditable()
+  final Element activeElement;
+
+  @DomName('ShadowRoot.fullscreenElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element fullscreenElement;
+
+  @DomName('ShadowRoot.pointerLockElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element pointerLockElement;
+
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
@@ -31747,11 +36155,6 @@
   @Creates('_StyleSheetList')
   final List<StyleSheet> styleSheets;
 
-  @JSName('cloneNode')
-  @DomName('ShadowRoot.cloneNode')
-  @DocsEditable()
-  Node clone([bool deep]) native;
-
   @DomName('ShadowRoot.elementFromPoint')
   @DocsEditable()
   Element elementFromPoint(int x, int y) native;
@@ -31862,11 +36265,6 @@
   @DocsEditable()
   final MessagePort port;
 
-  @DomName('SharedWorker.workerStart')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double workerStart;
-
   @DomName('SharedWorker.onerror')
   @DocsEditable()
   @Experimental() // untriaged
@@ -31913,6 +36311,11 @@
   @Experimental() // untriaged
   final String name;
 
+  @DomName('SharedWorkerGlobalScope.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() native;
+
   @JSName('webkitRequestFileSystem')
   @DomName('SharedWorkerGlobalScope.webkitRequestFileSystem')
   @DocsEditable()
@@ -31964,69 +36367,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('SimpleLength')
-@Experimental() // untriaged
-@Native("SimpleLength")
-class SimpleLength extends LengthValue {
-  // To suppress missing implicit constructor warnings.
-  factory SimpleLength._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('SimpleLength.SimpleLength')
-  @DocsEditable()
-  factory SimpleLength(num value, String type) {
-    return SimpleLength._create_1(value, type);
-  }
-  static SimpleLength _create_1(value, type) =>
-      JS('SimpleLength', 'new SimpleLength(#,#)', value, type);
-
-  @DomName('SimpleLength.type')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String type;
-
-  @DomName('SimpleLength.value')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@DocsEditable()
-@DomName('Skew')
-@Experimental() // untriaged
-@Native("Skew")
-class Skew extends TransformComponent {
-  // To suppress missing implicit constructor warnings.
-  factory Skew._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('Skew.Skew')
-  @DocsEditable()
-  factory Skew(num ax, num ay) {
-    return Skew._create_1(ax, ay);
-  }
-  static Skew _create_1(ax, ay) => JS('Skew', 'new Skew(#,#)', ax, ay);
-
-  @DomName('Skew.ax')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double ax;
-
-  @DomName('Skew.ay')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double ay;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('HTMLSlotElement')
 @Experimental() // untriaged
 @Native("HTMLSlotElement")
@@ -32047,27 +36387,27 @@
   @Experimental() // untriaged
   String name;
 
-  @DomName('HTMLSlotElement.getAssignedNodes')
+  @DomName('HTMLSlotElement.assignedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getAssignedNodes([Map options]) {
+  List<Node> assignedNodes([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
-      return _getAssignedNodes_1(options_1);
+      return _assignedNodes_1(options_1);
     }
-    return _getAssignedNodes_2();
+    return _assignedNodes_2();
   }
 
-  @JSName('getAssignedNodes')
-  @DomName('HTMLSlotElement.getAssignedNodes')
+  @JSName('assignedNodes')
+  @DomName('HTMLSlotElement.assignedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> _getAssignedNodes_1(options) native;
-  @JSName('getAssignedNodes')
-  @DomName('HTMLSlotElement.getAssignedNodes')
+  List<Node> _assignedNodes_1(options) native;
+  @JSName('assignedNodes')
+  @DomName('HTMLSlotElement.assignedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> _getAssignedNodes_2() native;
+  List<Node> _assignedNodes_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
@@ -32084,6 +36424,18 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('SourceBuffer.abortEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> abortEvent =
+      const EventStreamProvider<Event>('abort');
+
+  @DomName('SourceBuffer.errorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
+
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32094,6 +36446,11 @@
   @Experimental() // untriaged
   num appendWindowStart;
 
+  @DomName('SourceBuffer.audioTracks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioTrackList audioTracks;
+
   @DomName('SourceBuffer.buffered')
   @DocsEditable()
   final TimeRanges buffered;
@@ -32117,6 +36474,11 @@
   @Experimental() // untriaged
   final bool updating;
 
+  @DomName('SourceBuffer.videoTracks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VideoTrackList videoTracks;
+
   @DomName('SourceBuffer.abort')
   @DocsEditable()
   void abort() native;
@@ -32126,11 +36488,6 @@
   @Experimental() // untriaged
   void appendBuffer(ByteBuffer data) native;
 
-  @DomName('SourceBuffer.appendStream')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void appendStream(FileStream stream, [int maxSize]) native;
-
   @JSName('appendBuffer')
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
@@ -32141,6 +36498,16 @@
   @DocsEditable()
   @Experimental() // untriaged
   void remove(num start, num end) native;
+
+  @DomName('SourceBuffer.onabort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onAbort => abortEvent.forTarget(this);
+
+  @DomName('SourceBuffer.onerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -32264,40 +36631,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('SourceInfo')
-@Experimental() // untriaged
-@Native("SourceInfo")
-class SourceInfo extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory SourceInfo._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('SourceInfo.facing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String facing;
-
-  @DomName('SourceInfo.id')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String id;
-
-  @DomName('SourceInfo.kind')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String kind;
-
-  @DomName('SourceInfo.label')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String label;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('HTMLSpanElement')
 @Native("HTMLSpanElement")
 class SpanElement extends HtmlElement {
@@ -32690,7 +37023,7 @@
 
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  final double confidence;
+  final num confidence;
 
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
@@ -32884,7 +37217,7 @@
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  final double elapsedTime;
+  final num elapsedTime;
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
@@ -33100,6 +37433,45 @@
 // for 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('StaticRange')
+@Experimental() // untriaged
+@Native("StaticRange")
+class StaticRange extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory StaticRange._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('StaticRange.collapsed')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool collapsed;
+
+  @DomName('StaticRange.endContainer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Node endContainer;
+
+  @DomName('StaticRange.endOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int endOffset;
+
+  @DomName('StaticRange.startContainer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Node startContainer;
+
+  @DomName('StaticRange.startOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int startOffset;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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.
@@ -33195,18 +37567,6 @@
   @DocsEditable()
   final int _length;
 
-  @DomName('Storage.__delete__')
-  @DocsEditable()
-  bool __delete__(index_OR_name) native;
-
-  @DomName('Storage.__getter__')
-  @DocsEditable()
-  String __getter__(index_OR_name) native;
-
-  @DomName('Storage.__setter__')
-  @DocsEditable()
-  void __setter__(index_OR_name, String value) native;
-
   @JSName('clear')
   @DomName('Storage.clear')
   @DocsEditable()
@@ -33318,31 +37678,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('StorageInfo')
-// http://www.w3.org/TR/file-system-api/
-@Experimental()
-@Native("StorageInfo")
-class StorageInfo extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory StorageInfo._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('StorageInfo.quota')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int quota;
-
-  @DomName('StorageInfo.usage')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int usage;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('StorageManager')
 @Experimental() // untriaged
 @Native("StorageManager")
@@ -33352,45 +37687,20 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StorageManager.persistentPermission')
+  @DomName('StorageManager.estimate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future persistentPermission() native;
+  Future estimate() native;
 
-  @DomName('StorageManager.requestPersistent')
+  @DomName('StorageManager.persist')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestPersistent() 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.
+  Future persist() native;
 
-@DocsEditable()
-@DomName('StorageQuota')
-// http://www.w3.org/TR/quota-api/#idl-def-StorageQuota
-@Experimental()
-@Native("StorageQuota")
-class StorageQuota extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory StorageQuota._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('StorageQuota.supportedTypes')
+  @DomName('StorageManager.persisted')
   @DocsEditable()
   @Experimental() // untriaged
-  final List<String> supportedTypes;
-
-  @DomName('StorageQuota.queryInfo')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future queryInfo(String type) native;
-
-  @DomName('StorageQuota.requestPersistentQuota')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future requestPersistentQuota(int newQuota) native;
+  Future persisted() 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
@@ -33417,16 +37727,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('StringCallback')
-// http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface
-@Experimental()
-typedef void _StringCallback(String data);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 @DocsEditable()
 @DomName('HTMLStyleElement')
 @Native("HTMLStyleElement")
@@ -33497,7 +37797,7 @@
 @DomName('StylePropertyMap')
 @Experimental() // untriaged
 @Native("StylePropertyMap")
-class StylePropertyMap extends Interceptor {
+class StylePropertyMap extends StylePropertyMapReadonly {
   // To suppress missing implicit constructor warnings.
   factory StylePropertyMap._() {
     throw new UnsupportedError("Not supported");
@@ -33513,26 +37813,6 @@
   @Experimental() // untriaged
   void delete(String property) native;
 
-  @DomName('StylePropertyMap.get')
-  @DocsEditable()
-  @Experimental() // untriaged
-  StyleValue get(String property) native;
-
-  @DomName('StylePropertyMap.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
-  List<StyleValue> getAll(String property) native;
-
-  @DomName('StylePropertyMap.getProperties')
-  @DocsEditable()
-  @Experimental() // untriaged
-  List<String> getProperties() native;
-
-  @DomName('StylePropertyMap.has')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool has(String property) native;
-
   @DomName('StylePropertyMap.set')
   @DocsEditable()
   @Experimental() // untriaged
@@ -33543,6 +37823,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('StylePropertyMapReadonly')
+@Experimental() // untriaged
+@Native("StylePropertyMapReadonly")
+class StylePropertyMapReadonly extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory StylePropertyMapReadonly._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('StylePropertyMapReadonly.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssStyleValue get(String property) native;
+
+  @DomName('StylePropertyMapReadonly.getAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<CssStyleValue> getAll(String property) native;
+
+  @DomName('StylePropertyMapReadonly.getProperties')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> getProperties() native;
+
+  @DomName('StylePropertyMapReadonly.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool has(String property) 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('StyleSheet')
 @Native("StyleSheet")
 class StyleSheet extends Interceptor {
@@ -33584,30 +37898,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('StyleValue')
-@Experimental() // untriaged
-@Native("StyleValue")
-class StyleValue extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory StyleValue._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('StyleValue.cssString')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String cssString;
-
-  @DomName('StyleValue.parse')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static Object parse(String property, String cssText) 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('SyncEvent')
 @Experimental() // untriaged
 @Native("SyncEvent")
@@ -34036,6 +38326,46 @@
   @DocsEditable()
   HtmlElement _insertRow([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('TaskAttributionTiming')
+@Experimental() // untriaged
+@Native("TaskAttributionTiming")
+class TaskAttributionTiming extends PerformanceEntry {
+  // To suppress missing implicit constructor warnings.
+  factory TaskAttributionTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('TaskAttributionTiming.containerId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String containerId;
+
+  @DomName('TaskAttributionTiming.containerName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String containerName;
+
+  @DomName('TaskAttributionTiming.containerSrc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String containerSrc;
+
+  @DomName('TaskAttributionTiming.containerType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String containerType;
+
+  @JSName('scriptURL')
+  @DomName('TaskAttributionTiming.scriptURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String scriptUrl;
+}
 // 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.
@@ -34184,11 +38514,6 @@
   @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLTextAreaElement.inputMode')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String inputMode;
-
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
@@ -34293,6 +38618,32 @@
   @DocsEditable()
   void setSelectionRange(int start, int end, [String direction]) 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('TextDetector')
+@Experimental() // untriaged
+@Native("TextDetector")
+class TextDetector extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory TextDetector._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('TextDetector.TextDetector')
+  @DocsEditable()
+  factory TextDetector() {
+    return TextDetector._create_1();
+  }
+  static TextDetector _create_1() => JS('TextDetector', 'new TextDetector()');
+
+  @DomName('TextDetector.detect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future detect(/*ImageBitmapSource*/ image) 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.
@@ -34346,61 +38697,61 @@
   @DomName('TextMetrics.actualBoundingBoxAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  final double actualBoundingBoxAscent;
+  final num actualBoundingBoxAscent;
 
   @DomName('TextMetrics.actualBoundingBoxDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  final double actualBoundingBoxDescent;
+  final num actualBoundingBoxDescent;
 
   @DomName('TextMetrics.actualBoundingBoxLeft')
   @DocsEditable()
   @Experimental() // untriaged
-  final double actualBoundingBoxLeft;
+  final num actualBoundingBoxLeft;
 
   @DomName('TextMetrics.actualBoundingBoxRight')
   @DocsEditable()
   @Experimental() // untriaged
-  final double actualBoundingBoxRight;
+  final num actualBoundingBoxRight;
 
   @DomName('TextMetrics.alphabeticBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  final double alphabeticBaseline;
+  final num alphabeticBaseline;
 
   @DomName('TextMetrics.emHeightAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  final double emHeightAscent;
+  final num emHeightAscent;
 
   @DomName('TextMetrics.emHeightDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  final double emHeightDescent;
+  final num emHeightDescent;
 
   @DomName('TextMetrics.fontBoundingBoxAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  final double fontBoundingBoxAscent;
+  final num fontBoundingBoxAscent;
 
   @DomName('TextMetrics.fontBoundingBoxDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  final double fontBoundingBoxDescent;
+  final num fontBoundingBoxDescent;
 
   @DomName('TextMetrics.hangingBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  final double hangingBaseline;
+  final num hangingBaseline;
 
   @DomName('TextMetrics.ideographicBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  final double ideographicBaseline;
+  final num ideographicBaseline;
 
   @DomName('TextMetrics.width')
   @DocsEditable()
-  final double width;
+  final num 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
@@ -34457,29 +38808,14 @@
   @DocsEditable()
   String mode;
 
-  @DomName('TextTrack.regions')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final VttRegionList regions;
-
   @DomName('TextTrack.addCue')
   @DocsEditable()
   void addCue(TextTrackCue cue) native;
 
-  @DomName('TextTrack.addRegion')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addRegion(VttRegion region) native;
-
   @DomName('TextTrack.removeCue')
   @DocsEditable()
   void removeCue(TextTrackCue cue) native;
 
-  @DomName('TextTrack.removeRegion')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeRegion(VttRegion region) native;
-
   /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
   @DocsEditable()
@@ -34731,6 +39067,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('HTMLTimeElement')
+@Experimental() // untriaged
+@Native("HTMLTimeElement")
+class TimeElement extends HtmlElement {
+  // To suppress missing implicit constructor warnings.
+  factory TimeElement._() {
+    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.
+   */
+  TimeElement.created() : super.created();
+
+  @DomName('HTMLTimeElement.dateTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String dateTime;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('TimeRanges')
 @Unstable()
 @Native("TimeRanges")
@@ -34813,17 +39174,17 @@
   @JSName('clientX')
   @DomName('Touch.clientX')
   @DocsEditable()
-  final double _clientX;
+  final num _clientX;
 
   @JSName('clientY')
   @DomName('Touch.clientY')
   @DocsEditable()
-  final double _clientY;
+  final num _clientY;
 
   @DomName('Touch.force')
   @DocsEditable()
   @Experimental() // untriaged
-  final double force;
+  final num force;
 
   @DomName('Touch.identifier')
   @DocsEditable()
@@ -34832,24 +39193,24 @@
   @JSName('pageX')
   @DomName('Touch.pageX')
   @DocsEditable()
-  final double _pageX;
+  final num _pageX;
 
   @JSName('pageY')
   @DomName('Touch.pageY')
   @DocsEditable()
-  final double _pageY;
+  final num _pageY;
 
   @JSName('radiusX')
   @DomName('Touch.radiusX')
   @DocsEditable()
   @Experimental() // untriaged
-  final double _radiusX;
+  final num _radiusX;
 
   @JSName('radiusY')
   @DomName('Touch.radiusY')
   @DocsEditable()
   @Experimental() // untriaged
-  final double _radiusY;
+  final num _radiusY;
 
   @DomName('Touch.region')
   @DocsEditable()
@@ -34859,17 +39220,17 @@
   @DomName('Touch.rotationAngle')
   @DocsEditable()
   @Experimental() // untriaged
-  final double rotationAngle;
+  final num rotationAngle;
 
   @JSName('screenX')
   @DomName('Touch.screenX')
   @DocsEditable()
-  final double _screenX;
+  final num _screenX;
 
   @JSName('screenY')
   @DomName('Touch.screenY')
   @DocsEditable()
-  final double _screenY;
+  final num _screenY;
 
   @DomName('Touch.target')
   @DocsEditable()
@@ -34929,30 +39290,25 @@
 @Experimental()
 @Native("TouchEvent")
 class TouchEvent extends UIEvent {
-  factory TouchEvent(TouchList touches, TouchList targetTouches,
-      TouchList changedTouches, String type,
-      {Window view,
-      int screenX: 0,
-      int screenY: 0,
-      int clientX: 0,
-      int clientY: 0,
-      bool ctrlKey: false,
-      bool altKey: false,
-      bool shiftKey: false,
-      bool metaKey: false}) {
-    if (view == null) {
-      view = window;
-    }
-    TouchEvent e = document._createEvent("TouchEvent");
-    e._initTouchEvent(touches, targetTouches, changedTouches, type, view,
-        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
-    return e;
-  }
   // To suppress missing implicit constructor warnings.
   factory TouchEvent._() {
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('TouchEvent.TouchEvent')
+  @DocsEditable()
+  factory TouchEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return TouchEvent._create_1(type, eventInitDict_1);
+    }
+    return TouchEvent._create_2(type);
+  }
+  static TouchEvent _create_1(type, eventInitDict) =>
+      JS('TouchEvent', 'new TouchEvent(#,#)', type, eventInitDict);
+  static TouchEvent _create_2(type) =>
+      JS('TouchEvent', 'new TouchEvent(#)', type);
+
   @DomName('TouchEvent.altKey')
   @DocsEditable()
   final bool altKey;
@@ -34981,24 +39337,6 @@
   @DocsEditable()
   final TouchList touches;
 
-  @JSName('initTouchEvent')
-  @DomName('TouchEvent.initTouchEvent')
-  @DocsEditable()
-  void _initTouchEvent(
-      TouchList touches,
-      TouchList targetTouches,
-      TouchList changedTouches,
-      String type,
-      Window view,
-      int unused1,
-      int unused2,
-      int unused3,
-      int unused4,
-      bool ctrlKey,
-      bool altKey,
-      bool shiftKey,
-      bool metaKey) native;
-
   /**
    * Checks if touch events supported on the current platform.
    *
@@ -35131,7 +39469,7 @@
   @DomName('TrackDefault.kinds')
   @DocsEditable()
   @Experimental() // untriaged
-  final List<String> kinds;
+  final Object kinds;
 
   @DomName('TrackDefault.label')
   @DocsEditable()
@@ -35299,70 +39637,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('TransformComponent')
-@Experimental() // untriaged
-@Native("TransformComponent")
-class TransformComponent extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory TransformComponent._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('TransformComponent.cssString')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final String cssString;
-
-  @DomName('TransformComponent.asMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Matrix asMatrix() native;
-
-  @DomName('TransformComponent.is2DComponent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool is2DComponent() 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('TransformValue')
-@Experimental() // untriaged
-@Native("TransformValue")
-class TransformValue extends StyleValue {
-  // To suppress missing implicit constructor warnings.
-  factory TransformValue._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('TransformValue.TransformValue')
-  @DocsEditable()
-  factory TransformValue([List<TransformComponent> transformComponents]) {
-    if (transformComponents == null) {
-      return TransformValue._create_1();
-    }
-    if ((transformComponents is List<TransformComponent>)) {
-      return TransformValue._create_2(transformComponents);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-  static TransformValue _create_1() =>
-      JS('TransformValue', 'new TransformValue()');
-  static TransformValue _create_2(transformComponents) =>
-      JS('TransformValue', 'new TransformValue(#)', transformComponents);
-
-  @DomName('TransformValue.is2D')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool is2D() 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('TransitionEvent')
 @Native("TransitionEvent,WebKitTransitionEvent")
 class TransitionEvent extends Event {
@@ -35387,7 +39661,7 @@
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  final double elapsedTime;
+  final num elapsedTime;
 
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
@@ -35397,51 +39671,6 @@
   @DocsEditable()
   final String pseudoElement;
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('Translation')
-@Experimental() // untriaged
-@Native("Translation")
-class Translation extends TransformComponent {
-  // To suppress missing implicit constructor warnings.
-  factory Translation._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('Translation.Translation')
-  @DocsEditable()
-  factory Translation(LengthValue x, LengthValue y, [LengthValue z]) {
-    if ((y is LengthValue) && (x is LengthValue) && z == null) {
-      return Translation._create_1(x, y);
-    }
-    if ((z is LengthValue) && (y is LengthValue) && (x is LengthValue)) {
-      return Translation._create_2(x, y, z);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-  static Translation _create_1(x, y) =>
-      JS('Translation', 'new Translation(#,#)', x, y);
-  static Translation _create_2(x, y, z) =>
-      JS('Translation', 'new Translation(#,#,#)', x, y, z);
-
-  @DomName('Translation.x')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final LengthValue x;
-
-  @DomName('Translation.y')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final LengthValue y;
-
-  @DomName('Translation.z')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final LengthValue z;
-}
 // 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.
@@ -35506,6 +39735,73 @@
 // for 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('TrustedHTML')
+@Experimental() // untriaged
+@Native("TrustedHTML")
+class TrustedHtml extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory TrustedHtml._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('TrustedHTML.escape')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static TrustedHtml escape(String html) native;
+
+  @DomName('TrustedHTML.unsafelyCreate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static TrustedHtml unsafelyCreate(String html) 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('TrustedScriptURL')
+@Experimental() // untriaged
+@Native("TrustedScriptURL")
+class TrustedScriptUrl extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory TrustedScriptUrl._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('TrustedScriptURL.unsafelyCreate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static TrustedScriptUrl unsafelyCreate(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('TrustedURL')
+@Experimental() // untriaged
+@Native("TrustedURL")
+class TrustedUrl extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory TrustedUrl._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('TrustedURL.create')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static TrustedUrl create(String url) native;
+
+  @DomName('TrustedURL.unsafelyCreate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static TrustedUrl unsafelyCreate(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.
+
 // WARNING: Do not edit - generated code.
 
 @DomName('UIEvent')
@@ -35620,6 +39916,16 @@
   @Experimental() // untriaged
   Future cancel(Object reason) native;
 
+  @DomName('UnderlyingSourceBase.notifyLockAcquired')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void notifyLockAcquired() native;
+
+  @DomName('UnderlyingSourceBase.notifyLockReleased')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void notifyLockReleased() native;
+
   @DomName('UnderlyingSourceBase.pull')
   @DocsEditable()
   @Experimental() // untriaged
@@ -35655,7 +39961,7 @@
 
 @DomName('URL')
 @Native("URL")
-class Url extends Interceptor implements UrlUtils {
+class Url extends Interceptor {
   static String createObjectUrl(blob_OR_source_OR_stream) => JS(
       'String',
       '(self.URL || self.webkitURL).createObjectURL(#)',
@@ -35682,8 +39988,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  // From URLUtils
-
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
@@ -35734,6 +40038,11 @@
   @Experimental() // untriaged
   String search;
 
+  @DomName('URL.searchParams')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final UrlSearchParams searchParams;
+
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
@@ -35795,43 +40104,11 @@
   @DocsEditable()
   @Experimental() // untriaged
   void set(String name, String 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('URLUtils')
-@Experimental() // untriaged
-abstract class UrlUtils extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory UrlUtils._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  String hash;
-
-  String host;
-
-  String hostname;
-
-  String href;
-
-  final String origin;
-
-  String password;
-
-  String pathname;
-
-  String port;
-
-  String protocol;
-
-  String search;
-
-  String username;
-
-  String toString();
+  @DomName('URLSearchParams.sort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void sort() 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
@@ -35863,8 +40140,44 @@
   final String protocol;
 
   final String search;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
 
-  String toString();
+@DocsEditable()
+@DomName('VR')
+@Experimental() // untriaged
+@Native("VR")
+class VR extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory VR._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VR.getDevices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getDevices() 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('VRCoordinateSystem')
+@Experimental() // untriaged
+@Native("VRCoordinateSystem")
+class VRCoordinateSystem extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRCoordinateSystem._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRCoordinateSystem.getTransformTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Float32List getTransformTo(VRCoordinateSystem other) 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
@@ -35874,26 +40187,254 @@
 @DomName('VRDevice')
 @Experimental() // untriaged
 @Native("VRDevice")
-class VRDevice extends Interceptor {
+class VRDevice extends EventTarget {
   // 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')
+  @DomName('VRDevice.isExternal')
   @DocsEditable()
   @Experimental() // untriaged
-  final String hardwareUnitId;
+  final bool isExternal;
+
+  @DomName('VRDevice.requestSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestSession([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _requestSession_1(options_1);
+    }
+    return _requestSession_2();
+  }
+
+  @JSName('requestSession')
+  @DomName('VRDevice.requestSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _requestSession_1(options) native;
+  @JSName('requestSession')
+  @DomName('VRDevice.requestSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _requestSession_2() native;
+
+  @DomName('VRDevice.supportsSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future supportsSession([Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _supportsSession_1(options_1);
+    }
+    return _supportsSession_2();
+  }
+
+  @JSName('supportsSession')
+  @DomName('VRDevice.supportsSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _supportsSession_1(options) native;
+  @JSName('supportsSession')
+  @DomName('VRDevice.supportsSession')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future _supportsSession_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('VRDeviceEvent')
+@Experimental() // untriaged
+@Native("VRDeviceEvent")
+class VRDeviceEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory VRDeviceEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRDeviceEvent.VRDeviceEvent')
+  @DocsEditable()
+  factory VRDeviceEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return VRDeviceEvent._create_1(type, eventInitDict_1);
+  }
+  static VRDeviceEvent _create_1(type, eventInitDict) =>
+      JS('VRDeviceEvent', 'new VRDeviceEvent(#,#)', type, eventInitDict);
+
+  @DomName('VRDeviceEvent.device')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRDevice device;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VRDisplay')
+@Experimental() // untriaged
+@Native("VRDisplay")
+class VRDisplay extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory VRDisplay._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRDisplay.capabilities')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRDisplayCapabilities capabilities;
+
+  @DomName('VRDisplay.depthFar')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num depthFar;
+
+  @DomName('VRDisplay.depthNear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num depthNear;
+
+  @DomName('VRDisplay.displayId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int displayId;
+
+  @DomName('VRDisplay.displayName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String displayName;
+
+  @DomName('VRDisplay.isPresenting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isPresenting;
+
+  @DomName('VRDisplay.stageParameters')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRStageParameters stageParameters;
+
+  @DomName('VRDisplay.cancelAnimationFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cancelAnimationFrame(int handle) native;
+
+  @DomName('VRDisplay.exitPresent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future exitPresent() native;
+
+  @DomName('VRDisplay.getEyeParameters')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VREyeParameters getEyeParameters(String whichEye) native;
+
+  @DomName('VRDisplay.getFrameData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool getFrameData(VRFrameData frameData) native;
+
+  @DomName('VRDisplay.getLayers')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Map> getLayers() native;
+
+  @DomName('VRDisplay.requestAnimationFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int requestAnimationFrame(FrameRequestCallback callback) native;
+
+  @DomName('VRDisplay.requestPresent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestPresent(List<Map> layers) native;
+
+  @DomName('VRDisplay.submitFrame')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void submitFrame() 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('VRDisplayCapabilities')
+@Experimental() // untriaged
+@Native("VRDisplayCapabilities")
+class VRDisplayCapabilities extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRDisplayCapabilities._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRDisplayCapabilities.canPresent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool canPresent;
+
+  @DomName('VRDisplayCapabilities.hasExternalDisplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool hasExternalDisplay;
+
+  @DomName('VRDisplayCapabilities.hasPosition')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool hasPosition;
+
+  @DomName('VRDisplayCapabilities.maxLayers')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int maxLayers;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VRDisplayEvent')
+@Experimental() // untriaged
+@Native("VRDisplayEvent")
+class VRDisplayEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory VRDisplayEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRDisplayEvent.VRDisplayEvent')
+  @DocsEditable()
+  factory VRDisplayEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return VRDisplayEvent._create_1(type, eventInitDict_1);
+    }
+    return VRDisplayEvent._create_2(type);
+  }
+  static VRDisplayEvent _create_1(type, eventInitDict) =>
+      JS('VRDisplayEvent', 'new VRDisplayEvent(#,#)', type, eventInitDict);
+  static VRDisplayEvent _create_2(type) =>
+      JS('VRDisplayEvent', 'new VRDisplayEvent(#)', type);
+
+  @DomName('VRDisplayEvent.display')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRDisplay display;
+
+  @DomName('VRDisplayEvent.reason')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String 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
@@ -35909,132 +40450,317 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VREyeParameters.currentFieldOfView')
+  @DomName('VREyeParameters.offset')
   @DocsEditable()
   @Experimental() // untriaged
-  final VRFieldOfView currentFieldOfView;
+  final Float32List offset;
 
-  @DomName('VREyeParameters.eyeTranslation')
+  @DomName('VREyeParameters.renderHeight')
   @DocsEditable()
   @Experimental() // untriaged
-  final DomPoint eyeTranslation;
+  final int renderHeight;
 
-  @DomName('VREyeParameters.maximumFieldOfView')
+  @DomName('VREyeParameters.renderWidth')
   @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;
+  final int renderWidth;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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')
+@DomName('VRFrameData')
 @Experimental() // untriaged
-@Native("VRFieldOfView")
-class VRFieldOfView extends Interceptor {
+@Native("VRFrameData")
+class VRFrameData extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VRFieldOfView._() {
+  factory VRFrameData._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRFieldOfView.VRFieldOfView')
+  @DomName('VRFrameData.VRFrameData')
   @DocsEditable()
-  factory VRFieldOfView([Map fov]) {
-    if (fov != null) {
-      var fov_1 = convertDartToNative_Dictionary(fov);
-      return VRFieldOfView._create_1(fov_1);
+  factory VRFrameData() {
+    return VRFrameData._create_1();
+  }
+  static VRFrameData _create_1() => JS('VRFrameData', 'new VRFrameData()');
+
+  @DomName('VRFrameData.leftProjectionMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List leftProjectionMatrix;
+
+  @DomName('VRFrameData.leftViewMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List leftViewMatrix;
+
+  @DomName('VRFrameData.pose')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRPose pose;
+
+  @DomName('VRFrameData.rightProjectionMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List rightProjectionMatrix;
+
+  @DomName('VRFrameData.rightViewMatrix')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List rightViewMatrix;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VRFrameOfReference')
+@Experimental() // untriaged
+@Native("VRFrameOfReference")
+class VRFrameOfReference extends VRCoordinateSystem {
+  // To suppress missing implicit constructor warnings.
+  factory VRFrameOfReference._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRFrameOfReference.bounds')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRStageBounds bounds;
+
+  @DomName('VRFrameOfReference.emulatedHeight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num emulatedHeight;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VRPose')
+@Experimental() // untriaged
+@Native("VRPose")
+class VRPose extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRPose._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRPose.angularAcceleration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List angularAcceleration;
+
+  @DomName('VRPose.angularVelocity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List angularVelocity;
+
+  @DomName('VRPose.linearAcceleration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List linearAcceleration;
+
+  @DomName('VRPose.linearVelocity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List linearVelocity;
+
+  @DomName('VRPose.orientation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List orientation;
+
+  @DomName('VRPose.position')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List position;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('VRSession')
+@Experimental() // untriaged
+@Native("VRSession")
+class VRSession extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory VRSession._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRSession.blurEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> blurEvent =
+      const EventStreamProvider<Event>('blur');
+
+  @DomName('VRSession.focusEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> focusEvent =
+      const EventStreamProvider<Event>('focus');
+
+  @DomName('VRSession.depthFar')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num depthFar;
+
+  @DomName('VRSession.depthNear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num depthNear;
+
+  @DomName('VRSession.device')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VRDevice device;
+
+  @DomName('VRSession.exclusive')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool exclusive;
+
+  @DomName('VRSession.end')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future end() native;
+
+  @DomName('VRSession.requestFrameOfReference')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future requestFrameOfReference(String type, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _requestFrameOfReference_1(type, options_1);
     }
-    return VRFieldOfView._create_2();
+    return _requestFrameOfReference_2(type);
   }
-  static VRFieldOfView _create_1(fov) =>
-      JS('VRFieldOfView', 'new VRFieldOfView(#)', fov);
-  static VRFieldOfView _create_2() =>
-      JS('VRFieldOfView', 'new VRFieldOfView()');
 
-  @DomName('VRFieldOfView.downDegrees')
+  @JSName('requestFrameOfReference')
+  @DomName('VRSession.requestFrameOfReference')
   @DocsEditable()
   @Experimental() // untriaged
-  num downDegrees;
-
-  @DomName('VRFieldOfView.leftDegrees')
+  Future _requestFrameOfReference_1(type, options) native;
+  @JSName('requestFrameOfReference')
+  @DomName('VRSession.requestFrameOfReference')
   @DocsEditable()
   @Experimental() // untriaged
-  num leftDegrees;
+  Future _requestFrameOfReference_2(type) native;
 
-  @DomName('VRFieldOfView.rightDegrees')
+  @DomName('VRSession.onblur')
   @DocsEditable()
   @Experimental() // untriaged
-  num rightDegrees;
+  Stream<Event> get onBlur => blurEvent.forTarget(this);
 
-  @DomName('VRFieldOfView.upDegrees')
+  @DomName('VRSession.onfocus')
   @DocsEditable()
   @Experimental() // untriaged
-  num upDegrees;
+  Stream<Event> get onFocus => focusEvent.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('VRPositionState')
+@DomName('VRSessionEvent')
 @Experimental() // untriaged
-@Native("VRPositionState")
-class VRPositionState extends Interceptor {
+@Native("VRSessionEvent")
+class VRSessionEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory VRPositionState._() {
+  factory VRSessionEvent._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRPositionState.angularAcceleration')
+  @DomName('VRSessionEvent.VRSessionEvent')
   @DocsEditable()
-  @Experimental() // untriaged
-  final DomPoint angularAcceleration;
+  factory VRSessionEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return VRSessionEvent._create_1(type, eventInitDict_1);
+  }
+  static VRSessionEvent _create_1(type, eventInitDict) =>
+      JS('VRSessionEvent', 'new VRSessionEvent(#,#)', type, eventInitDict);
 
-  @DomName('VRPositionState.angularVelocity')
+  @DomName('VRSessionEvent.session')
   @DocsEditable()
   @Experimental() // untriaged
-  final DomPoint angularVelocity;
+  final VRSession 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.
 
-  @DomName('VRPositionState.linearAcceleration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final DomPoint linearAcceleration;
+@DocsEditable()
+@DomName('VRStageBounds')
+@Experimental() // untriaged
+@Native("VRStageBounds")
+class VRStageBounds extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRStageBounds._() {
+    throw new UnsupportedError("Not supported");
+  }
 
-  @DomName('VRPositionState.linearVelocity')
+  @DomName('VRStageBounds.geometry')
   @DocsEditable()
   @Experimental() // untriaged
-  final DomPoint linearVelocity;
+  final List<VRStageBoundsPoint> geometry;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VRPositionState.orientation')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final DomPoint orientation;
+@DocsEditable()
+@DomName('VRStageBoundsPoint')
+@Experimental() // untriaged
+@Native("VRStageBoundsPoint")
+class VRStageBoundsPoint extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRStageBoundsPoint._() {
+    throw new UnsupportedError("Not supported");
+  }
 
-  @DomName('VRPositionState.position')
+  @DomName('VRStageBoundsPoint.x')
   @DocsEditable()
   @Experimental() // untriaged
-  final DomPoint position;
+  final num x;
 
-  @DomName('VRPositionState.timeStamp')
+  @DomName('VRStageBoundsPoint.z')
   @DocsEditable()
   @Experimental() // untriaged
-  final double timeStamp;
+  final num z;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('VRStageParameters')
+@Experimental() // untriaged
+@Native("VRStageParameters")
+class VRStageParameters extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VRStageParameters._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VRStageParameters.sittingToStandingTransform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Float32List sittingToStandingTransform;
+
+  @DomName('VRStageParameters.sizeX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num sizeX;
+
+  @DomName('VRStageParameters.sizeZ')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num sizeZ;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -36201,7 +40927,7 @@
   @DomName('VideoPlaybackQuality.creationTime')
   @DocsEditable()
   @Experimental() // untriaged
-  final double creationTime;
+  final num creationTime;
 
   @DomName('VideoPlaybackQuality.droppedVideoFrames')
   @DocsEditable()
@@ -36251,6 +40977,11 @@
   @DocsEditable()
   @Experimental() // untriaged
   bool selected;
+
+  @DomName('VideoTrack.sourceBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final SourceBuffer sourceBuffer;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -36301,6 +41032,77 @@
 // for 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('VisualViewport')
+@Experimental() // untriaged
+@Native("VisualViewport")
+class VisualViewport extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory VisualViewport._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('VisualViewport.resizeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> resizeEvent =
+      const EventStreamProvider<Event>('resize');
+
+  @DomName('VisualViewport.scrollEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> scrollEvent =
+      const EventStreamProvider<Event>('scroll');
+
+  @DomName('VisualViewport.height')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num height;
+
+  @DomName('VisualViewport.offsetLeft')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num offsetLeft;
+
+  @DomName('VisualViewport.offsetTop')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num offsetTop;
+
+  @DomName('VisualViewport.pageLeft')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num pageLeft;
+
+  @DomName('VisualViewport.pageTop')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num pageTop;
+
+  @DomName('VisualViewport.scale')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num scale;
+
+  @DomName('VisualViewport.width')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num width;
+
+  @DomName('VisualViewport.onresize')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onResize => resizeEvent.forTarget(this);
+
+  @DomName('VisualViewport.onscroll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onScroll => scrollEvent.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.
 
 @DomName('VoidCallback')
@@ -36348,10 +41150,10 @@
   @Returns('num|String')
   Object position;
 
-  @DomName('VTTCue.regionId')
+  @DomName('VTTCue.region')
   @DocsEditable()
   @Experimental() // untriaged
-  String regionId;
+  VttRegion region;
 
   @DomName('VTTCue.size')
   @DocsEditable()
@@ -36400,16 +41202,16 @@
   }
   static VttRegion _create_1() => JS('VttRegion', 'new VTTRegion()');
 
-  @DomName('VTTRegion.height')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int height;
-
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
   String id;
 
+  @DomName('VTTRegion.lines')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int lines;
+
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
@@ -36425,11 +41227,6 @@
   @Experimental() // untriaged
   String scroll;
 
-  @DomName('VTTRegion.track')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final TextTrack track;
-
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
@@ -36450,35 +41247,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('VTTRegionList')
-@Experimental() // untriaged
-@Native("VTTRegionList")
-class VttRegionList extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory VttRegionList._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('VTTRegionList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int length;
-
-  @DomName('VTTRegionList.getRegionById')
-  @DocsEditable()
-  @Experimental() // untriaged
-  VttRegion getRegionById(String id) native;
-
-  @DomName('VTTRegionList.item')
-  @DocsEditable()
-  @Experimental() // untriaged
-  VttRegion 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()
 /**
  * Use the WebSocket interface to connect to a WebSocket,
  * and to send and receive data on that WebSocket.
@@ -36793,16 +41561,16 @@
   @JSName('deltaX')
   @DomName('WheelEvent.deltaX')
   @DocsEditable()
-  final double _deltaX;
+  final num _deltaX;
 
   @JSName('deltaY')
   @DomName('WheelEvent.deltaY')
   @DocsEditable()
-  final double _deltaY;
+  final num _deltaY;
 
   @DomName('WheelEvent.deltaZ')
   @DocsEditable()
-  final double deltaZ;
+  final num deltaZ;
 
   /**
    * The amount that is expected to scroll vertically, in units determined by
@@ -37356,6 +42124,11 @@
   @Experimental()
   static const int TEMPORARY = 0;
 
+  @DomName('Window.animationWorklet')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _Worklet animationWorklet;
+
   /**
    * The application cache for this window.
    *
@@ -37372,6 +42145,11 @@
   @DocsEditable()
   final ApplicationCache applicationCache;
 
+  @DomName('Window.audioWorklet')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _Worklet audioWorklet;
+
   @DomName('Window.caches')
   @DocsEditable()
   @Experimental() // untriaged
@@ -37381,6 +42159,11 @@
   @DocsEditable()
   final bool closed;
 
+  @DomName('Window.cookieStore')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CookieStore cookieStore;
+
   /**
    * Entrypoint for the browser's cryptographic functions.
    *
@@ -37394,6 +42177,11 @@
   @Experimental()
   final Crypto crypto;
 
+  @DomName('Window.customElements')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CustomElementRegistry customElements;
+
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
@@ -37420,7 +42208,12 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  final double devicePixelRatio;
+  final num devicePixelRatio;
+
+  @DomName('Window.external')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final External external;
 
   /**
    * The current session history for this window's newest document.
@@ -37562,6 +42355,11 @@
   @Experimental() // untriaged
   final int orientation;
 
+  @DomName('Window.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
   /**
    * The height of this window including all user interface elements.
    *
@@ -37602,7 +42400,7 @@
    */
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  final double _pageXOffset;
+  final num _pageXOffset;
 
   @JSName('pageYOffset')
   /**
@@ -37620,7 +42418,7 @@
    */
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  final double _pageYOffset;
+  final num _pageYOffset;
 
   @DomName('Window.parent')
   @DocsEditable()
@@ -37650,11 +42448,6 @@
   @SupportedBrowser(SupportedBrowser.IE)
   final Performance performance;
 
-  @DomName('Window.renderWorklet')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final _Worklet renderWorklet;
-
   /**
    * Information about the screen displaying this window.
    *
@@ -37843,6 +42636,11 @@
   @Returns('Window|=Object')
   final dynamic _get_top;
 
+  @DomName('Window.visualViewport')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VisualViewport visualViewport;
+
   /**
    * The current window.
    *
@@ -37968,7 +42766,13 @@
   @JSName('getComputedStyle')
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element elt, String pseudoElt) native;
+  CssStyleDeclaration _getComputedStyle(Element elt, [String pseudoElt]) native;
+
+  @DomName('Window.getComputedStyleMap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  StylePropertyMapReadonly getComputedStyleMap(
+      Element element, String pseudoElement) native;
 
   @JSName('getMatchedCSSRules')
   /**
@@ -38047,7 +42851,7 @@
   @DomName('Window.postMessage')
   @DocsEditable()
   void postMessage(/*any*/ message, String targetOrigin,
-      [List<MessagePort> transfer]) {
+      [List<Object> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, targetOrigin, transfer);
@@ -38061,7 +42865,7 @@
   @JSName('postMessage')
   @DomName('Window.postMessage')
   @DocsEditable()
-  void _postMessage_1(message, targetOrigin, List<MessagePort> transfer) native;
+  void _postMessage_1(message, targetOrigin, List<Object> transfer) native;
   @JSName('postMessage')
   @DomName('Window.postMessage')
   @DocsEditable()
@@ -38971,6 +43775,10 @@
   @DomName('Window.onbeforeunload')
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
+  /// Stream of `wheel` events handled by this [Window].
+  @DomName('Window.onWheel')
+  Stream<WheelEvent> get onWheel => Element.wheelEvent.forTarget(this);
+
   /**
    * Moves this window to a specific position.
    *
@@ -39301,26 +44109,7 @@
 
   @DomName('Worker.postMessage')
   @DocsEditable()
-  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('Worker.postMessage')
-  @DocsEditable()
-  void _postMessage_1(message, List<MessagePort> transfer) native;
-  @JSName('postMessage')
-  @DomName('Worker.postMessage')
-  @DocsEditable()
-  void _postMessage_2(message) native;
+  void postMessage(Object message, [List<Object> transfer]) native;
 
   @DomName('Worker.terminate')
   @DocsEditable()
@@ -39342,20 +44131,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('WorkerConsole')
-@Experimental() // untriaged
-@Native("WorkerConsole")
-class WorkerConsole extends ConsoleBase {
-  // To suppress missing implicit constructor warnings.
-  factory WorkerConsole._() {
-    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('WorkerGlobalScope')
 @Experimental() // untriaged
 @Native("WorkerGlobalScope")
@@ -39378,16 +44153,16 @@
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
+  @DomName('WorkerGlobalScope.addressSpace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String addressSpace;
+
   @DomName('WorkerGlobalScope.caches')
   @DocsEditable()
   @Experimental() // untriaged
   final CacheStorage caches;
 
-  @DomName('WorkerGlobalScope.console')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final WorkerConsole console;
-
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
@@ -39398,6 +44173,11 @@
   @Experimental() // untriaged
   final IdbFactory indexedDB;
 
+  @DomName('WorkerGlobalScope.isSecureContext')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool isSecureContext;
+
   @DomName('WorkerGlobalScope.location')
   @DocsEditable()
   @Experimental() // untriaged
@@ -39408,6 +44188,11 @@
   @Experimental() // untriaged
   final _WorkerNavigator navigator;
 
+  @DomName('WorkerGlobalScope.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
   @DomName('WorkerGlobalScope.performance')
   @DocsEditable()
   @Experimental() // untriaged
@@ -39418,11 +44203,6 @@
   @Experimental() // untriaged
   final WorkerGlobalScope self;
 
-  @DomName('WorkerGlobalScope.close')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void close() native;
-
   @DomName('WorkerGlobalScope.fetch')
   @DocsEditable()
   @Experimental() // untriaged
@@ -39527,6 +44307,11 @@
   @Experimental() // untriaged
   final MemoryInfo memory;
 
+  @DomName('WorkerPerformance.timeOrigin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num timeOrigin;
+
   @DomName('WorkerPerformance.clearMarks')
   @DocsEditable()
   @Experimental() // untriaged
@@ -39582,6 +44367,65 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('WorkletAnimation')
+@Experimental() // untriaged
+@Native("WorkletAnimation")
+class WorkletAnimation extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory WorkletAnimation._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('WorkletAnimation.WorkletAnimation')
+  @DocsEditable()
+  factory WorkletAnimation(
+      String animatorName,
+      List<KeyframeEffectReadOnly> effects,
+      List<Object> timelines,
+      /*SerializedScriptValue*/ options) {
+    var options_1 = convertDartToNative_SerializedScriptValue(options);
+    return WorkletAnimation._create_1(
+        animatorName, effects, timelines, options_1);
+  }
+  static WorkletAnimation _create_1(
+          animatorName, effects, timelines, options) =>
+      JS('WorkletAnimation', 'new WorkletAnimation(#,#,#,#)', animatorName,
+          effects, timelines, options);
+
+  @DomName('WorkletAnimation.playState')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String playState;
+
+  @DomName('WorkletAnimation.cancel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cancel() native;
+
+  @DomName('WorkletAnimation.play')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void play() 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('WorkletGlobalScope')
+@Experimental() // untriaged
+@Native("WorkletGlobalScope")
+class WorkletGlobalScope extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory WorkletGlobalScope._() {
+    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('XPathEvaluator')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
 @deprecated // experimental
@@ -39719,7 +44563,7 @@
 
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  final double numberValue;
+  final num numberValue;
 
   @DomName('XPathResult.resultType')
   @DocsEditable()
@@ -39875,9 +44719,6 @@
   @Experimental() // untriaged
   final String _namespaceUri;
 
-  // Use implementation from Node.
-  // final String nodeValue;
-
   @DomName('Attr.value')
   @DocsEditable()
   String value;
@@ -39901,20 +44742,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('BluetoothAdvertisingData')
-@Experimental() // untriaged
-@Native("BluetoothAdvertisingData")
-abstract class _BluetoothAdvertisingData extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _BluetoothAdvertisingData._() {
-    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('BluetoothCharacteristicProperties')
 @Experimental() // untriaged
 @Native("BluetoothCharacteristicProperties")
@@ -39999,6 +44826,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('BudgetService')
+@Experimental() // untriaged
+@Native("BudgetService")
+class _BudgetService extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory _BudgetService._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BudgetService.getBudget')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getBudget() native;
+
+  @DomName('BudgetService.getCost')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getCost(String operation) native;
+
+  @DomName('BudgetService.reserve')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future reserve(String operation) 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('Cache')
 @Experimental() // untriaged
 @Native("Cache")
@@ -40013,247 +44869,46 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('CanvasPathMethods')
+@DomName('CanvasPath')
 @Experimental() // untriaged
-abstract class _CanvasPathMethods extends Interceptor {
+abstract class _CanvasPath extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _CanvasPathMethods._() {
+  factory _CanvasPath._() {
     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.
-
-@DocsEditable()
-@DomName('ClientRect')
-@Native("ClientRect")
-class _ClientRect extends Interceptor implements Rectangle {
-  // NOTE! All code below should be common with RectangleBase.
-  String toString() {
-    return 'Rectangle ($left, $top) $width x $height';
-  }
-
-  bool operator ==(other) {
-    if (other is! Rectangle) return false;
-    return left == other.left &&
-        top == other.top &&
-        width == other.width &&
-        height == other.height;
-  }
-
-  int get hashCode => _JenkinsSmiHash.hash4(
-      left.hashCode, top.hashCode, width.hashCode, height.hashCode);
-
-  /**
-   * Computes the intersection of `this` and [other].
-   *
-   * The intersection of two axis-aligned rectangles, if any, is always another
-   * axis-aligned rectangle.
-   *
-   * Returns the intersection of this and `other`, or null if they don't
-   * intersect.
-   */
-  Rectangle intersection(Rectangle other) {
-    var x0 = max(left, other.left);
-    var x1 = min(left + width, other.left + other.width);
-
-    if (x0 <= x1) {
-      var y0 = max(top, other.top);
-      var y1 = min(top + height, other.top + other.height);
-
-      if (y0 <= y1) {
-        return new Rectangle(x0, y0, x1 - x0, y1 - y0);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Returns true if `this` intersects [other].
-   */
-  bool intersects(Rectangle<num> other) {
-    return (left <= other.left + other.width &&
-        other.left <= left + width &&
-        top <= other.top + other.height &&
-        other.top <= top + height);
-  }
-
-  /**
-   * Returns a new rectangle which completely contains `this` and [other].
-   */
-  Rectangle boundingBox(Rectangle other) {
-    var right = max(this.left + this.width, other.left + other.width);
-    var bottom = max(this.top + this.height, other.top + other.height);
-
-    var left = min(this.left, other.left);
-    var top = min(this.top, other.top);
-
-    return new Rectangle(left, top, right - left, bottom - top);
-  }
-
-  /**
-   * Tests whether `this` entirely contains [another].
-   */
-  bool containsRectangle(Rectangle<num> another) {
-    return left <= another.left &&
-        left + width >= another.left + another.width &&
-        top <= another.top &&
-        top + height >= another.top + another.height;
-  }
-
-  /**
-   * Tests whether [another] is inside or along the edges of `this`.
-   */
-  bool containsPoint(Point<num> another) {
-    return another.x >= left &&
-        another.x <= left + width &&
-        another.y >= top &&
-        another.y <= top + height;
-  }
-
-  Point get topLeft => new Point(this.left, this.top);
-  Point get topRight => new Point(this.left + this.width, this.top);
-  Point get bottomRight =>
-      new Point(this.left + this.width, this.top + this.height);
-  Point get bottomLeft => new Point(this.left, this.top + this.height);
-
-  // To suppress missing implicit constructor warnings.
-  factory _ClientRect._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('ClientRect.bottom')
-  @DocsEditable()
-  final double bottom;
-
-  @DomName('ClientRect.height')
-  @DocsEditable()
-  final double height;
-
-  @DomName('ClientRect.left')
-  @DocsEditable()
-  final double left;
-
-  @DomName('ClientRect.right')
-  @DocsEditable()
-  final double right;
-
-  @DomName('ClientRect.top')
-  @DocsEditable()
-  final double top;
-
-  @DomName('ClientRect.width')
-  @DocsEditable()
-  final double width;
-}
-
-/**
- * This is the [Jenkins hash function][1] but using masking to keep
- * values in SMI range.
- *
- * [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
- *
- * Use:
- * Hash each value with the hash of the previous value, then get the final
- * hash by calling finish.
- *
- *     var hash = 0;
- *     for (var value in values) {
- *       hash = JenkinsSmiHash.combine(hash, value.hashCode);
- *     }
- *     hash = JenkinsSmiHash.finish(hash);
- */
-class _JenkinsSmiHash {
-  // TODO(11617): This class should be optimized and standardized elsewhere.
-
-  static int combine(int hash, int value) {
-    hash = 0x1fffffff & (hash + value);
-    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
-    return hash ^ (hash >> 6);
-  }
-
-  static int finish(int hash) {
-    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
-    hash = hash ^ (hash >> 11);
-    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
-  }
-
-  static int hash2(a, b) => finish(combine(combine(0, a), b));
-
-  static int hash4(a, b, c, d) =>
-      finish(combine(combine(combine(combine(0, a), b), c), d));
-}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('ClientRectList')
-@Native("ClientRectList,DOMRectList")
-class _ClientRectList extends Interceptor
-    with ListMixin<Rectangle>, ImmutableListMixin<Rectangle>
-    implements List<Rectangle>, JavaScriptIndexingBehavior<Rectangle> {
+@DomName('Clipboard')
+@Native("Clipboard")
+class _Clipboard extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory _ClientRectList._() {
+  factory _Clipboard._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ClientRectList.length')
-  @DocsEditable()
-  int get length => JS("int", "#.length", this);
-
-  Rectangle operator [](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
-      throw new RangeError.index(index, this);
-    return JS("Rectangle", "#[#]", this, index);
-  }
-
-  void operator []=(int index, Rectangle value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Rectangle> mixins.
-  // Rectangle is the element type.
-
-  set length(int value) {
-    throw new UnsupportedError("Cannot resize immutable List.");
-  }
-
-  Rectangle get first {
-    if (this.length > 0) {
-      return JS('Rectangle', '#[0]', this);
-    }
-    throw new StateError("No elements");
-  }
-
-  Rectangle get last {
-    int len = this.length;
-    if (len > 0) {
-      return JS('Rectangle', '#[#]', this, len - 1);
-    }
-    throw new StateError("No elements");
-  }
-
-  Rectangle get single {
-    int len = this.length;
-    if (len == 1) {
-      return JS('Rectangle', '#[0]', this);
-    }
-    if (len == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  Rectangle elementAt(int index) => this[index];
-  // -- end List<Rectangle> mixins.
-
-  @DomName('ClientRectList.__getter__')
+  @DomName('Clipboard.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Rectangle __getter__(int index) native;
+  Future read() native;
 
-  @DomName('ClientRectList.item')
+  @DomName('Clipboard.readText')
   @DocsEditable()
-  Rectangle item(int index) native;
+  @Experimental() // untriaged
+  Future readText() native;
+
+  @DomName('Clipboard.write')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future write(DataTransfer data) native;
+
+  @DomName('Clipboard.writeText')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future writeText(String data) 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
@@ -40386,7 +45041,7 @@
 
 }
 
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -40394,7 +45049,96 @@
 @DomName('DOMRect')
 @Experimental() // untriaged
 @Native("DOMRect")
-class _DomRect extends DomRectReadOnly {
+class _DomRect extends DomRectReadOnly implements Rectangle {
+  // NOTE! All code below should be common with RectangleBase.
+  String toString() {
+    return 'Rectangle ($left, $top) $width x $height';
+  }
+
+  bool operator ==(other) {
+    if (other is! Rectangle) return false;
+    return left == other.left &&
+        top == other.top &&
+        width == other.width &&
+        height == other.height;
+  }
+
+  int get hashCode => _JenkinsSmiHash.hash4(
+      left.hashCode, top.hashCode, width.hashCode, height.hashCode);
+
+  /**
+   * Computes the intersection of `this` and [other].
+   *
+   * The intersection of two axis-aligned rectangles, if any, is always another
+   * axis-aligned rectangle.
+   *
+   * Returns the intersection of this and `other`, or null if they don't
+   * intersect.
+   */
+  Rectangle intersection(Rectangle other) {
+    var x0 = max(left, other.left);
+    var x1 = min(left + width, other.left + other.width);
+
+    if (x0 <= x1) {
+      var y0 = max(top, other.top);
+      var y1 = min(top + height, other.top + other.height);
+
+      if (y0 <= y1) {
+        return new Rectangle(x0, y0, x1 - x0, y1 - y0);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Returns true if `this` intersects [other].
+   */
+  bool intersects(Rectangle<num> other) {
+    return (left <= other.left + other.width &&
+        other.left <= left + width &&
+        top <= other.top + other.height &&
+        other.top <= top + height);
+  }
+
+  /**
+   * Returns a new rectangle which completely contains `this` and [other].
+   */
+  Rectangle boundingBox(Rectangle other) {
+    var right = max(this.left + this.width, other.left + other.width);
+    var bottom = max(this.top + this.height, other.top + other.height);
+
+    var left = min(this.left, other.left);
+    var top = min(this.top, other.top);
+
+    return new Rectangle(left, top, right - left, bottom - top);
+  }
+
+  /**
+   * Tests whether `this` entirely contains [another].
+   */
+  bool containsRectangle(Rectangle<num> another) {
+    return left <= another.left &&
+        left + width >= another.left + another.width &&
+        top <= another.top &&
+        top + height >= another.top + another.height;
+  }
+
+  /**
+   * Tests whether [another] is inside or along the edges of `this`.
+   */
+  bool containsPoint(Point<num> another) {
+    return another.x >= left &&
+        another.x <= left + width &&
+        another.y >= top &&
+        another.y <= top + height;
+  }
+
+  Point get topLeft => new Point(this.left, this.top);
+  Point get topRight => new Point(this.left + this.width, this.top);
+  Point get bottomRight =>
+      new Point(this.left + this.width, this.top + this.height);
+  Point get bottomLeft => new Point(this.left, this.top + this.height);
+
   // To suppress missing implicit constructor warnings.
   factory _DomRect._() {
     throw new UnsupportedError("Not supported");
@@ -40452,6 +45196,65 @@
   set y(num value) {
     JS("void", "#.y = #", this, value);
   }
+
+  @DomName('DOMRect.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Rectangle fromRect([Map other]) {
+    if (other != null) {
+      var other_1 = convertDartToNative_Dictionary(other);
+      return _fromRect_1(other_1);
+    }
+    return _fromRect_2();
+  }
+
+  @JSName('fromRect')
+  @DomName('DOMRect.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Rectangle _fromRect_1(other) native;
+  @JSName('fromRect')
+  @DomName('DOMRect.fromRect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Rectangle _fromRect_2() native;
+}
+
+/**
+ * This is the [Jenkins hash function][1] but using masking to keep
+ * values in SMI range.
+ *
+ * [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
+ *
+ * Use:
+ * Hash each value with the hash of the previous value, then get the final
+ * hash by calling finish.
+ *
+ *     var hash = 0;
+ *     for (var value in values) {
+ *       hash = JenkinsSmiHash.combine(hash, value.hashCode);
+ *     }
+ *     hash = JenkinsSmiHash.finish(hash);
+ */
+class _JenkinsSmiHash {
+  // TODO(11617): This class should be optimized and standardized elsewhere.
+
+  static int combine(int hash, int value) {
+    hash = 0x1fffffff & (hash + value);
+    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+    return hash ^ (hash >> 6);
+  }
+
+  static int finish(int hash) {
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+    hash = hash ^ (hash >> 11);
+    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+  }
+
+  static int hash2(a, b) => finish(combine(combine(0, a), b));
+
+  static int hash4(a, b, c, d) =>
+      finish(combine(combine(combine(combine(0, a), b), c), d));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -40721,6 +45524,111 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('Mojo')
+@Experimental() // untriaged
+@Native("Mojo")
+abstract class _Mojo extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory _Mojo._() {
+    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('MojoHandle')
+@Experimental() // untriaged
+@Native("MojoHandle")
+abstract class _MojoHandle extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory _MojoHandle._() {
+    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('MojoInterfaceInterceptor')
+@Experimental() // untriaged
+@Native("MojoInterfaceInterceptor")
+abstract class _MojoInterfaceInterceptor extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory _MojoInterfaceInterceptor._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('MojoInterfaceInterceptor.MojoInterfaceInterceptor')
+  @DocsEditable()
+  factory _MojoInterfaceInterceptor(String interfaceName, [String scope]) {
+    if (scope != null) {
+      return _MojoInterfaceInterceptor._create_1(interfaceName, scope);
+    }
+    return _MojoInterfaceInterceptor._create_2(interfaceName);
+  }
+  static _MojoInterfaceInterceptor _create_1(interfaceName, scope) => JS(
+      '_MojoInterfaceInterceptor',
+      'new MojoInterfaceInterceptor(#,#)',
+      interfaceName,
+      scope);
+  static _MojoInterfaceInterceptor _create_2(interfaceName) => JS(
+      '_MojoInterfaceInterceptor',
+      'new MojoInterfaceInterceptor(#)',
+      interfaceName);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('MojoInterfaceRequestEvent')
+@Experimental() // untriaged
+@Native("MojoInterfaceRequestEvent")
+abstract class _MojoInterfaceRequestEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory _MojoInterfaceRequestEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('MojoInterfaceRequestEvent.MojoInterfaceRequestEvent')
+  @DocsEditable()
+  factory _MojoInterfaceRequestEvent(String type, [Map eventInitDict]) {
+    if (eventInitDict != null) {
+      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+      return _MojoInterfaceRequestEvent._create_1(type, eventInitDict_1);
+    }
+    return _MojoInterfaceRequestEvent._create_2(type);
+  }
+  static _MojoInterfaceRequestEvent _create_1(type, eventInitDict) => JS(
+      '_MojoInterfaceRequestEvent',
+      'new MojoInterfaceRequestEvent(#,#)',
+      type,
+      eventInitDict);
+  static _MojoInterfaceRequestEvent _create_2(type) => JS(
+      '_MojoInterfaceRequestEvent', 'new MojoInterfaceRequestEvent(#)', 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('MojoWatcher')
+@Experimental() // untriaged
+@Native("MojoWatcher")
+abstract class _MojoWatcher extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory _MojoWatcher._() {
+    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('NFC')
 @Experimental() // untriaged
 @Native("NFC")
@@ -40849,6 +45757,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('Report')
+@Experimental() // untriaged
+@Native("Report")
+class _Report extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory _Report._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('Report.body')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final ReportBody body;
+
+  @DomName('Report.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+
+  @DomName('Report.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String url;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
 @DomName('Request')
 @Experimental() // untriaged
 @Native("Request")
@@ -40871,6 +45808,11 @@
       JS('_Request', 'new Request(#,#)', input, requestInitDict);
   static _Request _create_2(input) => JS('_Request', 'new Request(#)', input);
 
+  @DomName('Request.cache')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String cache;
+
   @DomName('Request.credentials')
   @DocsEditable()
   @Experimental() // untriaged
@@ -40901,6 +45843,11 @@
   @Experimental() // untriaged
   final String referrer;
 
+  @DomName('Request.referrerPolicy')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String referrerPolicy;
+
   @DomName('Request.url')
   @DocsEditable()
   @Experimental() // untriaged
@@ -40942,18 +45889,18 @@
 
   @DomName('Response.Response')
   @DocsEditable()
-  factory _Response([Object body, Map responseInitDict]) {
-    if (responseInitDict != null) {
-      var responseInitDict_1 = convertDartToNative_Dictionary(responseInitDict);
-      return _Response._create_1(body, responseInitDict_1);
+  factory _Response([Object body, Map init]) {
+    if (init != null) {
+      var init_1 = convertDartToNative_Dictionary(init);
+      return _Response._create_1(body, init_1);
     }
     if (body != null) {
       return _Response._create_2(body);
     }
     return _Response._create_3();
   }
-  static _Response _create_1(body, responseInitDict) =>
-      JS('_Response', 'new Response(#,#)', body, responseInitDict);
+  static _Response _create_1(body, init) =>
+      JS('_Response', 'new Response(#,#)', body, init);
   static _Response _create_2(body) => JS('_Response', 'new Response(#)', body);
   static _Response _create_3() => JS('_Response', 'new Response()');
 }
@@ -41207,20 +46154,15 @@
 
   @DomName('USBConnectionEvent.USBConnectionEvent')
   @DocsEditable()
-  factory _USBConnectionEvent(String type, [Map eventInitDict]) {
-    if (eventInitDict != null) {
-      var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return _USBConnectionEvent._create_1(type, eventInitDict_1);
-    }
-    return _USBConnectionEvent._create_2(type);
+  factory _USBConnectionEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return _USBConnectionEvent._create_1(type, eventInitDict_1);
   }
   static _USBConnectionEvent _create_1(type, eventInitDict) => JS(
       '_USBConnectionEvent',
       'new USBConnectionEvent(#,#)',
       type,
       eventInitDict);
-  static _USBConnectionEvent _create_2(type) =>
-      JS('_USBConnectionEvent', 'new USBConnectionEvent(#)', 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
@@ -41276,6 +46218,19 @@
   factory _USBInTransferResult._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('USBInTransferResult.USBInTransferResult')
+  @DocsEditable()
+  factory _USBInTransferResult(String status, [ByteData data]) {
+    if (data != null) {
+      return _USBInTransferResult._create_1(status, data);
+    }
+    return _USBInTransferResult._create_2(status);
+  }
+  static _USBInTransferResult _create_1(status, data) =>
+      JS('_USBInTransferResult', 'new USBInTransferResult(#,#)', status, data);
+  static _USBInTransferResult _create_2(status) =>
+      JS('_USBInTransferResult', 'new USBInTransferResult(#)', status);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -41312,6 +46267,24 @@
   factory _USBIsochronousInTransferPacket._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('USBIsochronousInTransferPacket.USBIsochronousInTransferPacket')
+  @DocsEditable()
+  factory _USBIsochronousInTransferPacket(String status, [ByteData data]) {
+    if (data != null) {
+      return _USBIsochronousInTransferPacket._create_1(status, data);
+    }
+    return _USBIsochronousInTransferPacket._create_2(status);
+  }
+  static _USBIsochronousInTransferPacket _create_1(status, data) => JS(
+      '_USBIsochronousInTransferPacket',
+      'new USBIsochronousInTransferPacket(#,#)',
+      status,
+      data);
+  static _USBIsochronousInTransferPacket _create_2(status) => JS(
+      '_USBIsochronousInTransferPacket',
+      'new USBIsochronousInTransferPacket(#)',
+      status);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -41326,6 +46299,26 @@
   factory _USBIsochronousInTransferResult._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('USBIsochronousInTransferResult.USBIsochronousInTransferResult')
+  @DocsEditable()
+  factory _USBIsochronousInTransferResult(
+      List<_USBIsochronousInTransferPacket> packets,
+      [ByteData data]) {
+    if (data != null) {
+      return _USBIsochronousInTransferResult._create_1(packets, data);
+    }
+    return _USBIsochronousInTransferResult._create_2(packets);
+  }
+  static _USBIsochronousInTransferResult _create_1(packets, data) => JS(
+      '_USBIsochronousInTransferResult',
+      'new USBIsochronousInTransferResult(#,#)',
+      packets,
+      data);
+  static _USBIsochronousInTransferResult _create_2(packets) => JS(
+      '_USBIsochronousInTransferResult',
+      'new USBIsochronousInTransferResult(#)',
+      packets);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -41340,6 +46333,24 @@
   factory _USBIsochronousOutTransferPacket._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('USBIsochronousOutTransferPacket.USBIsochronousOutTransferPacket')
+  @DocsEditable()
+  factory _USBIsochronousOutTransferPacket(String status, [int bytesWritten]) {
+    if (bytesWritten != null) {
+      return _USBIsochronousOutTransferPacket._create_1(status, bytesWritten);
+    }
+    return _USBIsochronousOutTransferPacket._create_2(status);
+  }
+  static _USBIsochronousOutTransferPacket _create_1(status, bytesWritten) => JS(
+      '_USBIsochronousOutTransferPacket',
+      'new USBIsochronousOutTransferPacket(#,#)',
+      status,
+      bytesWritten);
+  static _USBIsochronousOutTransferPacket _create_2(status) => JS(
+      '_USBIsochronousOutTransferPacket',
+      'new USBIsochronousOutTransferPacket(#)',
+      status);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -41354,6 +46365,17 @@
   factory _USBIsochronousOutTransferResult._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('USBIsochronousOutTransferResult.USBIsochronousOutTransferResult')
+  @DocsEditable()
+  factory _USBIsochronousOutTransferResult(
+      List<_USBIsochronousOutTransferPacket> packets) {
+    return _USBIsochronousOutTransferResult._create_1(packets);
+  }
+  static _USBIsochronousOutTransferResult _create_1(packets) => JS(
+      '_USBIsochronousOutTransferResult',
+      'new USBIsochronousOutTransferResult(#)',
+      packets);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -41368,37 +46390,22 @@
   factory _USBOutTransferResult._() {
     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)
-@Experimental()
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-@Native("WebKitCSSMatrix")
-abstract class _WebKitCSSMatrix extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitCSSMatrix._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
+  @DomName('USBOutTransferResult.USBOutTransferResult')
   @DocsEditable()
-  factory _WebKitCSSMatrix([String cssValue]) {
-    if (cssValue != null) {
-      return _WebKitCSSMatrix._create_1(cssValue);
+  factory _USBOutTransferResult(String status, [int bytesWritten]) {
+    if (bytesWritten != null) {
+      return _USBOutTransferResult._create_1(status, bytesWritten);
     }
-    return _WebKitCSSMatrix._create_2();
+    return _USBOutTransferResult._create_2(status);
   }
-  static _WebKitCSSMatrix _create_1(cssValue) =>
-      JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix(#)', cssValue);
-  static _WebKitCSSMatrix _create_2() =>
-      JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix()');
+  static _USBOutTransferResult _create_1(status, bytesWritten) => JS(
+      '_USBOutTransferResult',
+      'new USBOutTransferResult(#,#)',
+      status,
+      bytesWritten);
+  static _USBOutTransferResult _create_2(status) =>
+      JS('_USBOutTransferResult', 'new USBOutTransferResult(#)', status);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -41453,15 +46460,13 @@
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
 @Native("WorkerNavigator")
-abstract class _WorkerNavigator extends Interceptor
-    implements NavigatorCpu, NavigatorOnLine, NavigatorID {
+abstract class _WorkerNavigator extends NavigatorConcurrentHardware
+    implements NavigatorOnLine, NavigatorID {
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() {
     throw new UnsupportedError("Not supported");
   }
 
-  // From NavigatorCPU
-
   // From NavigatorID
 
   // From NavigatorOnLine
@@ -41486,20 +46491,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.
 
-@DocsEditable()
-@DomName('WorkletGlobalScope')
-@Experimental() // untriaged
-@Native("WorkletGlobalScope")
-abstract class _WorkletGlobalScope extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _WorkletGlobalScope._() {
-    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.
-
 abstract class _AttributeMap extends MapBase<String, String> {
   final Element _element;
 
@@ -45672,6 +50663,108 @@
 
   T get current => _current;
 }
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for 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 Console {
+  const Console._safe();
+  static const Console _safeConsole = const Console._safe();
+
+  bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
+
+  @DomName('Console.memory')
+  MemoryInfo get memory =>
+      _isConsoleDefined ? JS('MemoryInfo', 'window.console.memory') : null;
+
+  @DomName('Console.assertCondition')
+  void assertCondition(bool condition, Object arg) => _isConsoleDefined
+      ? JS('void', 'window.console.assertCondition(#, #)', condition, arg)
+      : null;
+
+  @DomName('Console.clear')
+  void clear(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.clear(#)', arg) : null;
+
+  @DomName('Console.count')
+  void count(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.count(#)', arg) : null;
+
+  @DomName('Console.debug')
+  void debug(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.debug(#)', arg) : null;
+
+  @DomName('Console.dir')
+  void dir(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.dir(#)', arg) : null;
+
+  @DomName('Console.dirxml')
+  void dirxml(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.dirxml(#)', arg) : null;
+
+  @DomName('Console.error')
+  void error(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.error(#)', arg) : null;
+
+  @DomName('Console.group')
+  void group(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.group(#)', arg) : null;
+
+  @DomName('Console.groupCollapsed')
+  void groupCollapsed(Object arg) => _isConsoleDefined
+      ? JS('void', 'window.console.groupCollapsed(#)', arg)
+      : null;
+
+  @DomName('Console.groupEnd')
+  void groupEnd() =>
+      _isConsoleDefined ? JS('void', 'window.console.groupEnd()') : null;
+
+  @DomName('Console.info')
+  void info(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.info(#)', arg) : null;
+
+  @DomName('Console.log')
+  void log(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.log(#)', arg) : null;
+
+  @DomName('Console.markTimeline')
+  void markTimeline(Object arg) => _isConsoleDefined
+      ? JS('void', 'window.console.markTimeline(#)', arg)
+      : null;
+
+  @DomName('Console.profile')
+  void profile(String title) =>
+      _isConsoleDefined ? JS('void', 'window.console.profile(#)', title) : null;
+
+  @DomName('Console.profileEnd')
+  void profileEnd(String title) => _isConsoleDefined
+      ? JS('void', 'window.console.profileEnd(#)', title)
+      : null;
+
+  @DomName('Console.table')
+  void table(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.table(#)', arg) : null;
+
+  @DomName('Console.time')
+  void time(String title) =>
+      _isConsoleDefined ? JS('void', 'window.console.time(#)', title) : null;
+
+  @DomName('Console.timeEnd')
+  void timeEnd(String title) =>
+      _isConsoleDefined ? JS('void', 'window.console.timeEnd(#)', title) : null;
+
+  @DomName('Console.timeStamp')
+  void timeStamp(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.timeStamp(#)', arg) : null;
+
+  @DomName('Console.trace')
+  void trace(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.trace(#)', arg) : null;
+
+  @DomName('Console.warn')
+  void warn(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.warn(#)', arg) : null;
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -45785,8 +50878,7 @@
   }
 }
 
-void _registerCustomElement(
-    context, document, String tag, Type type, String extendsTagName) {
+Function _registerCustomElement(context, document, String tag, [Map options]) {
   // Function follows the same pattern as the following JavaScript code for
   // registering a custom element.
   //
@@ -45801,6 +50893,13 @@
   //    ...
   //    var e = document.createElement('x-foo');
 
+  var extendsTagName = '';
+  Type type;
+  if (options != null) {
+    extendsTagName = options['extends'];
+    type = options['prototype'];
+  }
+
   var interceptorClass = findInterceptorConstructorForType(type);
   if (interceptorClass == null) {
     throw new ArgumentError(type);
@@ -45854,13 +50953,13 @@
 
   setNativeSubclassDispatchRecord(proto, interceptor);
 
-  var options = JS('=Object', '{prototype: #}', proto);
+  var opts = JS('=Object', '{prototype: #}', proto);
 
   if (extendsTagName != null) {
-    JS('=Object', '#.extends = #', options, extendsTagName);
+    JS('=Object', '#.extends = #', opts, extendsTagName);
   }
 
-  JS('void', '#.registerElement(#, #)', document, tag, options);
+  return JS('=Object', '#.registerElement(#, #)', document, tag, opts);
 }
 
 //// Called by Element.created to do validation & initialization.
@@ -46245,6 +51344,7 @@
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
   int get detail => _parent.detail;
+  bool get isComposing => _parent.isComposing;
   String get key => _parent.key;
   /**
    * Accessor to the part of the keyboard that the key was pressed from (one of
@@ -46292,6 +51392,7 @@
 
   @Experimental() // untriaged
   bool get repeat => throw new UnimplementedError();
+  bool get isComposed => throw new UnimplementedError();
   dynamic get _get_view => throw new UnimplementedError();
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -46332,11 +51433,9 @@
 
   bool get cancelable => wrapped.cancelable;
 
-  EventTarget get currentTarget => wrapped.currentTarget;
+  bool get composed => wrapped.composed;
 
-  List<EventTarget> deepPath() {
-    return wrapped.deepPath();
-  }
+  EventTarget get currentTarget => wrapped.currentTarget;
 
   bool get defaultPrevented => wrapped.defaultPrevented;
 
@@ -46344,15 +51443,13 @@
 
   bool get isTrusted => wrapped.isTrusted;
 
-  bool get scoped => wrapped.scoped;
-
   EventTarget get target => wrapped.target;
 
   double get timeStamp => wrapped.timeStamp;
 
   String get type => wrapped.type;
 
-  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) {
+  void _initEvent(String type, [bool bubbles, bool cancelable]) {
     throw new UnsupportedError('Cannot initialize this Event.');
   }
 
@@ -46368,6 +51465,8 @@
     wrapped.stopPropagation();
   }
 
+  List<EventTarget> composedPath() => wrapped.composedPath();
+
   /**
    * A pointer to the element whose CSS selector matched within which an event
    * was fired. If this Event was not associated with any Event delegation,
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 715037b..7edd685 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -512,6 +512,15 @@
 // for details. All rights reserved. Use of 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('IDBObserverCallback')
+@Experimental() // untriaged
+typedef void ObserverCallback(ObserverChanges changes);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('IDBFactory')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
@@ -579,21 +588,9 @@
     }
   }
 
-  @DomName('IDBFactory.getDatabaseNames')
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental()
-  Future<List<String>> getDatabaseNames() {
-    try {
-      var request = _webkitGetDatabaseNames();
-
-      return _completeRequest(request);
-    } catch (e, stacktrace) {
-      return new Future.error(e, stacktrace);
-    }
-  }
-
   /**
    * Checks to see if getDatabaseNames is supported by the current platform.
+   * TODO(terry): Should be able to always return false?
    */
   bool get supportsDatabaseNames {
     return supported &&
@@ -622,17 +619,6 @@
   @Creates('Request')
   @Creates('Database')
   OpenDBRequest _open(String name, [int version]) native;
-
-  @JSName('webkitGetDatabaseNames')
-  @DomName('IDBFactory.webkitGetDatabaseNames')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Returns('Request')
-  @Creates('Request')
-  @Creates('DomStringList')
-  Request _webkitGetDatabaseNames() native;
 }
 
 /**
@@ -762,7 +748,7 @@
 
   @DomName('IDBIndex.name')
   @DocsEditable()
-  final String name;
+  String name;
 
   @DomName('IDBIndex.objectStore')
   @DocsEditable()
@@ -788,12 +774,12 @@
   @DomName('IDBIndex.getAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Request getAll(Object range, [int maxCount]) native;
+  Request getAll(Object query, [int count]) native;
 
   @DomName('IDBIndex.getAllKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Request getAllKeys(Object range, [int maxCount]) native;
+  Request getAllKeys(Object query, [int count]) native;
 
   @JSName('getKey')
   @DomName('IDBIndex.getKey')
@@ -875,6 +861,11 @@
   static KeyRange bound_(Object lower, Object upper,
       [bool lowerOpen, bool upperOpen]) native;
 
+  @DomName('IDBKeyRange.includes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool includes(Object key) native;
+
   @JSName('lowerBound')
   @DomName('IDBKeyRange.lowerBound')
   @DocsEditable()
@@ -1046,7 +1037,7 @@
 
   @DomName('IDBObjectStore.name')
   @DocsEditable()
-  final String name;
+  String name;
 
   @DomName('IDBObjectStore.transaction')
   @DocsEditable()
@@ -1131,12 +1122,17 @@
   @DomName('IDBObjectStore.getAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Request getAll(Object range, [int maxCount]) native;
+  Request getAll(Object query, [int count]) native;
 
   @DomName('IDBObjectStore.getAllKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Request getAllKeys(Object range, [int maxCount]) native;
+  Request getAllKeys(Object query, [int count]) native;
+
+  @DomName('IDBObjectStore.getKey')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Request getKey(Object key) native;
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
@@ -1217,6 +1213,106 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('IDBObservation')
+@Experimental() // untriaged
+@Native("IDBObservation")
+class Observation extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Observation._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('IDBObservation.key')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Object key;
+
+  @DomName('IDBObservation.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+
+  @DomName('IDBObservation.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Object value;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('IDBObserver')
+@Experimental() // untriaged
+@Native("IDBObserver")
+class Observer extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Observer._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('IDBObserver.IDBObserver')
+  @DocsEditable()
+  factory Observer(ObserverCallback callback) {
+    return Observer._create_1(callback);
+  }
+  static Observer _create_1(callback) =>
+      JS('Observer', 'new IDBObserver(#)', callback);
+
+  @DomName('IDBObserver.observe')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void observe(Database db, Transaction tx, Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    _observe_1(db, tx, options_1);
+    return;
+  }
+
+  @JSName('observe')
+  @DomName('IDBObserver.observe')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _observe_1(Database db, Transaction tx, options) native;
+
+  @DomName('IDBObserver.unobserve')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void unobserve(Database db) 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('IDBObserverChanges')
+@Experimental() // untriaged
+@Native("IDBObserverChanges")
+class ObserverChanges extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ObserverChanges._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('IDBObserverChanges.database')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Database database;
+
+  @DomName('IDBObserverChanges.records')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Object records;
+
+  @DomName('IDBObserverChanges.transaction')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Transaction transaction;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('IDBOpenDBRequest')
 @Unstable()
 @Native("IDBOpenDBRequest,IDBVersionChangeRequest")
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index e1a9825..b881bbe 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -609,10 +609,10 @@
  */
 abstract class RandomAccessFile {
   /**
-   * Closes the file. Returns a `Future<RandomAccessFile>` that
-   * completes with this RandomAccessFile when it has been closed.
+   * Closes the file. Returns a `Future` that
+   * completes when it has been closed.
    */
-  Future<RandomAccessFile> close();
+  Future<void> close();
 
   /**
    * Synchronously closes the file.
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index c0a0543..a64fdc2 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -685,15 +685,13 @@
     }
   }
 
-  Future<RandomAccessFile> close() {
+  Future<void> close() {
     return _dispatch(_FILE_CLOSE, [null], markClosed: true).then((result) {
-      if (result != -1) {
-        closed = closed || (result == 0);
-        _maybePerformCleanup();
-        return this;
-      } else {
+      if (result == -1) {
         throw new FileSystemException("Cannot close file", path);
       }
+      closed = closed || (result == 0);
+      _maybePerformCleanup();
     });
   }
 
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index e782763..fb3da8b 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -370,7 +370,7 @@
 
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  final double animVal;
+  final num animVal;
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
@@ -549,10 +549,6 @@
   @DocsEditable()
   final StringList requiredExtensions;
 
-  @DomName('SVGAnimationElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
   @DomName('SVGAnimationElement.systemLanguage')
   @DocsEditable()
   final StringList systemLanguage;
@@ -2543,6 +2539,21 @@
    */
   GeometryElement.created() : super.created();
 
+  @DomName('SVGGeometryElement.pathLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AnimatedNumber pathLength;
+
+  @DomName('SVGGeometryElement.getPointAtLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Point getPointAtLength(num distance) native;
+
+  @DomName('SVGGeometryElement.getTotalLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double getTotalLength() native;
+
   @DomName('SVGGeometryElement.isPointInFill')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2612,11 +2623,6 @@
   @Experimental() // untriaged
   final StringList requiredExtensions;
 
-  @DomName('SVGGraphicsElement.requiredFeatures')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final StringList requiredFeatures;
-
   @DomName('SVGGraphicsElement.systemLanguage')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2647,6 +2653,11 @@
    */
   ImageElement.created() : super.created();
 
+  @DomName('SVGImageElement.async')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String async;
+
   @DomName('SVGImageElement.height')
   @DocsEditable()
   final AnimatedLength height;
@@ -2667,6 +2678,11 @@
   @DocsEditable()
   final AnimatedLength y;
 
+  @DomName('SVGImageElement.decode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future decode() native;
+
   // From SVGURIReference
 
   @DomName('SVGImageElement.href')
@@ -3088,10 +3104,6 @@
   @DocsEditable()
   final StringList requiredExtensions;
 
-  @DomName('SVGMaskElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
   @DomName('SVGMaskElement.systemLanguage')
   @DocsEditable()
   final StringList systemLanguage;
@@ -3341,22 +3353,6 @@
    * This can only be called by subclasses from their created constructor.
    */
   PathElement.created() : super.created();
-
-  @DomName('SVGPathElement.pathLength')
-  @DocsEditable()
-  final AnimatedNumber pathLength;
-
-  @DomName('SVGPathElement.getPathSegAtLength')
-  @DocsEditable()
-  int getPathSegAtLength(num distance) native;
-
-  @DomName('SVGPathElement.getPointAtLength')
-  @DocsEditable()
-  Point getPointAtLength(num distance) native;
-
-  @DomName('SVGPathElement.getTotalLength')
-  @DocsEditable()
-  double getTotalLength() 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
@@ -3428,10 +3424,6 @@
   @DocsEditable()
   final StringList requiredExtensions;
 
-  @DomName('SVGPatternElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
   @DomName('SVGPatternElement.systemLanguage')
   @DocsEditable()
   final StringList systemLanguage;
@@ -4077,7 +4069,7 @@
 @DomName('SVGElement')
 @Unstable()
 @Native("SVGElement")
-class SvgElement extends Element implements GlobalEventHandlers {
+class SvgElement extends Element implements GlobalEventHandlers, NoncedElement {
   static final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 
   factory SvgElement.tag(String tag) =>
@@ -4528,6 +4520,12 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> waitingEvent =
       const EventStreamProvider<Event>('waiting');
+
+  @DomName('SVGElement.wheelEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<WheelEvent> wheelEvent =
+      const EventStreamProvider<WheelEvent>('wheel');
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4563,6 +4561,13 @@
   @Experimental() // untriaged
   void focus() native;
 
+  // From NoncedElement
+
+  @DomName('SVGElement.nonce')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String nonce;
+
   @DomName('SVGElement.onabort')
   @DocsEditable()
   @Experimental() // untriaged
@@ -4851,6 +4856,11 @@
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
+
+  @DomName('SVGElement.onwheel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<WheelEvent> get onWheel => wheelEvent.forElement(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -4887,22 +4897,10 @@
   @DocsEditable()
   final Point currentTranslate;
 
-  @DomName('SVGSVGElement.currentView')
-  @DocsEditable()
-  final ViewSpec currentView;
-
   @DomName('SVGSVGElement.height')
   @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGSVGElement.useCurrentView')
-  @DocsEditable()
-  final bool useCurrentView;
-
-  @DomName('SVGSVGElement.viewport')
-  @DocsEditable()
-  final Rect viewport;
-
   @DomName('SVGSVGElement.width')
   @DocsEditable()
   final AnimatedLength width;
@@ -5135,8 +5133,6 @@
 
   final StringList requiredExtensions;
 
-  final StringList requiredFeatures;
-
   final StringList systemLanguage;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5411,7 +5407,7 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  final double angle;
+  final num angle;
 
   @DomName('SVGTransform.matrix')
   @DocsEditable()
@@ -5668,10 +5664,6 @@
    */
   ViewElement.created() : super.created();
 
-  @DomName('SVGViewElement.viewTarget')
-  @DocsEditable()
-  final StringList viewTarget;
-
   // From SVGFitToViewBox
 
   @DomName('SVGViewElement.preserveAspectRatio')
@@ -5693,63 +5685,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('SVGViewSpec')
-@Unstable()
-@Native("SVGViewSpec")
-class ViewSpec extends Interceptor implements FitToViewBox, ZoomAndPan {
-  // To suppress missing implicit constructor warnings.
-  factory ViewSpec._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('SVGViewSpec.preserveAspectRatioString')
-  @DocsEditable()
-  final String preserveAspectRatioString;
-
-  @DomName('SVGViewSpec.transform')
-  @DocsEditable()
-  final TransformList transform;
-
-  @DomName('SVGViewSpec.transformString')
-  @DocsEditable()
-  final String transformString;
-
-  @DomName('SVGViewSpec.viewBoxString')
-  @DocsEditable()
-  final String viewBoxString;
-
-  @DomName('SVGViewSpec.viewTarget')
-  @DocsEditable()
-  final SvgElement viewTarget;
-
-  @DomName('SVGViewSpec.viewTargetString')
-  @DocsEditable()
-  final String viewTargetString;
-
-  // From SVGFitToViewBox
-
-  @DomName('SVGViewSpec.preserveAspectRatio')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  final AnimatedPreserveAspectRatio preserveAspectRatio;
-
-  @DomName('SVGViewSpec.viewBox')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  final AnimatedRect viewBox;
-
-  // From SVGZoomAndPan
-
-  @DomName('SVGViewSpec.zoomAndPan')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  int zoomAndPan;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGZoomAndPan')
 @Unstable()
 abstract class ZoomAndPan extends Interceptor {
@@ -5777,40 +5712,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('SVGZoomEvent')
-@Unstable()
-@Native("SVGZoomEvent")
-class ZoomEvent extends UIEvent {
-  // To suppress missing implicit constructor warnings.
-  factory ZoomEvent._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('SVGZoomEvent.newScale')
-  @DocsEditable()
-  final double newScale;
-
-  @DomName('SVGZoomEvent.newTranslate')
-  @DocsEditable()
-  final Point newTranslate;
-
-  @DomName('SVGZoomEvent.previousScale')
-  @DocsEditable()
-  final double previousScale;
-
-  @DomName('SVGZoomEvent.previousTranslate')
-  @DocsEditable()
-  final Point previousTranslate;
-
-  @DomName('SVGZoomEvent.zoomRectScreen')
-  @DocsEditable()
-  final Rect zoomRectScreen;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('SVGGradientElement')
 @Unstable()
 @Native("SVGGradientElement")
@@ -5885,43 +5786,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
-@DomName('SVGCursorElement')
-@Unstable()
-@Native("SVGCursorElement")
-abstract class _SVGCursorElement extends SvgElement
-    implements UriReference, Tests {
-  // To suppress missing implicit constructor warnings.
-  factory _SVGCursorElement._() {
-    throw new UnsupportedError("Not supported");
-  }
-
-  @DomName('SVGCursorElement.SVGCursorElement')
-  @DocsEditable()
-  factory _SVGCursorElement() =>
-      _SvgElementFactoryProvider.createSvgElement_tag("cursor");
-  /**
-   * Constructor instantiated by the DOM when a custom element has been created.
-   *
-   * This can only be called by subclasses from their created constructor.
-   */
-  _SVGCursorElement.created() : super.created();
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported =>
-      SvgElement.isTagSupported('cursor') &&
-      (new SvgElement.tag('cursor') is _SVGCursorElement);
-
-  // From SVGTests
-
-  // 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('SVGFEDropShadowElement')
 @Experimental() // nonstandard
 @Native("SVGFEDropShadowElement")
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index c59ee24..deb724c 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -10,14 +10,21 @@
 import 'dart:html_common';
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
-import 'dart:_js_helper'
-    show Creates, JSName, Native, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
 
+import 'dart:_js_helper'
+    show
+        Creates,
+        JavaScriptIndexingBehavior,
+        JSName,
+        Native,
+        Returns,
+        convertDartClosureToJS;
+
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -33,6 +40,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('AnalyserNode.AnalyserNode')
+  @DocsEditable()
+  factory AnalyserNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return AnalyserNode._create_1(context, options_1);
+    }
+    return AnalyserNode._create_2(context);
+  }
+  static AnalyserNode _create_1(context, options) =>
+      JS('AnalyserNode', 'new AnalyserNode(#,#)', context, options);
+  static AnalyserNode _create_2(context) =>
+      JS('AnalyserNode', 'new AnalyserNode(#)', context);
+
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
   int fftSize;
@@ -85,9 +106,18 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('AudioBuffer.AudioBuffer')
+  @DocsEditable()
+  factory AudioBuffer(Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    return AudioBuffer._create_1(options_1);
+  }
+  static AudioBuffer _create_1(options) =>
+      JS('AudioBuffer', 'new AudioBuffer(#)', options);
+
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  final double duration;
+  final num duration;
 
   @DomName('AudioBuffer.length')
   @DocsEditable()
@@ -99,7 +129,7 @@
 
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  final double sampleRate;
+  final num sampleRate;
 
   @DomName('AudioBuffer.copyFromChannel')
   @DocsEditable()
@@ -121,69 +151,35 @@
 // for details. All rights reserved. Use of 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('AudioBufferCallback')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section
-@Experimental()
-typedef void AudioBufferCallback(audioBuffer_OR_exception);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('AudioBufferSourceNode')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @Experimental()
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
 @Native("AudioBufferSourceNode")
-class AudioBufferSourceNode extends AudioSourceNode {
-  // TODO(efortuna): Remove these methods when Chrome stable also uses start
-  // instead of noteOn.
-  void start(num when, [num grainOffset, num grainDuration]) {
-    if (JS('bool', '!!#.start', this)) {
-      if (grainDuration != null) {
-        JS('void', '#.start(#, #, #)', this, when, grainOffset, grainDuration);
-      } else if (grainOffset != null) {
-        JS('void', '#.start(#, #)', this, when, grainOffset);
-      } else {
-        JS('void', '#.start(#)', this, when);
-      }
-    } else {
-      if (grainDuration != null) {
-        JS('void', '#.noteOn(#, #, #)', this, when, grainOffset, grainDuration);
-      } else if (grainOffset != null) {
-        JS('void', '#.noteOn(#, #)', this, when, grainOffset);
-      } else {
-        JS('void', '#.noteOn(#)', this, when);
-      }
-    }
-  }
-
-  void stop(num when) {
-    if (JS('bool', '!!#.stop', this)) {
-      JS('void', '#.stop(#)', this, when);
-    } else {
-      JS('void', '#.noteOff(#)', this, when);
-    }
-  }
-
+class AudioBufferSourceNode extends AudioScheduledSourceNode {
   // To suppress missing implicit constructor warnings.
   factory AudioBufferSourceNode._() {
     throw new UnsupportedError("Not supported");
   }
 
-  /**
-   * Static factory designed to expose `ended` events to event
-   * handlers that are not necessarily instances of [AudioBufferSourceNode].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('AudioBufferSourceNode.endedEvent')
+  @DomName('AudioBufferSourceNode.AudioBufferSourceNode')
   @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<Event> endedEvent =
-      const EventStreamProvider<Event>('ended');
+  factory AudioBufferSourceNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return AudioBufferSourceNode._create_1(context, options_1);
+    }
+    return AudioBufferSourceNode._create_2(context);
+  }
+  static AudioBufferSourceNode _create_1(context, options) => JS(
+      'AudioBufferSourceNode',
+      'new AudioBufferSourceNode(#,#)',
+      context,
+      options);
+  static AudioBufferSourceNode _create_2(context) =>
+      JS('AudioBufferSourceNode', 'new AudioBufferSourceNode(#)', context);
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
@@ -210,11 +206,10 @@
   @DocsEditable()
   final AudioParam playbackRate;
 
-  /// Stream of `ended` events handled by this [AudioBufferSourceNode].
-  @DomName('AudioBufferSourceNode.onended')
+  @JSName('start')
+  @DomName('AudioBufferSourceNode.start')
   @DocsEditable()
-  @Experimental() // untriaged
-  Stream<Event> get onEnded => endedEvent.forTarget(this);
+  void start2([num when, num grainOffset, num grainDuration]) 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
@@ -226,7 +221,7 @@
 @Experimental()
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioContext-section
 @Native("AudioContext,webkitAudioContext")
-class AudioContext extends EventTarget {
+class AudioContext extends BaseAudioContext {
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() {
     throw new UnsupportedError("Not supported");
@@ -236,135 +231,28 @@
   static bool get supported =>
       JS('bool', '!!(window.AudioContext || window.webkitAudioContext)');
 
-  @DomName('AudioContext.currentTime')
-  @DocsEditable()
-  final double currentTime;
-
-  @DomName('AudioContext.destination')
-  @DocsEditable()
-  final AudioDestinationNode destination;
-
-  @DomName('AudioContext.listener')
-  @DocsEditable()
-  final AudioListener listener;
-
-  @DomName('AudioContext.sampleRate')
-  @DocsEditable()
-  final double sampleRate;
-
-  @DomName('AudioContext.state')
+  @DomName('AudioContext.baseLatency')
   @DocsEditable()
   @Experimental() // untriaged
-  final String state;
+  final num baseLatency;
 
   @DomName('AudioContext.close')
   @DocsEditable()
   @Experimental() // untriaged
   Future close() native;
 
-  @DomName('AudioContext.createAnalyser')
-  @DocsEditable()
-  AnalyserNode createAnalyser() native;
-
-  @DomName('AudioContext.createBiquadFilter')
-  @DocsEditable()
-  BiquadFilterNode createBiquadFilter() native;
-
-  @DomName('AudioContext.createBuffer')
-  @DocsEditable()
-  AudioBuffer createBuffer(
-      int numberOfChannels, int numberOfFrames, num sampleRate) native;
-
-  @DomName('AudioContext.createBufferSource')
-  @DocsEditable()
-  AudioBufferSourceNode createBufferSource() native;
-
-  @DomName('AudioContext.createChannelMerger')
-  @DocsEditable()
-  ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
-
-  @DomName('AudioContext.createChannelSplitter')
-  @DocsEditable()
-  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
-
-  @DomName('AudioContext.createConvolver')
-  @DocsEditable()
-  ConvolverNode createConvolver() native;
-
-  @DomName('AudioContext.createDelay')
-  @DocsEditable()
-  DelayNode createDelay([num maxDelayTime]) native;
-
-  @DomName('AudioContext.createDynamicsCompressor')
-  @DocsEditable()
-  DynamicsCompressorNode createDynamicsCompressor() native;
-
-  @JSName('createIIRFilter')
-  @DomName('AudioContext.createIIRFilter')
+  @DomName('AudioContext.getOutputTimestamp')
   @DocsEditable()
   @Experimental() // untriaged
-  IirFilterNode createIirFilter(List<num> feedForward, List<num> feedBack)
-      native;
-
-  @DomName('AudioContext.createMediaElementSource')
-  @DocsEditable()
-  MediaElementAudioSourceNode createMediaElementSource(
-      MediaElement mediaElement) native;
-
-  @DomName('AudioContext.createMediaStreamDestination')
-  @DocsEditable()
-  MediaStreamAudioDestinationNode createMediaStreamDestination() native;
-
-  @DomName('AudioContext.createMediaStreamSource')
-  @DocsEditable()
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream)
-      native;
-
-  @DomName('AudioContext.createOscillator')
-  @DocsEditable()
-  OscillatorNode createOscillator() native;
-
-  @DomName('AudioContext.createPanner')
-  @DocsEditable()
-  PannerNode createPanner() native;
-
-  @DomName('AudioContext.createPeriodicWave')
-  @DocsEditable()
-  @Experimental() // untriaged
-  PeriodicWave createPeriodicWave(Float32List real, Float32List imag,
-      [Map options]) {
-    if (options != null) {
-      var options_1 = convertDartToNative_Dictionary(options);
-      return _createPeriodicWave_1(real, imag, options_1);
-    }
-    return _createPeriodicWave_2(real, imag);
+  Map getOutputTimestamp() {
+    return convertNativeToDart_Dictionary(_getOutputTimestamp_1());
   }
 
-  @JSName('createPeriodicWave')
-  @DomName('AudioContext.createPeriodicWave')
+  @JSName('getOutputTimestamp')
+  @DomName('AudioContext.getOutputTimestamp')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicWave _createPeriodicWave_1(
-      Float32List real, Float32List imag, options) native;
-  @JSName('createPeriodicWave')
-  @DomName('AudioContext.createPeriodicWave')
-  @DocsEditable()
-  @Experimental() // untriaged
-  PeriodicWave _createPeriodicWave_2(Float32List real, Float32List imag) native;
-
-  @DomName('AudioContext.createStereoPanner')
-  @DocsEditable()
-  @Experimental() // untriaged
-  StereoPannerNode createStereoPanner() native;
-
-  @DomName('AudioContext.createWaveShaper')
-  @DocsEditable()
-  WaveShaperNode createWaveShaper() native;
-
-  @DomName('AudioContext.resume')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Future resume() native;
+  _getOutputTimestamp_1() native;
 
   @DomName('AudioContext.suspend')
   @DocsEditable()
@@ -382,8 +270,8 @@
     }
   }
 
-  ScriptProcessorNode createScriptProcessor(int bufferSize,
-      [int numberOfInputChannels, int numberOfOutputChannels]) {
+  ScriptProcessorNode createScriptProcessor(
+      [int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) {
     var function = JS(
         '=Object',
         '#.createScriptProcessor || '
@@ -396,9 +284,11 @@
     } else if (numberOfInputChannels != null) {
       return JS('ScriptProcessorNode', '#.call(#, #, #)', function, this,
           bufferSize, numberOfInputChannels);
-    } else {
+    } else if (bufferSize != null) {
       return JS(
           'ScriptProcessorNode', '#.call(#, #)', function, this, bufferSize);
+    } else {
+      return JS('ScriptProcessorNode', '#.call(#)', function, this);
     }
   }
 
@@ -406,11 +296,17 @@
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
   Future _decodeAudioData(ByteBuffer audioData,
-      [AudioBufferCallback successCallback,
-      AudioBufferCallback errorCallback]) native;
+      [DecodeSuccessCallback successCallback,
+      DecodeErrorCallback errorCallback]) native;
 
   @DomName('AudioContext.decodeAudioData')
-  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
+  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData,
+      [DecodeSuccessCallback successCallback,
+      DecodeErrorCallback errorCallback]) {
+    if (successCallback != null && errorCallback != null) {
+      return _decodeAudioData(audioData, successCallback, errorCallback);
+    }
+
     var completer = new Completer<AudioBuffer>();
     _decodeAudioData(audioData, (value) {
       completer.complete(value);
@@ -458,13 +354,50 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioListener.dopplerFactor')
+  @DomName('AudioListener.forwardX')
   @DocsEditable()
-  num dopplerFactor;
+  @Experimental() // untriaged
+  final AudioParam forwardX;
 
-  @DomName('AudioListener.speedOfSound')
+  @DomName('AudioListener.forwardY')
   @DocsEditable()
-  num speedOfSound;
+  @Experimental() // untriaged
+  final AudioParam forwardY;
+
+  @DomName('AudioListener.forwardZ')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam forwardZ;
+
+  @DomName('AudioListener.positionX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam positionX;
+
+  @DomName('AudioListener.positionY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam positionY;
+
+  @DomName('AudioListener.positionZ')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam positionZ;
+
+  @DomName('AudioListener.upX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam upX;
+
+  @DomName('AudioListener.upY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam upY;
+
+  @DomName('AudioListener.upZ')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam upZ;
 
   @DomName('AudioListener.setOrientation')
   @DocsEditable()
@@ -473,10 +406,6 @@
   @DomName('AudioListener.setPosition')
   @DocsEditable()
   void setPosition(num x, num y, num z) native;
-
-  @DomName('AudioListener.setVelocity')
-  @DocsEditable()
-  void setVelocity(num x, num y, num z) 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
@@ -506,7 +435,7 @@
 
   @DomName('AudioNode.context')
   @DocsEditable()
-  final AudioContext context;
+  final BaseAudioContext context;
 
   @DomName('AudioNode.numberOfInputs')
   @DocsEditable()
@@ -552,12 +481,25 @@
 
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  final double defaultValue;
+  final num defaultValue;
+
+  @DomName('AudioParam.maxValue')
+  @DocsEditable()
+  final num maxValue;
+
+  @DomName('AudioParam.minValue')
+  @DocsEditable()
+  final num minValue;
 
   @DomName('AudioParam.value')
   @DocsEditable()
   num value;
 
+  @DomName('AudioParam.cancelAndHoldAtTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioParam cancelAndHoldAtTime(num startTime) native;
+
   @DomName('AudioParam.cancelScheduledValues')
   @DocsEditable()
   AudioParam cancelScheduledValues(num startTime) native;
@@ -580,7 +522,7 @@
 
   @DomName('AudioParam.setValueCurveAtTime')
   @DocsEditable()
-  AudioParam setValueCurveAtTime(Float32List values, num time, num duration)
+  AudioParam setValueCurveAtTime(List<num> values, num time, num duration)
       native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -588,6 +530,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('AudioParamMap')
+@Experimental() // untriaged
+@Native("AudioParamMap")
+class AudioParamMap extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AudioParamMap._() {
+    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('AudioProcessingEvent')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent-section
 @Experimental()
@@ -598,6 +554,18 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('AudioProcessingEvent.AudioProcessingEvent')
+  @DocsEditable()
+  factory AudioProcessingEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return AudioProcessingEvent._create_1(type, eventInitDict_1);
+  }
+  static AudioProcessingEvent _create_1(type, eventInitDict) => JS(
+      'AudioProcessingEvent',
+      'new AudioProcessingEvent(#,#)',
+      type,
+      eventInitDict);
+
   @DomName('AudioProcessingEvent.inputBuffer')
   @DocsEditable()
   final AudioBuffer inputBuffer;
@@ -609,22 +577,390 @@
   @DomName('AudioProcessingEvent.playbackTime')
   @DocsEditable()
   @Experimental() // untriaged
-  final double playbackTime;
+  final num playbackTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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('AudioSourceNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html
-@Experimental()
-@Native("AudioSourceNode")
-class AudioSourceNode extends AudioNode {
+@DomName('AudioScheduledSourceNode')
+@Experimental() // untriaged
+@Native("AudioScheduledSourceNode")
+class AudioScheduledSourceNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory AudioSourceNode._() {
+  factory AudioScheduledSourceNode._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('AudioScheduledSourceNode.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent =
+      const EventStreamProvider<Event>('ended');
+
+  @DomName('AudioScheduledSourceNode.start')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void start([num when]) native;
+
+  @DomName('AudioScheduledSourceNode.stop')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stop([num when]) native;
+
+  @DomName('AudioScheduledSourceNode.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => endedEvent.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('AudioTrack')
+@Experimental() // untriaged
+@Native("AudioTrack")
+class AudioTrack extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AudioTrack._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AudioTrack.enabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool enabled;
+
+  @DomName('AudioTrack.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('AudioTrack.kind')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String kind;
+
+  @DomName('AudioTrack.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String label;
+
+  @DomName('AudioTrack.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String language;
+
+  @DomName('AudioTrack.sourceBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final SourceBuffer sourceBuffer;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('AudioTrackList')
+@Experimental() // untriaged
+@Native("AudioTrackList")
+class AudioTrackList extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory AudioTrackList._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AudioTrackList.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
+
+  @DomName('AudioTrackList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+
+  @DomName('AudioTrackList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioTrack __getter__(int index) native;
+
+  @DomName('AudioTrackList.getTrackById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioTrack getTrackById(String id) native;
+
+  @DomName('AudioTrackList.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('AudioWorkletGlobalScope')
+@Experimental() // untriaged
+@Native("AudioWorkletGlobalScope")
+class AudioWorkletGlobalScope extends WorkletGlobalScope {
+  // To suppress missing implicit constructor warnings.
+  factory AudioWorkletGlobalScope._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AudioWorkletGlobalScope.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num currentTime;
+
+  @DomName('AudioWorkletGlobalScope.sampleRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num sampleRate;
+
+  @DomName('AudioWorkletGlobalScope.registerProcessor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void registerProcessor(String name, Object processorConstructor) 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('AudioWorkletNode')
+@Experimental() // untriaged
+@Native("AudioWorkletNode")
+class AudioWorkletNode extends AudioNode {
+  // To suppress missing implicit constructor warnings.
+  factory AudioWorkletNode._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('AudioWorkletNode.AudioWorkletNode')
+  @DocsEditable()
+  factory AudioWorkletNode(BaseAudioContext context, String name,
+      [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return AudioWorkletNode._create_1(context, name, options_1);
+    }
+    return AudioWorkletNode._create_2(context, name);
+  }
+  static AudioWorkletNode _create_1(context, name, options) => JS(
+      'AudioWorkletNode',
+      'new AudioWorkletNode(#,#,#)',
+      context,
+      name,
+      options);
+  static AudioWorkletNode _create_2(context, name) =>
+      JS('AudioWorkletNode', 'new AudioWorkletNode(#,#)', context, name);
+
+  @DomName('AudioWorkletNode.parameters')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParamMap parameters;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('AudioWorkletProcessor')
+@Experimental() // untriaged
+@Native("AudioWorkletProcessor")
+class AudioWorkletProcessor extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AudioWorkletProcessor._() {
+    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('BaseAudioContext')
+@Experimental() // untriaged
+@Native("BaseAudioContext")
+class BaseAudioContext extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory BaseAudioContext._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('BaseAudioContext.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num currentTime;
+
+  @DomName('BaseAudioContext.destination')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioDestinationNode destination;
+
+  @DomName('BaseAudioContext.listener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioListener listener;
+
+  @DomName('BaseAudioContext.sampleRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num sampleRate;
+
+  @DomName('BaseAudioContext.state')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String state;
+
+  @DomName('BaseAudioContext.createAnalyser')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnalyserNode createAnalyser() native;
+
+  @DomName('BaseAudioContext.createBiquadFilter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  BiquadFilterNode createBiquadFilter() native;
+
+  @DomName('BaseAudioContext.createBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioBuffer createBuffer(
+      int numberOfChannels, int numberOfFrames, num sampleRate) native;
+
+  @DomName('BaseAudioContext.createBufferSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioBufferSourceNode createBufferSource() native;
+
+  @DomName('BaseAudioContext.createChannelMerger')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
+
+  @DomName('BaseAudioContext.createChannelSplitter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
+
+  @DomName('BaseAudioContext.createConstantSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ConstantSourceNode createConstantSource() native;
+
+  @DomName('BaseAudioContext.createConvolver')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ConvolverNode createConvolver() native;
+
+  @DomName('BaseAudioContext.createDelay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DelayNode createDelay([num maxDelayTime]) native;
+
+  @DomName('BaseAudioContext.createDynamicsCompressor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DynamicsCompressorNode createDynamicsCompressor() native;
+
+  @DomName('BaseAudioContext.createGain')
+  @DocsEditable()
+  @Experimental() // untriaged
+  GainNode createGain() native;
+
+  @JSName('createIIRFilter')
+  @DomName('BaseAudioContext.createIIRFilter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  IirFilterNode createIirFilter(List<num> feedForward, List<num> feedBack)
+      native;
+
+  @DomName('BaseAudioContext.createMediaElementSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaElementAudioSourceNode createMediaElementSource(
+      MediaElement mediaElement) native;
+
+  @DomName('BaseAudioContext.createMediaStreamDestination')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStreamAudioDestinationNode createMediaStreamDestination() native;
+
+  @DomName('BaseAudioContext.createMediaStreamSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream)
+      native;
+
+  @DomName('BaseAudioContext.createOscillator')
+  @DocsEditable()
+  @Experimental() // untriaged
+  OscillatorNode createOscillator() native;
+
+  @DomName('BaseAudioContext.createPanner')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PannerNode createPanner() native;
+
+  @DomName('BaseAudioContext.createPeriodicWave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PeriodicWave createPeriodicWave(List<num> real, List<num> imag,
+      [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _createPeriodicWave_1(real, imag, options_1);
+    }
+    return _createPeriodicWave_2(real, imag);
+  }
+
+  @JSName('createPeriodicWave')
+  @DomName('BaseAudioContext.createPeriodicWave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PeriodicWave _createPeriodicWave_1(List<num> real, List<num> imag, options)
+      native;
+  @JSName('createPeriodicWave')
+  @DomName('BaseAudioContext.createPeriodicWave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PeriodicWave _createPeriodicWave_2(List<num> real, List<num> imag) native;
+
+  @DomName('BaseAudioContext.createScriptProcessor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ScriptProcessorNode createScriptProcessor(
+      [int bufferSize,
+      int numberOfInputChannels,
+      int numberOfOutputChannels]) native;
+
+  @DomName('BaseAudioContext.createStereoPanner')
+  @DocsEditable()
+  @Experimental() // untriaged
+  StereoPannerNode createStereoPanner() native;
+
+  @DomName('BaseAudioContext.createWaveShaper')
+  @DocsEditable()
+  @Experimental() // untriaged
+  WaveShaperNode createWaveShaper() native;
+
+  @DomName('BaseAudioContext.decodeAudioData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future decodeAudioData(ByteBuffer audioData,
+      [DecodeSuccessCallback successCallback,
+      DecodeErrorCallback errorCallback]) native;
+
+  @DomName('BaseAudioContext.resume')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future resume() 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
@@ -641,6 +977,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('BiquadFilterNode.BiquadFilterNode')
+  @DocsEditable()
+  factory BiquadFilterNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return BiquadFilterNode._create_1(context, options_1);
+    }
+    return BiquadFilterNode._create_2(context);
+  }
+  static BiquadFilterNode _create_1(context, options) =>
+      JS('BiquadFilterNode', 'new BiquadFilterNode(#,#)', context, options);
+  static BiquadFilterNode _create_2(context) =>
+      JS('BiquadFilterNode', 'new BiquadFilterNode(#)', context);
+
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
   final AudioParam Q;
@@ -680,6 +1030,20 @@
   factory ChannelMergerNode._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('ChannelMergerNode.ChannelMergerNode')
+  @DocsEditable()
+  factory ChannelMergerNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return ChannelMergerNode._create_1(context, options_1);
+    }
+    return ChannelMergerNode._create_2(context);
+  }
+  static ChannelMergerNode _create_1(context, options) =>
+      JS('ChannelMergerNode', 'new ChannelMergerNode(#,#)', context, options);
+  static ChannelMergerNode _create_2(context) =>
+      JS('ChannelMergerNode', 'new ChannelMergerNode(#)', context);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -695,6 +1059,53 @@
   factory ChannelSplitterNode._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('ChannelSplitterNode.ChannelSplitterNode')
+  @DocsEditable()
+  factory ChannelSplitterNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return ChannelSplitterNode._create_1(context, options_1);
+    }
+    return ChannelSplitterNode._create_2(context);
+  }
+  static ChannelSplitterNode _create_1(context, options) => JS(
+      'ChannelSplitterNode', 'new ChannelSplitterNode(#,#)', context, options);
+  static ChannelSplitterNode _create_2(context) =>
+      JS('ChannelSplitterNode', 'new ChannelSplitterNode(#)', context);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@DocsEditable()
+@DomName('ConstantSourceNode')
+@Experimental() // untriaged
+@Native("ConstantSourceNode")
+class ConstantSourceNode extends AudioScheduledSourceNode {
+  // To suppress missing implicit constructor warnings.
+  factory ConstantSourceNode._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('ConstantSourceNode.ConstantSourceNode')
+  @DocsEditable()
+  factory ConstantSourceNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return ConstantSourceNode._create_1(context, options_1);
+    }
+    return ConstantSourceNode._create_2(context);
+  }
+  static ConstantSourceNode _create_1(context, options) =>
+      JS('ConstantSourceNode', 'new ConstantSourceNode(#,#)', context, options);
+  static ConstantSourceNode _create_2(context) =>
+      JS('ConstantSourceNode', 'new ConstantSourceNode(#)', context);
+
+  @DomName('ConstantSourceNode.offset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam offset;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -711,6 +1122,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('ConvolverNode.ConvolverNode')
+  @DocsEditable()
+  factory ConvolverNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return ConvolverNode._create_1(context, options_1);
+    }
+    return ConvolverNode._create_2(context);
+  }
+  static ConvolverNode _create_1(context, options) =>
+      JS('ConvolverNode', 'new ConvolverNode(#,#)', context, options);
+  static ConvolverNode _create_2(context) =>
+      JS('ConvolverNode', 'new ConvolverNode(#)', context);
+
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
   AudioBuffer buffer;
@@ -734,6 +1159,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('DelayNode.DelayNode')
+  @DocsEditable()
+  factory DelayNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return DelayNode._create_1(context, options_1);
+    }
+    return DelayNode._create_2(context);
+  }
+  static DelayNode _create_1(context, options) =>
+      JS('DelayNode', 'new DelayNode(#,#)', context, options);
+  static DelayNode _create_2(context) =>
+      JS('DelayNode', 'new DelayNode(#)', context);
+
   @DomName('DelayNode.delayTime')
   @DocsEditable()
   final AudioParam delayTime;
@@ -753,6 +1192,23 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('DynamicsCompressorNode.DynamicsCompressorNode')
+  @DocsEditable()
+  factory DynamicsCompressorNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return DynamicsCompressorNode._create_1(context, options_1);
+    }
+    return DynamicsCompressorNode._create_2(context);
+  }
+  static DynamicsCompressorNode _create_1(context, options) => JS(
+      'DynamicsCompressorNode',
+      'new DynamicsCompressorNode(#,#)',
+      context,
+      options);
+  static DynamicsCompressorNode _create_2(context) =>
+      JS('DynamicsCompressorNode', 'new DynamicsCompressorNode(#)', context);
+
   @DomName('DynamicsCompressorNode.attack')
   @DocsEditable()
   final AudioParam attack;
@@ -767,7 +1223,7 @@
 
   @DomName('DynamicsCompressorNode.reduction')
   @DocsEditable()
-  final AudioParam reduction;
+  final num reduction;
 
   @DomName('DynamicsCompressorNode.release')
   @DocsEditable()
@@ -792,6 +1248,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('GainNode.GainNode')
+  @DocsEditable()
+  factory GainNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return GainNode._create_1(context, options_1);
+    }
+    return GainNode._create_2(context);
+  }
+  static GainNode _create_1(context, options) =>
+      JS('GainNode', 'new GainNode(#,#)', context, options);
+  static GainNode _create_2(context) =>
+      JS('GainNode', 'new GainNode(#)', context);
+
   @DomName('GainNode.gain')
   @DocsEditable()
   final AudioParam gain;
@@ -810,6 +1280,15 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('IIRFilterNode.IIRFilterNode')
+  @DocsEditable()
+  factory IirFilterNode(BaseAudioContext context, Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    return IirFilterNode._create_1(context, options_1);
+  }
+  static IirFilterNode _create_1(context, options) =>
+      JS('IirFilterNode', 'new IIRFilterNode(#,#)', context, options);
+
   @DomName('IIRFilterNode.getFrequencyResponse')
   @DocsEditable()
   @Experimental() // untriaged
@@ -825,12 +1304,24 @@
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaElementAudioSourceNode
 @Experimental()
 @Native("MediaElementAudioSourceNode")
-class MediaElementAudioSourceNode extends AudioSourceNode {
+class MediaElementAudioSourceNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
   factory MediaElementAudioSourceNode._() {
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('MediaElementAudioSourceNode.MediaElementAudioSourceNode')
+  @DocsEditable()
+  factory MediaElementAudioSourceNode(BaseAudioContext context, Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    return MediaElementAudioSourceNode._create_1(context, options_1);
+  }
+  static MediaElementAudioSourceNode _create_1(context, options) => JS(
+      'MediaElementAudioSourceNode',
+      'new MediaElementAudioSourceNode(#,#)',
+      context,
+      options);
+
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable()
   @Experimental() // non-standard
@@ -851,6 +1342,26 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('MediaStreamAudioDestinationNode.MediaStreamAudioDestinationNode')
+  @DocsEditable()
+  factory MediaStreamAudioDestinationNode(BaseAudioContext context,
+      [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return MediaStreamAudioDestinationNode._create_1(context, options_1);
+    }
+    return MediaStreamAudioDestinationNode._create_2(context);
+  }
+  static MediaStreamAudioDestinationNode _create_1(context, options) => JS(
+      'MediaStreamAudioDestinationNode',
+      'new MediaStreamAudioDestinationNode(#,#)',
+      context,
+      options);
+  static MediaStreamAudioDestinationNode _create_2(context) => JS(
+      'MediaStreamAudioDestinationNode',
+      'new MediaStreamAudioDestinationNode(#)',
+      context);
+
   @DomName('MediaStreamAudioDestinationNode.stream')
   @DocsEditable()
   final MediaStream stream;
@@ -864,12 +1375,24 @@
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioSourceNode
 @Experimental()
 @Native("MediaStreamAudioSourceNode")
-class MediaStreamAudioSourceNode extends AudioSourceNode {
+class MediaStreamAudioSourceNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
   factory MediaStreamAudioSourceNode._() {
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('MediaStreamAudioSourceNode.MediaStreamAudioSourceNode')
+  @DocsEditable()
+  factory MediaStreamAudioSourceNode(BaseAudioContext context, Map options) {
+    var options_1 = convertDartToNative_Dictionary(options);
+    return MediaStreamAudioSourceNode._create_1(context, options_1);
+  }
+  static MediaStreamAudioSourceNode _create_1(context, options) => JS(
+      'MediaStreamAudioSourceNode',
+      'new MediaStreamAudioSourceNode(#,#)',
+      context,
+      options);
+
   @DomName('MediaStreamAudioSourceNode.mediaStream')
   @DocsEditable()
   final MediaStream mediaStream;
@@ -889,6 +1412,18 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('OfflineAudioCompletionEvent.OfflineAudioCompletionEvent')
+  @DocsEditable()
+  factory OfflineAudioCompletionEvent(String type, Map eventInitDict) {
+    var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
+    return OfflineAudioCompletionEvent._create_1(type, eventInitDict_1);
+  }
+  static OfflineAudioCompletionEvent _create_1(type, eventInitDict) => JS(
+      'OfflineAudioCompletionEvent',
+      'new OfflineAudioCompletionEvent(#,#)',
+      type,
+      eventInitDict);
+
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   @DocsEditable()
   final AudioBuffer renderedBuffer;
@@ -902,7 +1437,7 @@
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioContext-section
 @Experimental()
 @Native("OfflineAudioContext")
-class OfflineAudioContext extends AudioContext {
+class OfflineAudioContext extends BaseAudioContext {
   // To suppress missing implicit constructor warnings.
   factory OfflineAudioContext._() {
     throw new UnsupportedError("Not supported");
@@ -910,15 +1445,36 @@
 
   @DomName('OfflineAudioContext.OfflineAudioContext')
   @DocsEditable()
-  factory OfflineAudioContext(
-      int numberOfChannels, int numberOfFrames, num sampleRate) {
-    return OfflineAudioContext._create_1(
-        numberOfChannels, numberOfFrames, sampleRate);
+  factory OfflineAudioContext(numberOfChannels_OR_options,
+      [int numberOfFrames, num sampleRate]) {
+    if ((sampleRate is num) &&
+        (numberOfFrames is int) &&
+        (numberOfChannels_OR_options is int)) {
+      return OfflineAudioContext._create_1(
+          numberOfChannels_OR_options, numberOfFrames, sampleRate);
+    }
+    if ((numberOfChannels_OR_options is Map) &&
+        numberOfFrames == null &&
+        sampleRate == null) {
+      var options_1 =
+          convertDartToNative_Dictionary(numberOfChannels_OR_options);
+      return OfflineAudioContext._create_2(options_1);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
   static OfflineAudioContext _create_1(
-          numberOfChannels, numberOfFrames, sampleRate) =>
+          numberOfChannels_OR_options, numberOfFrames, sampleRate) =>
       JS('OfflineAudioContext', 'new OfflineAudioContext(#,#,#)',
-          numberOfChannels, numberOfFrames, sampleRate);
+          numberOfChannels_OR_options, numberOfFrames, sampleRate);
+  static OfflineAudioContext _create_2(numberOfChannels_OR_options) => JS(
+      'OfflineAudioContext',
+      'new OfflineAudioContext(#)',
+      numberOfChannels_OR_options);
+
+  @DomName('OfflineAudioContext.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
 
   @DomName('OfflineAudioContext.startRendering')
   @DocsEditable()
@@ -940,23 +1496,25 @@
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-OscillatorNode
 @Experimental()
 @Native("OscillatorNode,Oscillator")
-class OscillatorNode extends AudioSourceNode {
+class OscillatorNode extends AudioScheduledSourceNode {
   // To suppress missing implicit constructor warnings.
   factory OscillatorNode._() {
     throw new UnsupportedError("Not supported");
   }
 
-  /**
-   * Static factory designed to expose `ended` events to event
-   * handlers that are not necessarily instances of [OscillatorNode].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('OscillatorNode.endedEvent')
+  @DomName('OscillatorNode.OscillatorNode')
   @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<Event> endedEvent =
-      const EventStreamProvider<Event>('ended');
+  factory OscillatorNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return OscillatorNode._create_1(context, options_1);
+    }
+    return OscillatorNode._create_2(context);
+  }
+  static OscillatorNode _create_1(context, options) =>
+      JS('OscillatorNode', 'new OscillatorNode(#,#)', context, options);
+  static OscillatorNode _create_2(context) =>
+      JS('OscillatorNode', 'new OscillatorNode(#)', context);
 
   @DomName('OscillatorNode.detune')
   @DocsEditable()
@@ -974,20 +1532,6 @@
   @DocsEditable()
   @Experimental() // untriaged
   void setPeriodicWave(PeriodicWave periodicWave) native;
-
-  @DomName('OscillatorNode.start')
-  @DocsEditable()
-  void start([num when]) native;
-
-  @DomName('OscillatorNode.stop')
-  @DocsEditable()
-  void stop([num when]) native;
-
-  /// Stream of `ended` events handled by this [OscillatorNode].
-  @DomName('OscillatorNode.onended')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Stream<Event> get onEnded => endedEvent.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
@@ -1004,6 +1548,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('PannerNode.PannerNode')
+  @DocsEditable()
+  factory PannerNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return PannerNode._create_1(context, options_1);
+    }
+    return PannerNode._create_2(context);
+  }
+  static PannerNode _create_1(context, options) =>
+      JS('PannerNode', 'new PannerNode(#,#)', context, options);
+  static PannerNode _create_2(context) =>
+      JS('PannerNode', 'new PannerNode(#)', context);
+
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
   num coneInnerAngle;
@@ -1024,10 +1582,40 @@
   @DocsEditable()
   num maxDistance;
 
+  @DomName('PannerNode.orientationX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam orientationX;
+
+  @DomName('PannerNode.orientationY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam orientationY;
+
+  @DomName('PannerNode.orientationZ')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam orientationZ;
+
   @DomName('PannerNode.panningModel')
   @DocsEditable()
   String panningModel;
 
+  @DomName('PannerNode.positionX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam positionX;
+
+  @DomName('PannerNode.positionY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam positionY;
+
+  @DomName('PannerNode.positionZ')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioParam positionZ;
+
   @DomName('PannerNode.refDistance')
   @DocsEditable()
   num refDistance;
@@ -1043,10 +1631,6 @@
   @DomName('PannerNode.setPosition')
   @DocsEditable()
   void setPosition(num x, num y, num z) native;
-
-  @DomName('PannerNode.setVelocity')
-  @DocsEditable()
-  void setVelocity(num x, num y, num z) 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
@@ -1061,6 +1645,20 @@
   factory PeriodicWave._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('PeriodicWave.PeriodicWave')
+  @DocsEditable()
+  factory PeriodicWave(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return PeriodicWave._create_1(context, options_1);
+    }
+    return PeriodicWave._create_2(context);
+  }
+  static PeriodicWave _create_1(context, options) =>
+      JS('PeriodicWave', 'new PeriodicWave(#,#)', context, options);
+  static PeriodicWave _create_2(context) =>
+      JS('PeriodicWave', 'new PeriodicWave(#)', context);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1126,6 +1724,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('StereoPannerNode.StereoPannerNode')
+  @DocsEditable()
+  factory StereoPannerNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return StereoPannerNode._create_1(context, options_1);
+    }
+    return StereoPannerNode._create_2(context);
+  }
+  static StereoPannerNode _create_1(context, options) =>
+      JS('StereoPannerNode', 'new StereoPannerNode(#,#)', context, options);
+  static StereoPannerNode _create_2(context) =>
+      JS('StereoPannerNode', 'new StereoPannerNode(#)', context);
+
   @DomName('StereoPannerNode.pan')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1146,6 +1758,20 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('WaveShaperNode.WaveShaperNode')
+  @DocsEditable()
+  factory WaveShaperNode(BaseAudioContext context, [Map options]) {
+    if (options != null) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return WaveShaperNode._create_1(context, options_1);
+    }
+    return WaveShaperNode._create_2(context);
+  }
+  static WaveShaperNode _create_1(context, options) =>
+      JS('WaveShaperNode', 'new WaveShaperNode(#,#)', context, options);
+  static WaveShaperNode _create_2(context) =>
+      JS('WaveShaperNode', 'new WaveShaperNode(#)', context);
+
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
   Float32List curve;
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 5e833a6..d441cf1 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -3,6 +3,7 @@
  */
 library dart.dom.web_gl;
 
+import 'dart:async';
 import 'dart:collection' hide LinkedList, LinkedListEntry;
 import 'dart:_internal' show FixedLengthListMixin;
 import 'dart:html';
@@ -253,7 +254,6 @@
 const int STENCIL_CLEAR_VALUE = RenderingContext.STENCIL_CLEAR_VALUE;
 const int STENCIL_FAIL = RenderingContext.STENCIL_FAIL;
 const int STENCIL_FUNC = RenderingContext.STENCIL_FUNC;
-const int STENCIL_INDEX = RenderingContext.STENCIL_INDEX;
 const int STENCIL_INDEX8 = RenderingContext.STENCIL_INDEX8;
 const int STENCIL_PASS_DEPTH_FAIL = RenderingContext.STENCIL_PASS_DEPTH_FAIL;
 const int STENCIL_PASS_DEPTH_PASS = RenderingContext.STENCIL_PASS_DEPTH_PASS;
@@ -428,72 +428,44 @@
     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.
+
+@DocsEditable()
+@DomName('WebGLCanvas')
+@Experimental() // untriaged
+@Native("WebGLCanvas")
+class Canvas extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Canvas._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @JSName('canvas')
+  @DomName('WebGLCanvas.canvas')
+  @DocsEditable()
+  final CanvasElement canvas;
+
+  @JSName('canvas')
+  @DomName('WebGLCanvas.offscreenCanvas')
+  @DocsEditable()
+  final OffscreenCanvas offscreenCanvas;
+}
+
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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('CHROMIUMSubscribeUniform')
+@DomName('WebGLColorBufferFloat')
 @Experimental() // untriaged
-@Native("CHROMIUMSubscribeUniform")
-class ChromiumSubscribeUniform extends Interceptor {
+@Native("WebGLColorBufferFloat")
+class ColorBufferFloat extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ChromiumSubscribeUniform._() {
+  factory ColorBufferFloat._() {
     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
@@ -701,6 +673,71 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('WebGLCompressedTextureETC')
+@Experimental() // untriaged
+@Native("WebGLCompressedTextureETC")
+class CompressedTextureEtc extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CompressedTextureEtc._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_R11_EAC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_R11_EAC = 0x9270;
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_RG11_EAC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_RG11_EAC = 0x9272;
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_RGB8_ETC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_RGB8_ETC2 = 0x9274;
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276;
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_RGBA8_ETC2_EAC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_RGBA8_ETC2_EAC = 0x9278;
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_SIGNED_R11_EAC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SIGNED_R11_EAC = 0x9271;
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_SIGNED_RG11_EAC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SIGNED_RG11_EAC = 0x9273;
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279;
+
+  @DomName('WebGLCompressedTextureETC.COMPRESSED_SRGB8_ETC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SRGB8_ETC2 = 0x9275;
+
+  @DomName(
+      'WebGLCompressedTextureETC.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('WebGLCompressedTexturePVRTC')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/
 @Experimental() // experimental
@@ -763,6 +800,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('WebGLCompressedTextureS3TCsRGB')
+@Experimental() // untriaged
+@Native("WebGLCompressedTextureS3TCsRGB")
+class CompressedTextureS3TCsRgb extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CompressedTextureS3TCsRgb._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('WebGLCompressedTextureS3TCsRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D;
+
+  @DomName('WebGLCompressedTextureS3TCsRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E;
+
+  @DomName('WebGLCompressedTextureS3TCsRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F;
+
+  @DomName('WebGLCompressedTextureS3TCsRGB.COMPRESSED_SRGB_S3TC_DXT1_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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")
@@ -1084,6 +1155,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('EXTColorBufferHalfFloat')
+@Experimental() // untriaged
+@Native("EXTColorBufferHalfFloat")
+class ExtColorBufferHalfFloat extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ExtColorBufferHalfFloat._() {
+    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('EXTDisjointTimerQuery')
 @Experimental() // untriaged
 @Native("EXTDisjointTimerQuery")
@@ -1181,6 +1266,46 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('EXTDisjointTimerQueryWebGL2')
+@Experimental() // untriaged
+@Native("EXTDisjointTimerQueryWebGL2")
+class ExtDisjointTimerQueryWebGL2 extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ExtDisjointTimerQueryWebGL2._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('EXTDisjointTimerQueryWebGL2.GPU_DISJOINT_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GPU_DISJOINT_EXT = 0x8FBB;
+
+  @DomName('EXTDisjointTimerQueryWebGL2.QUERY_COUNTER_BITS_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int QUERY_COUNTER_BITS_EXT = 0x8864;
+
+  @DomName('EXTDisjointTimerQueryWebGL2.TIMESTAMP_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TIMESTAMP_EXT = 0x8E28;
+
+  @DomName('EXTDisjointTimerQueryWebGL2.TIME_ELAPSED_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TIME_ELAPSED_EXT = 0x88BF;
+
+  @JSName('queryCounterEXT')
+  @DomName('EXTDisjointTimerQueryWebGL2.queryCounterEXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void queryCounterExt(Query query, int target) 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('EXTFragDepth')
 // http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/
 @Experimental()
@@ -1247,6 +1372,26 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @DocsEditable()
+@DomName('WebGLGetBufferSubDataAsync')
+@Experimental() // untriaged
+@Native("WebGLGetBufferSubDataAsync")
+class GetBufferSubDataAsync extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory GetBufferSubDataAsync._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  @DomName('WebGLGetBufferSubDataAsync.getBufferSubDataAsync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future getBufferSubDataAsync(int target, int srcByteOffset, TypedData dstData,
+      [int dstOffset, int length]) 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('WebGLLoseContext')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_lose_context/
 @Experimental()
@@ -1463,6 +1608,11 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.WebGLRenderingContext)');
 
+  @DomName('WebGLRenderingContext.canvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CanvasElement canvas;
+
   @DomName('WebGLRenderingContext.ACTIVE_ATTRIBUTES')
   @DocsEditable()
   static const int ACTIVE_ATTRIBUTES = 0x8B89;
@@ -2321,10 +2471,6 @@
   @DocsEditable()
   static const int STENCIL_FUNC = 0x0B92;
 
-  @DomName('WebGLRenderingContext.STENCIL_INDEX')
-  @DocsEditable()
-  static const int STENCIL_INDEX = 0x1901;
-
   @DomName('WebGLRenderingContext.STENCIL_INDEX8')
   @DocsEditable()
   static const int STENCIL_INDEX8 = 0x8D48;
@@ -2655,11 +2801,6 @@
 
   // From WebGLRenderingContextBase
 
-  @DomName('WebGLRenderingContext.canvas')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final CanvasElement canvas;
-
   @DomName('WebGLRenderingContext.drawingBufferHeight')
   @DocsEditable()
   final int drawingBufferHeight;
@@ -2749,6 +2890,11 @@
   @DocsEditable()
   void colorMask(bool red, bool green, bool blue, bool alpha) native;
 
+  @DomName('WebGLRenderingContext.commit')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future commit() native;
+
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
   void compileShader(Shader shader) native;
@@ -3142,8 +3288,7 @@
           pixels);
       return;
     }
-    if ((bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData ||
-            bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
+    if ((bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData) &&
         format == null &&
         type == null &&
         pixels == null) {
@@ -3277,8 +3422,7 @@
           pixels);
       return;
     }
-    if ((bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData ||
-            bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
+    if ((bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData) &&
         type == null &&
         pixels == null) {
       var pixels_1 = convertDartToNative_ImageData(
@@ -3600,6 +3744,11 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @DomName('WebGL2RenderingContext.canvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Canvas canvas;
+
   @DomName('WebGL2RenderingContext.ACTIVE_ATTRIBUTES')
   @DocsEditable()
   @Experimental() // untriaged
@@ -4671,11 +4820,6 @@
   @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
@@ -5130,6 +5274,21 @@
   void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0,
       int dstY0, int dstX1, int dstY1, int mask, int filter) native;
 
+  @JSName('bufferData')
+  @DomName('WebGL2RenderingContext.bufferData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bufferData2(int target, TypedData srcData, int usage, int srcOffset,
+      [int length]) native;
+
+  @JSName('bufferSubData')
+  @DomName('WebGL2RenderingContext.bufferSubData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bufferSubData2(
+      int target, int dstByteOffset, TypedData srcData, int srcOffset,
+      [int length]) native;
+
   @DomName('WebGL2RenderingContext.clearBufferfi')
   @DocsEditable()
   @Experimental() // untriaged
@@ -5138,33 +5297,88 @@
   @DomName('WebGL2RenderingContext.clearBufferfv')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearBufferfv(int buffer, int drawbuffer, value) native;
+  void clearBufferfv(int buffer, int drawbuffer, value, [int srcOffset]) native;
 
   @DomName('WebGL2RenderingContext.clearBufferiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearBufferiv(int buffer, int drawbuffer, value) native;
+  void clearBufferiv(int buffer, int drawbuffer, value, [int srcOffset]) native;
 
   @DomName('WebGL2RenderingContext.clearBufferuiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearBufferuiv(int buffer, int drawbuffer, value) native;
+  void clearBufferuiv(int buffer, int drawbuffer, value, [int srcOffset])
+      native;
 
   @DomName('WebGL2RenderingContext.clientWaitSync')
   @DocsEditable()
   @Experimental() // untriaged
   int clientWaitSync(Sync sync, int flags, int timeout) native;
 
+  @JSName('compressedTexImage2D')
+  @DomName('WebGL2RenderingContext.compressedTexImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexImage2D2(int target, int level, int internalformat,
+      int width, int height, int border, TypedData data, int srcOffset,
+      [int srcLengthOverride]) native;
+
+  @JSName('compressedTexImage2D')
+  @DomName('WebGL2RenderingContext.compressedTexImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexImage2D3(int target, int level, int internalformat,
+      int width, int height, int border, int imageSize, int offset) 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;
+      int width, int height, int depth, int border, TypedData data,
+      [int srcOffset, int srcLengthOverride]) native;
+
+  @JSName('compressedTexImage3D')
+  @DomName('WebGL2RenderingContext.compressedTexImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexImage3D2(
+      int target,
+      int level,
+      int internalformat,
+      int width,
+      int height,
+      int depth,
+      int border,
+      int imageSize,
+      int offset) native;
+
+  @JSName('compressedTexSubImage2D')
+  @DomName('WebGL2RenderingContext.compressedTexSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexSubImage2D2(int target, int level, int xoffset, int yoffset,
+      int width, int height, int format, TypedData data, int srcOffset,
+      [int srcLengthOverride]) native;
+
+  @JSName('compressedTexSubImage2D')
+  @DomName('WebGL2RenderingContext.compressedTexSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexSubImage2D3(int target, int level, int xoffset, int yoffset,
+      int width, int height, int format, int imageSize, int offset) native;
 
   @DomName('WebGL2RenderingContext.compressedTexSubImage3D')
   @DocsEditable()
   @Experimental() // untriaged
-  void compressedTexSubImage3D(
+  void compressedTexSubImage3D(int target, int level, int xoffset, int yoffset,
+      int zoffset, int width, int height, int depth, int format, TypedData data,
+      [int srcOffset, int srcLengthOverride]) native;
+
+  @JSName('compressedTexSubImage3D')
+  @DomName('WebGL2RenderingContext.compressedTexSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexSubImage3D2(
       int target,
       int level,
       int xoffset,
@@ -5174,7 +5388,8 @@
       int height,
       int depth,
       int format,
-      TypedData data) native;
+      int imageSize,
+      int offset) native;
 
   @DomName('WebGL2RenderingContext.copyBufferSubData')
   @DocsEditable()
@@ -5298,7 +5513,8 @@
   @DomName('WebGL2RenderingContext.getBufferSubData')
   @DocsEditable()
   @Experimental() // untriaged
-  void getBufferSubData(int target, int offset, ByteBuffer returnedData) native;
+  void getBufferSubData(int target, int srcByteOffset, TypedData dstData,
+      [int dstOffset, int length]) native;
 
   @DomName('WebGL2RenderingContext.getFragDataLocation')
   @DocsEditable()
@@ -5319,7 +5535,7 @@
   @DomName('WebGL2RenderingContext.getQuery')
   @DocsEditable()
   @Experimental() // untriaged
-  Query getQuery(int target, int pname) native;
+  Object getQuery(int target, int pname) native;
 
   @DomName('WebGL2RenderingContext.getQueryParameter')
   @DocsEditable()
@@ -5411,7 +5627,8 @@
   @DocsEditable()
   @Experimental() // untriaged
   void readPixels2(int x, int y, int width, int height, int format, int type,
-      int offset) native;
+      dstData_OR_offset,
+      [int offset]) native;
 
   @DomName('WebGL2RenderingContext.renderbufferStorageMultisample')
   @DocsEditable()
@@ -5434,12 +5651,165 @@
   @Experimental() // untriaged
   void samplerParameteri(Sampler sampler, int pname, int param) native;
 
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texImage2D2(
+      int target,
+      int level,
+      int internalformat,
+      int width,
+      int height,
+      int border,
+      int format,
+      int type,
+      bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video,
+      [int srcOffset]) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is int) &&
+        srcOffset == null) {
+      _texImage2D2_1(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is ImageData) &&
+        srcOffset == null) {
+      var data_1 = convertDartToNative_ImageData(
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      _texImage2D2_2(target, level, internalformat, width, height, border,
+          format, type, data_1);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is ImageElement) &&
+        srcOffset == null) {
+      _texImage2D2_3(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is CanvasElement) &&
+        srcOffset == null) {
+      _texImage2D2_4(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is VideoElement) &&
+        srcOffset == null) {
+      _texImage2D2_5(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is ImageBitmap) &&
+        srcOffset == null) {
+      _texImage2D2_6(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if (srcOffset != null &&
+        (bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is TypedData)) {
+      _texImage2D2_7(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video,
+          srcOffset);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @JSName('texImage2D')
   @DomName('WebGL2RenderingContext.texImage2D')
   @DocsEditable()
   @Experimental() // untriaged
-  void texImage2D2(int target, int level, int internalformat, int width,
-      int height, int border, int format, int type, int offset) native;
+  void _texImage2D2_1(target, level, internalformat, width, height, border,
+      format, type, int offset) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D2_2(target, level, internalformat, width, height, border,
+      format, type, data) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D2_3(target, level, internalformat, width, height, border,
+      format, type, ImageElement image) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D2_4(target, level, internalformat, width, height, border,
+      format, type, CanvasElement canvas) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D2_5(target, level, internalformat, width, height, border,
+      format, type, VideoElement video) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D2_6(target, level, internalformat, width, height, border,
+      format, type, ImageBitmap bitmap) native;
+  @JSName('texImage2D')
+  @DomName('WebGL2RenderingContext.texImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage2D2_7(target, level, internalformat, width, height, border,
+      format, type, TypedData srcData, srcOffset) native;
 
   @DomName('WebGL2RenderingContext.texImage3D')
   @DocsEditable()
@@ -5454,7 +5824,183 @@
       int border,
       int format,
       int type,
-      offset_OR_pixels) native;
+      bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video,
+      [int srcOffset]) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is int) &&
+        srcOffset == null) {
+      _texImage3D_1(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          depth,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is ImageData) &&
+        srcOffset == null) {
+      var data_1 = convertDartToNative_ImageData(
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      _texImage3D_2(target, level, internalformat, width, height, depth, border,
+          format, type, data_1);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is ImageElement) &&
+        srcOffset == null) {
+      _texImage3D_3(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          depth,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is CanvasElement) &&
+        srcOffset == null) {
+      _texImage3D_4(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          depth,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is VideoElement) &&
+        srcOffset == null) {
+      _texImage3D_5(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          depth,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is ImageBitmap) &&
+        srcOffset == null) {
+      _texImage3D_6(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          depth,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+                is TypedData ||
+            bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video ==
+                null) &&
+        srcOffset == null) {
+      _texImage3D_7(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          depth,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      return;
+    }
+    if (srcOffset != null &&
+        (bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is TypedData)) {
+      _texImage3D_8(
+          target,
+          level,
+          internalformat,
+          width,
+          height,
+          depth,
+          border,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video,
+          srcOffset);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @JSName('texImage3D')
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage3D_1(target, level, internalformat, width, height, depth,
+      border, format, type, int offset) native;
+  @JSName('texImage3D')
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage3D_2(target, level, internalformat, width, height, depth,
+      border, format, type, data) native;
+  @JSName('texImage3D')
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage3D_3(target, level, internalformat, width, height, depth,
+      border, format, type, ImageElement image) native;
+  @JSName('texImage3D')
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage3D_4(target, level, internalformat, width, height, depth,
+      border, format, type, CanvasElement canvas) native;
+  @JSName('texImage3D')
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage3D_5(target, level, internalformat, width, height, depth,
+      border, format, type, VideoElement video) native;
+  @JSName('texImage3D')
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage3D_6(target, level, internalformat, width, height, depth,
+      border, format, type, ImageBitmap bitmap) native;
+  @JSName('texImage3D')
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage3D_7(target, level, internalformat, width, height, depth,
+      border, format, type, TypedData pixels) native;
+  @JSName('texImage3D')
+  @DomName('WebGL2RenderingContext.texImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texImage3D_8(target, level, internalformat, width, height, depth,
+      border, format, type, TypedData pixels, srcOffset) native;
 
   @DomName('WebGL2RenderingContext.texStorage2D')
   @DocsEditable()
@@ -5468,6 +6014,166 @@
   void texStorage3D(int target, int levels, int internalformat, int width,
       int height, int depth) native;
 
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texSubImage2D2(
+      int target,
+      int level,
+      int xoffset,
+      int yoffset,
+      int width,
+      int height,
+      int format,
+      int type,
+      bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video,
+      [int srcOffset]) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is int) &&
+        srcOffset == null) {
+      _texSubImage2D2_1(
+          target,
+          level,
+          xoffset,
+          yoffset,
+          width,
+          height,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is ImageData) &&
+        srcOffset == null) {
+      var data_1 = convertDartToNative_ImageData(
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      _texSubImage2D2_2(
+          target, level, xoffset, yoffset, width, height, format, type, data_1);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is ImageElement) &&
+        srcOffset == null) {
+      _texSubImage2D2_3(
+          target,
+          level,
+          xoffset,
+          yoffset,
+          width,
+          height,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is CanvasElement) &&
+        srcOffset == null) {
+      _texSubImage2D2_4(
+          target,
+          level,
+          xoffset,
+          yoffset,
+          width,
+          height,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is VideoElement) &&
+        srcOffset == null) {
+      _texSubImage2D2_5(
+          target,
+          level,
+          xoffset,
+          yoffset,
+          width,
+          height,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is ImageBitmap) &&
+        srcOffset == null) {
+      _texSubImage2D2_6(
+          target,
+          level,
+          xoffset,
+          yoffset,
+          width,
+          height,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
+      return;
+    }
+    if (srcOffset != null &&
+        (bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video
+            is TypedData)) {
+      _texSubImage2D2_7(
+          target,
+          level,
+          xoffset,
+          yoffset,
+          width,
+          height,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video,
+          srcOffset);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D2_1(target, level, xoffset, yoffset, width, height, format,
+      type, int offset) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D2_2(target, level, xoffset, yoffset, width, height, format,
+      type, data) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D2_3(target, level, xoffset, yoffset, width, height, format,
+      type, ImageElement image) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D2_4(target, level, xoffset, yoffset, width, height, format,
+      type, CanvasElement canvas) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D2_5(target, level, xoffset, yoffset, width, height, format,
+      type, VideoElement video) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D2_6(target, level, xoffset, yoffset, width, height, format,
+      type, ImageBitmap bitmap) native;
+  @JSName('texSubImage2D')
+  @DomName('WebGL2RenderingContext.texSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage2D2_7(target, level, xoffset, yoffset, width, height, format,
+      type, TypedData srcData, srcOffset) native;
+
   @DomName('WebGL2RenderingContext.texSubImage3D')
   @DocsEditable()
   @Experimental() // untriaged
@@ -5477,102 +6183,140 @@
       int xoffset,
       int yoffset,
       int zoffset,
-      int format_OR_width,
-      int height_OR_type,
-      bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video,
-      [int format,
+      int width,
+      int height,
+      int depth,
+      int format,
       int type,
-      TypedData pixels]) {
-    if (type != null &&
-        format != null &&
-        (bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video is int)) {
+      bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video,
+      [int srcOffset]) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is int) &&
+        srcOffset == null) {
       _texSubImage3D_1(
           target,
           level,
           xoffset,
           yoffset,
           zoffset,
-          format_OR_width,
-          height_OR_type,
-          bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video,
+          width,
+          height,
+          depth,
           format,
           type,
-          pixels);
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
       return;
     }
-    if ((bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video is ImageData ||
-            bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video == null) &&
-        format == null &&
-        type == null &&
-        pixels == null) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is ImageData) &&
+        srcOffset == null) {
       var data_1 = convertDartToNative_ImageData(
-          bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video);
-      _texSubImage3D_2(target, level, xoffset, yoffset, zoffset,
-          format_OR_width, height_OR_type, data_1);
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      _texSubImage3D_2(target, level, xoffset, yoffset, zoffset, width, height,
+          depth, format, type, data_1);
       return;
     }
-    if ((bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video is ImageElement ||
-            bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video == null) &&
-        format == null &&
-        type == null &&
-        pixels == null) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is ImageElement) &&
+        srcOffset == null) {
       _texSubImage3D_3(
           target,
           level,
           xoffset,
           yoffset,
           zoffset,
-          format_OR_width,
-          height_OR_type,
-          bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video);
+          width,
+          height,
+          depth,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
       return;
     }
-    if ((bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video is CanvasElement ||
-            bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video == null) &&
-        format == null &&
-        type == null &&
-        pixels == null) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is CanvasElement) &&
+        srcOffset == null) {
       _texSubImage3D_4(
           target,
           level,
           xoffset,
           yoffset,
           zoffset,
-          format_OR_width,
-          height_OR_type,
-          bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video);
+          width,
+          height,
+          depth,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
       return;
     }
-    if ((bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video is VideoElement ||
-            bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video == null) &&
-        format == null &&
-        type == null &&
-        pixels == null) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is VideoElement) &&
+        srcOffset == null) {
       _texSubImage3D_5(
           target,
           level,
           xoffset,
           yoffset,
           zoffset,
-          format_OR_width,
-          height_OR_type,
-          bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video);
+          width,
+          height,
+          depth,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
       return;
     }
-    if ((bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video is ImageBitmap ||
-            bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video == null) &&
-        format == null &&
-        type == null &&
-        pixels == null) {
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is ImageBitmap) &&
+        srcOffset == null) {
       _texSubImage3D_6(
           target,
           level,
           xoffset,
           yoffset,
           zoffset,
-          format_OR_width,
-          height_OR_type,
-          bitmap_OR_canvas_OR_data_OR_depth_OR_image_OR_video);
+          width,
+          height,
+          depth,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is TypedData) &&
+        srcOffset == null) {
+      _texSubImage3D_7(
+          target,
+          level,
+          xoffset,
+          yoffset,
+          zoffset,
+          width,
+          height,
+          depth,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
+      return;
+    }
+    if (srcOffset != null &&
+        (bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video
+            is TypedData)) {
+      _texSubImage3D_8(
+          target,
+          level,
+          xoffset,
+          yoffset,
+          zoffset,
+          width,
+          height,
+          depth,
+          format,
+          type,
+          bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video,
+          srcOffset);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5583,37 +6327,49 @@
   @DocsEditable()
   @Experimental() // untriaged
   void _texSubImage3D_1(target, level, xoffset, yoffset, zoffset, width, height,
-      int depth, format, type, TypedData pixels) native;
+      depth, format, type, int offset) native;
   @JSName('texSubImage3D')
   @DomName('WebGL2RenderingContext.texSubImage3D')
   @DocsEditable()
   @Experimental() // untriaged
-  void _texSubImage3D_2(
-      target, level, xoffset, yoffset, zoffset, format, type, data) native;
+  void _texSubImage3D_2(target, level, xoffset, yoffset, zoffset, width, height,
+      depth, 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;
+  void _texSubImage3D_3(target, level, xoffset, yoffset, zoffset, width, height,
+      depth, 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;
+  void _texSubImage3D_4(target, level, xoffset, yoffset, zoffset, width, height,
+      depth, 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;
+  void _texSubImage3D_5(target, level, xoffset, yoffset, zoffset, width, height,
+      depth, format, type, VideoElement video) native;
   @JSName('texSubImage3D')
   @DomName('WebGL2RenderingContext.texSubImage3D')
   @DocsEditable()
   @Experimental() // untriaged
-  void _texSubImage3D_6(target, level, xoffset, yoffset, zoffset, format, type,
-      ImageBitmap bitmap) native;
+  void _texSubImage3D_6(target, level, xoffset, yoffset, zoffset, width, height,
+      depth, format, type, ImageBitmap bitmap) native;
+  @JSName('texSubImage3D')
+  @DomName('WebGL2RenderingContext.texSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage3D_7(target, level, xoffset, yoffset, zoffset, width, height,
+      depth, format, type, TypedData pixels) native;
+  @JSName('texSubImage3D')
+  @DomName('WebGL2RenderingContext.texSubImage3D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _texSubImage3D_8(target, level, xoffset, yoffset, zoffset, width, height,
+      depth, format, type, TypedData pixels, srcOffset) native;
 
   @DomName('WebGL2RenderingContext.transformFeedbackVaryings')
   @DocsEditable()
@@ -5632,6 +6388,20 @@
   void _transformFeedbackVaryings_1(Program program, List varyings, bufferMode)
       native;
 
+  @JSName('uniform1fv')
+  @DomName('WebGL2RenderingContext.uniform1fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1fv2(UniformLocation location, v, int srcOffset, [int srcLength])
+      native;
+
+  @JSName('uniform1iv')
+  @DomName('WebGL2RenderingContext.uniform1iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1iv2(UniformLocation location, v, int srcOffset, [int srcLength])
+      native;
+
   @DomName('WebGL2RenderingContext.uniform1ui')
   @DocsEditable()
   @Experimental() // untriaged
@@ -5640,7 +6410,22 @@
   @DomName('WebGL2RenderingContext.uniform1uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform1uiv(UniformLocation location, v) native;
+  void uniform1uiv(UniformLocation location, v, [int srcOffset, int srcLength])
+      native;
+
+  @JSName('uniform2fv')
+  @DomName('WebGL2RenderingContext.uniform2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2fv2(UniformLocation location, v, int srcOffset, [int srcLength])
+      native;
+
+  @JSName('uniform2iv')
+  @DomName('WebGL2RenderingContext.uniform2iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2iv2(UniformLocation location, v, int srcOffset, [int srcLength])
+      native;
 
   @DomName('WebGL2RenderingContext.uniform2ui')
   @DocsEditable()
@@ -5650,7 +6435,22 @@
   @DomName('WebGL2RenderingContext.uniform2uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform2uiv(UniformLocation location, v) native;
+  void uniform2uiv(UniformLocation location, v, [int srcOffset, int srcLength])
+      native;
+
+  @JSName('uniform3fv')
+  @DomName('WebGL2RenderingContext.uniform3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3fv2(UniformLocation location, v, int srcOffset, [int srcLength])
+      native;
+
+  @JSName('uniform3iv')
+  @DomName('WebGL2RenderingContext.uniform3iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3iv2(UniformLocation location, v, int srcOffset, [int srcLength])
+      native;
 
   @DomName('WebGL2RenderingContext.uniform3ui')
   @DocsEditable()
@@ -5660,7 +6460,22 @@
   @DomName('WebGL2RenderingContext.uniform3uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform3uiv(UniformLocation location, v) native;
+  void uniform3uiv(UniformLocation location, v, [int srcOffset, int srcLength])
+      native;
+
+  @JSName('uniform4fv')
+  @DomName('WebGL2RenderingContext.uniform4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4fv2(UniformLocation location, v, int srcOffset, [int srcLength])
+      native;
+
+  @JSName('uniform4iv')
+  @DomName('WebGL2RenderingContext.uniform4iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4iv2(UniformLocation location, v, int srcOffset, [int srcLength])
+      native;
 
   @DomName('WebGL2RenderingContext.uniform4ui')
   @DocsEditable()
@@ -5671,7 +6486,8 @@
   @DomName('WebGL2RenderingContext.uniform4uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform4uiv(UniformLocation location, v) native;
+  void uniform4uiv(UniformLocation location, v, [int srcOffset, int srcLength])
+      native;
 
   @DomName('WebGL2RenderingContext.uniformBlockBinding')
   @DocsEditable()
@@ -5679,41 +6495,65 @@
   void uniformBlockBinding(
       Program program, int uniformBlockIndex, int uniformBlockBinding) native;
 
+  @JSName('uniformMatrix2fv')
+  @DomName('WebGL2RenderingContext.uniformMatrix2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix2fv2(
+      UniformLocation location, bool transpose, array, int srcOffset,
+      [int srcLength]) native;
+
   @DomName('WebGL2RenderingContext.uniformMatrix2x3fv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniformMatrix2x3fv(UniformLocation location, bool transpose, value)
-      native;
+  void uniformMatrix2x3fv(UniformLocation location, bool transpose, value,
+      [int srcOffset, int srcLength]) native;
 
   @DomName('WebGL2RenderingContext.uniformMatrix2x4fv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniformMatrix2x4fv(UniformLocation location, bool transpose, value)
-      native;
+  void uniformMatrix2x4fv(UniformLocation location, bool transpose, value,
+      [int srcOffset, int srcLength]) native;
+
+  @JSName('uniformMatrix3fv')
+  @DomName('WebGL2RenderingContext.uniformMatrix3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix3fv2(
+      UniformLocation location, bool transpose, array, int srcOffset,
+      [int srcLength]) native;
 
   @DomName('WebGL2RenderingContext.uniformMatrix3x2fv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniformMatrix3x2fv(UniformLocation location, bool transpose, value)
-      native;
+  void uniformMatrix3x2fv(UniformLocation location, bool transpose, value,
+      [int srcOffset, int srcLength]) native;
 
   @DomName('WebGL2RenderingContext.uniformMatrix3x4fv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniformMatrix3x4fv(UniformLocation location, bool transpose, value)
-      native;
+  void uniformMatrix3x4fv(UniformLocation location, bool transpose, value,
+      [int srcOffset, int srcLength]) native;
+
+  @JSName('uniformMatrix4fv')
+  @DomName('WebGL2RenderingContext.uniformMatrix4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix4fv2(
+      UniformLocation location, bool transpose, array, int srcOffset,
+      [int srcLength]) native;
 
   @DomName('WebGL2RenderingContext.uniformMatrix4x2fv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniformMatrix4x2fv(UniformLocation location, bool transpose, value)
-      native;
+  void uniformMatrix4x2fv(UniformLocation location, bool transpose, value,
+      [int srcOffset, int srcLength]) native;
 
   @DomName('WebGL2RenderingContext.uniformMatrix4x3fv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniformMatrix4x3fv(UniformLocation location, bool transpose, value)
-      native;
+  void uniformMatrix4x3fv(UniformLocation location, bool transpose, value,
+      [int srcOffset, int srcLength]) native;
 
   @DomName('WebGL2RenderingContext.vertexAttribDivisor')
   @DocsEditable()
@@ -5753,11 +6593,6 @@
 
   // From WebGLRenderingContextBase
 
-  @DomName('WebGL2RenderingContext.canvas')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final CanvasElement canvas;
-
   @DomName('WebGL2RenderingContext.drawingBufferHeight')
   @DocsEditable()
   @Experimental() // untriaged
@@ -5869,6 +6704,11 @@
   @Experimental() // untriaged
   void colorMask(bool red, bool green, bool blue, bool alpha) native;
 
+  @DomName('WebGL2RenderingContext.commit')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future commit() native;
+
   @DomName('WebGL2RenderingContext.compileShader')
   @DocsEditable()
   @Experimental() // untriaged
@@ -6321,8 +7161,7 @@
           pixels);
       return;
     }
-    if ((bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData ||
-            bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
+    if ((bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData) &&
         format == null &&
         type == null &&
         pixels == null) {
@@ -6465,8 +7304,7 @@
           pixels);
       return;
     }
-    if ((bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData ||
-            bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
+    if ((bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData) &&
         type == null &&
         pixels == null) {
       var pixels_1 = convertDartToNative_ImageData(
@@ -6813,6 +7651,26 @@
   factory Texture._() {
     throw new UnsupportedError("Not supported");
   }
+
+  @DomName('WebGLTexture.lastUploadedVideoFrameWasSkipped')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool lastUploadedVideoFrameWasSkipped;
+
+  @DomName('WebGLTexture.lastUploadedVideoHeight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int lastUploadedVideoHeight;
+
+  @DomName('WebGLTexture.lastUploadedVideoTimestamp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final num lastUploadedVideoTimestamp;
+
+  @DomName('WebGLTexture.lastUploadedVideoWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int lastUploadedVideoWidth;
 }
 // Copyright (c) 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/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 86b9d35..9ef5fea 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -448,8 +448,10 @@
 LayoutTests/fast/css/focus-display-block-inline_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-insert-link_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-monospace_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: Skip # Times out, Runtime error. Please triage this failure
 LayoutTests/fast/css/fontfaceset-events_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-loadingdone_t01: Pass, RuntimeError # See issue https://github.com/dart-lang/co19/issues/134
 LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError # Please triage this failure
@@ -4896,6 +4898,7 @@
 LayoutTests/fast/table/td-bordercolor-attribute_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/container-align-with-inlines_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/decomposed-after-stacked-diacritics_t01: RuntimeError # Issue 32578
 LayoutTests/fast/text/find-backwards_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/find-case-folding_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/find-hidden-text_t01: RuntimeError # Please triage this failure
@@ -4908,11 +4911,16 @@
 LayoutTests/fast/text/font-ligatures-linebreak-word_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/text/font-ligatures-linebreak_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/complex-text-rectangle_t01: RuntimeError # Issue 32578
 LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/international/rtl-text-wrapping_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/justification-padding-mid-word_t01: RuntimeError # Issue 32578
+LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError # Issue 32578
 LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/line-breaks-after-ideographic-comma-or-full-stop_t02: RuntimeError # Issue 32578
+LayoutTests/fast/text/multiglyph-characters_t01: RuntimeError # Issue 32578
 LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/pre-wrap-trailing-tab_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
@@ -5079,6 +5087,8 @@
 LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/getAttribute_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Issue 32578
+LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Issue 32579
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
@@ -5127,6 +5137,7 @@
 LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/focus_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError # Issue 32578
 LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
@@ -5732,6 +5743,7 @@
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/deprecated-flex-box-zero-width-intrinsic-max-width_t01: RuntimeError # Issue 32568
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
@@ -5886,6 +5898,7 @@
 LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/getClientRects-character_t01: RuntimeError # Issue 32573
 LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Please triage this failure
@@ -6113,6 +6126,7 @@
 LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Pass, RuntimeError # Fails 7 out of 10.
 LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-001_t01: RuntimeError # co19 issue 142
 LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/color/color-setrangetext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError # Please triage this failure
@@ -6162,10 +6176,14 @@
 LayoutTests/fast/forms/search-popup-crasher_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
 LayoutTests/fast/forms/select-max-length_t01: Pass, RuntimeError # Issue 29634
 LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/setCustomValidity-existence_t01: RuntimeError # co19 issue 141
 LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/validationMessage_t01: RuntimeError # Issue 32567
+LayoutTests/fast/forms/validity-property_t01: RuntimeError # co19 issue 140
+LayoutTests/fast/forms/willvalidate_t01: RuntimeError # co19 issue 142
 LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Please triage this failure
@@ -6292,6 +6310,7 @@
 LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/decomposed-after-stacked-diacritics_t01: RuntimeError # See issue 32574
 LayoutTests/fast/text/find-case-folding_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/find-russian_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError # Please triage this failure
@@ -6301,11 +6320,16 @@
 LayoutTests/fast/text/font-ligatures-linebreak_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/text/glyph-reordering_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
 LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/complex-text-rectangle_t01: RuntimeError # See issue 32575
 LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/international/rtl-text-wrapping_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/justification-padding-mid-word_t01: RuntimeError # Issue 32577
+LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError # Issue 32569
 LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/line-breaks-after-ideographic-comma-or-full-stop_t02: RuntimeError # Issue 32570
+LayoutTests/fast/text/multiglyph-characters_t01: RuntimeError # Issue 32577
 LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError # Please triage this failure
diff --git a/tests/compiler/dart2js/equivalence/check_helpers.dart b/tests/compiler/dart2js/equivalence/check_helpers.dart
index a0ac080..9191c01 100644
--- a/tests/compiler/dart2js/equivalence/check_helpers.dart
+++ b/tests/compiler/dart2js/equivalence/check_helpers.dart
@@ -678,6 +678,13 @@
     sb.write('void');
   }
 
+  @override
+  visitFutureOrType(FutureOrType type, _) {
+    sb.write('FutureOr<');
+    visit(type.typeArgument);
+    sb.write('>');
+  }
+
   String getText() => sb.toString();
 }
 
diff --git a/tests/compiler/dart2js/model/future_or_test.dart b/tests/compiler/dart2js/model/future_or_test.dart
new file mode 100644
index 0000000..a183c3a
--- /dev/null
+++ b/tests/compiler/dart2js/model/future_or_test.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/types.dart';
+import 'package:expect/expect.dart';
+import '../type_test_helper.dart';
+
+main() {
+  asyncTest(() async {
+    var env = await TypeEnvironment.create(
+        '''
+Future<num> futureNum() async => null;
+FutureOr<num> futureOrNum() async => null;
+
+Future<int> futureInt() async => null;
+FutureOr<int> futureOrInt() async => null;
+
+Future<List<num>> futureListNum() async => null;
+FutureOr<List<num>> futureOrListNum() async => null;
+
+Future<Future<num>> futureFutureNum() async => null;
+FutureOr<FutureOr<num>> futureOrFutureOrNum() async => null;
+
+Future<Null> futureNull() async => null;
+FutureOr<Null> futureOrNull() async => null;
+''',
+        compileMode: CompileMode.kernel,
+        options: [Flags.strongMode]);
+    DartType getReturnType(String name, String expectedType) {
+      FunctionType type = env.getMemberType(name);
+      DartType returnType = type.returnType;
+      Expect.equals(expectedType, '${returnType}');
+      return returnType;
+    }
+
+    DartType Object_ = env['Object'];
+
+    DartType futureNum = getReturnType('futureNum', 'Future<num>');
+    FutureOrType futureOrNum = getReturnType('futureOrNum', 'FutureOr<num>');
+    DartType num_ = futureOrNum.typeArgument;
+
+    DartType futureInt = getReturnType('futureInt', 'Future<int>');
+    FutureOrType futureOrInt = getReturnType('futureOrInt', 'FutureOr<int>');
+    DartType int_ = futureOrInt.typeArgument;
+
+    DartType futureListNum =
+        getReturnType('futureListNum', 'Future<List<num>>');
+    FutureOrType futureOrListNum =
+        getReturnType('futureOrListNum', 'FutureOr<List<num>>');
+    DartType ListNum = futureOrListNum.typeArgument;
+
+    DartType futureFutureNum =
+        getReturnType('futureFutureNum', 'Future<Future<num>>');
+    FutureOrType futureOrFutureOrNum =
+        getReturnType('futureOrFutureOrNum', 'FutureOr<FutureOr<num>>');
+
+    DartType futureNull = getReturnType('futureNull', 'Future<Null>');
+    FutureOrType futureOrNull = getReturnType('futureOrNull', 'FutureOr<Null>');
+    DartType Null_ = futureOrNull.typeArgument;
+
+    List<DartType> all = [
+      Object_,
+      num_,
+      int_,
+      Null_,
+      ListNum,
+      futureNum,
+      futureOrNum,
+      futureInt,
+      futureNull,
+      futureListNum,
+      futureOrInt,
+      futureOrNull,
+      futureOrListNum,
+      futureFutureNum,
+      futureOrFutureOrNum,
+    ];
+
+    Map<DartType, List<DartType>> expectedSubtypesMap = {
+      num_: [futureOrNum, futureOrFutureOrNum],
+      int_: [num_, futureOrInt, futureOrNum, futureOrFutureOrNum],
+      ListNum: [futureOrListNum],
+      futureNum: [futureOrNum, futureOrFutureOrNum],
+      futureInt: [futureNum, futureOrNum, futureOrInt, futureOrFutureOrNum],
+      futureNull: [
+        futureOrNull,
+        futureNum,
+        futureOrNum,
+        futureInt,
+        futureOrInt,
+        futureListNum,
+        futureOrListNum,
+        futureFutureNum,
+        futureOrFutureOrNum,
+        futureOrNull,
+      ],
+      futureListNum: [futureOrListNum],
+      futureFutureNum: [futureOrFutureOrNum],
+      futureOrNum: [futureOrFutureOrNum],
+      futureOrInt: [futureOrNum, futureOrFutureOrNum],
+      futureOrNull: [
+        futureOrNum,
+        futureOrInt,
+        futureOrListNum,
+        futureOrFutureOrNum
+      ],
+    };
+
+    for (DartType t in all) {
+      List<DartType> expectedSubtypes = expectedSubtypesMap[t] ?? [];
+      for (DartType s in all) {
+        bool expectedSubtype = t == s ||
+            expectedSubtypes.contains(s) ||
+            s == Object_ ||
+            t == Null_;
+        Expect.equals(
+            expectedSubtype,
+            env.isSubtype(t, s),
+            "$t${expectedSubtype ? '' : ' not'} "
+            "expected to be a subtype of $s.");
+      }
+    }
+  });
+}
diff --git a/tests/compiler/dart2js/old_frontend/analyze_api_test.dart b/tests/compiler/dart2js/old_frontend/analyze_api_test.dart
index 458824e..678e798 100644
--- a/tests/compiler/dart2js/old_frontend/analyze_api_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_api_test.dart
@@ -18,7 +18,14 @@
  * the error/warning message in the list of white-listings for each file.
  */
 // TODO(johnniwinther): Support canonical URIs as keys.
-const Map<String, List<String>> WHITE_LIST = const {};
+const Map<String, List<String>> WHITE_LIST = const {
+  "sdk/lib/io/file.dart": const [
+    "'void' is not a subtype of bound 'Object' for type variable",
+  ],
+  "sdk/lib/io/file_impl.dart": const [
+    "'void' is not a subtype of bound 'Object' for type variable",
+  ],
+};
 
 void main() {
   var uriList = new List<Uri>();
diff --git a/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart
index 558bb2f..dd803ab 100644
--- a/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart
@@ -55,9 +55,21 @@
     "Duplicated library name 'kernel.transformations.closure.converter'",
   ],
 
+  "pkg/kernel/lib/binary/ast_to_binary.dart": const [
+    "'void' is not a subtype of bound 'Object' for type variable",
+  ],
+
   "pkg/compiler/lib/src/js_backend/runtime_types.dart": const [
     "'void' is not a subtype of bound 'Object' for type variable",
   ],
+
+  "sdk/lib/io/file.dart": const [
+    "'void' is not a subtype of bound 'Object' for type variable",
+  ],
+
+  "sdk/lib/io/file_impl.dart": const [
+    "'void' is not a subtype of bound 'Object' for type variable",
+  ],
 };
 
 void main() {
diff --git a/tests/corelib_2/bigint_from_test.dart b/tests/corelib_2/bigint_from_test.dart
new file mode 100644
index 0000000..c25e457
--- /dev/null
+++ b/tests/corelib_2/bigint_from_test.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart";
+
+import 'dart:math' show pow;
+
+main() {
+  // Test integers.
+  testInt(0);
+  for (int i = 0; i < 63; i++) {
+    var n = pow(2, i);
+    testInt(-n - 1);
+    testInt(-n);
+    testInt(-n + 1);
+    testInt(n - 1);
+    testInt(n);
+    testInt(n + 1);
+  }
+  testInt(-0x8000000000000000);
+
+  // Test doubles.
+  testDouble(0.0);
+  testDouble(-0.0, 0.0);
+  for (double d in [
+    1.0,
+    2.0,
+    pow(2.0, 30) - 1,
+    pow(2.0, 30),
+    pow(2.0, 31) - 1,
+    pow(2.0, 31),
+    pow(2.0, 31) + 1,
+    pow(2.0, 32) - 1,
+    pow(2.0, 32),
+    pow(2.0, 32) + 1,
+    pow(2.0, 52) - 1,
+    pow(2.0, 52),
+    pow(2.0, 52) + 1,
+    pow(2.0, 53) - 1,
+    pow(2.0, 53),
+  ]) {
+    for (int p = 0; p < 1024; p++) {
+      var value = d * pow(2.0, p); // Valid integer value.
+      if (!value.isFinite) break;
+      testDouble(-value);
+      testDouble(value);
+    }
+  }
+  Expect.equals(BigInt.zero, new BigInt.from(0.5));
+  Expect.equals(BigInt.one, new BigInt.from(1.5));
+
+  Expect.throws(() => new BigInt.from(double.infinity));
+  Expect.throws(() => new BigInt.from(-double.infinity));
+  Expect.throws(() => new BigInt.from(double.nan));
+}
+
+testInt(int n) {
+  var bigint = new BigInt.from(n);
+  Expect.equals(n, bigint.toInt());
+  Expect.equals("$n", "$bigint");
+}
+
+testDouble(double input, [double expectation]) {
+  var bigint = new BigInt.from(input);
+  Expect.equals(expectation ?? input, bigint.toDouble());
+}
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 2e60e22..4083750a 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -4,12 +4,14 @@
 iterable_where_type_test: RuntimeError # Disabled.  Issue 32463
 
 [ $compiler == dart2analyzer ]
+bigint_from_test: CompileTimeError # Issue 32585
 compare_to2_test: CompileTimeError # invalid test
 int_parse_radix_bad_handler_test: MissingCompileTimeError
 iterable_element_at_test/static: Pass
 num_sign_test: Crash, Pass # Issue 31768
 
 [ $compiler == dart2js ]
+bigint_from_test: RuntimeError # Issue 32589
 date_time11_test: RuntimeError, Pass # Fails when US is on winter time, issue 31285.
 int_parse_radix_test/badTypes: RuntimeError # wrong exception returned
 iterable_where_type_test: RuntimeError # issue 31718
@@ -20,6 +22,7 @@
 
 [ $compiler == dartdevk ]
 apply3_test: RuntimeError
+bigint_from_test: RuntimeError # Issue 32589
 bool_from_environment2_test/03: Crash
 int_modulo_arith_test/modPow: RuntimeError
 int_modulo_arith_test/none: RuntimeError
@@ -250,7 +253,6 @@
 regexp/regress-regexp-codeflush_test: RuntimeError
 regexp/standalones_test: RuntimeError
 splay_tree_from_iterable_test: RuntimeError
-stacktrace_fromstring_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 string_from_list_test: RuntimeError
 string_fromcharcodes_test: RuntimeError
 string_replace_test: Crash # NoSuchMethodError: The getter 'isDynamic' was called on null.
@@ -303,7 +305,6 @@
 regexp/regress-regexp-codeflush_test: RuntimeError
 regexp/standalones_test: RuntimeError
 splay_tree_from_iterable_test: RuntimeError
-stacktrace_fromstring_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 string_from_list_test: RuntimeError
 string_fromcharcodes_test: RuntimeError
 string_replace_test: Crash # NoSuchMethodError: The getter 'isDynamic' was called on null.
@@ -318,6 +319,7 @@
 uri_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && $strong ]
+map_update_test: Crash # Issue 32453
 null_nosuchmethod_test: RuntimeError # Fails if type checks are skipped.
 shuffle_test: RuntimeError
 
@@ -344,6 +346,7 @@
 string_from_environment3_test/03: MissingCompileTimeError
 
 [ $compiler == dartdevc && $runtime != none ]
+bigint_from_test: CompileTimeError # Issue 32585
 compare_to2_test: CompileTimeError # invalid test
 null_nosuchmethod_test/01: RuntimeError # Issue 32088
 symbol_operator_test: RuntimeError # Issue 29921
diff --git a/tests/corelib_2/map_update_test.dart b/tests/corelib_2/map_update_test.dart
new file mode 100644
index 0000000..c00caca
--- /dev/null
+++ b/tests/corelib_2/map_update_test.dart
@@ -0,0 +1,214 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart";
+import 'dart:collection';
+import 'dart:convert' show json;
+
+Map<String, dynamic> newJsonMap() => json.decode('{}');
+Map<String, dynamic> newJsonMapCustomReviver() =>
+    json.decode('{}', reviver: (key, value) => value);
+
+void main() {
+  test({});
+  test(new LinkedHashMap());
+  test(new HashMap());
+  test(new LinkedHashMap.identity());
+  test(new HashMap.identity());
+  test(new MapView(new HashMap()));
+  test(new MapBaseMap());
+  test(new MapMixinMap());
+  test(newJsonMap());
+  test(newJsonMapCustomReviver());
+  testNonNull(new SplayTreeMap());
+  testNonNull(new SplayTreeMap(Comparable.compare));
+  testNonNull(new MapView(new SplayTreeMap()));
+}
+
+void test(Map<Comparable, Object> map) {
+  testNonNull(map);
+
+  // Also works with null keys and values (omitted for splay-tree based maps)
+  map.clear();
+  map.update(null, unreachable, ifAbsent: () => null);
+  Expect.mapEquals({null: null}, map);
+  map.update(null, (v) => "$v", ifAbsent: unreachable);
+  Expect.mapEquals({null: "null"}, map);
+  map.update(null, (v) => null, ifAbsent: unreachable);
+  Expect.mapEquals({null: null}, map);
+}
+
+void testNonNull(Map<Comparable, Object> map) {
+  // Only use literal String keys since JSON maps only accept strings,
+  // and literals works with identity-maps, and it's comparable for SplayTreeMap
+  // maps.
+  Expect.mapEquals({}, map);
+  map.update("key1", unreachable, ifAbsent: () => 42);
+  Expect.mapEquals({"key1": 42}, map);
+  map.clear();
+  map["key1"] = 42;
+  map.update("key1", (v) => 1 + v, ifAbsent: unreachable);
+  Expect.mapEquals({"key1": 43}, map);
+  map.clear();
+
+  // Operations on maps with multiple elements.
+  var multi = {
+    "k1": 1,
+    "k2": 2,
+    "k3": 3,
+    "k4": 4,
+    "k5": 5,
+    "k6": 6,
+    "k7": 7,
+    "k8": 8,
+    "k9": 9,
+    "k10": 10,
+  };
+  map.addAll(multi);
+  Expect.mapEquals(multi, map);
+  map.update("k3", (v) => 13);
+  map.update("k6", (v) => 16);
+  map.update("k11", unreachable, ifAbsent: () => 21);
+  Expect.mapEquals({
+    "k1": 1,
+    "k2": 2,
+    "k3": 13,
+    "k4": 4,
+    "k5": 5,
+    "k6": 16,
+    "k7": 7,
+    "k8": 8,
+    "k9": 9,
+    "k10": 10,
+    "k11": 21,
+  }, map);
+
+  map.clear();
+  map.updateAll((k, v) => throw "unreachable");
+  Expect.mapEquals({}, map);
+
+  map.addAll(multi);
+  map.updateAll((k, v) => "$k:$v");
+  Expect.mapEquals({
+    "k1": "k1:1",
+    "k2": "k2:2",
+    "k3": "k3:3",
+    "k4": "k4:4",
+    "k5": "k5:5",
+    "k6": "k6:6",
+    "k7": "k7:7",
+    "k8": "k8:8",
+    "k9": "k9:9",
+    "k10": "k10:10",
+  }, map);
+
+  map.clear();
+  Expect.throws(
+      () => map.update("key1", unreachable, ifAbsent: () => throw "expected"),
+      (t) => t == "expected");
+
+  map["key1"] = 42;
+  Expect.throws(() => map.update("key1", (_) => throw "expected"),
+      (t) => t == "expected");
+
+  // No ifAbsent means throw if key not there.
+  Expect.throws(() => map.update("key-not", unreachable), (e) => e is Error);
+
+  Expect.throws(() => map.update("key1", null), (e) => e is Error);
+
+  // Works with null values.
+  map.clear();
+  map.update("key1", unreachable, ifAbsent: () => null);
+  Expect.mapEquals({"key1": null}, map);
+  map.update("key1", (v) => "$v", ifAbsent: unreachable);
+  Expect.mapEquals({"key1": "null"}, map);
+  map.update("key1", (v) => null, ifAbsent: unreachable);
+  Expect.mapEquals({"key1": null}, map);
+}
+
+// Slow implementation of Map based on MapBase.
+abstract class MapBaseOperations<K, V> {
+  final List _keys = <K>[];
+  final List _values = <V>[];
+  int _modCount = 0;
+
+  V operator [](Object key) {
+    int index = _keys.indexOf(key);
+    if (index < 0) return null;
+    return _values[index];
+  }
+
+  Iterable<K> get keys => new TestKeyIterable<K>(this);
+
+  void operator []=(K key, V value) {
+    int index = _keys.indexOf(key);
+    if (index >= 0) {
+      _values[index] = value;
+    } else {
+      _modCount++;
+      _keys.add(key);
+      _values.add(value);
+    }
+  }
+
+  V remove(Object key) {
+    int index = _keys.indexOf(key);
+    if (index >= 0) {
+      var result = _values[index];
+      key = _keys.removeLast();
+      var value = _values.removeLast();
+      if (index != _keys.length) {
+        _keys[index] = key;
+        _values[index] = value;
+      }
+      _modCount++;
+      return result;
+    }
+    return null;
+  }
+
+  void clear() {
+    // Clear cannot be based on remove, since remove won't remove keys that
+    // are not equal to themselves. It will fail the testNaNKeys test.
+    _keys.clear();
+    _values.clear();
+    _modCount++;
+  }
+}
+
+class MapBaseMap<K, V> = MapBase<K, V> with MapBaseOperations<K, V>;
+class MapMixinMap<K, V> = MapBaseOperations<K, V> with MapMixin<K, V>;
+
+class TestKeyIterable<K> extends IterableBase<K> {
+  final _map;
+  TestKeyIterable(this._map);
+  int get length => _map._keys.length;
+  Iterator<K> get iterator => new TestKeyIterator<K>(_map);
+}
+
+class TestKeyIterator<K> implements Iterator<K> {
+  final _map;
+  final int _modCount;
+  int _index = 0;
+  var _current;
+  TestKeyIterator(map)
+      : _map = map,
+        _modCount = map._modCount;
+
+  bool moveNext() {
+    if (_modCount != _map._modCount) {
+      throw new ConcurrentModificationError(_map);
+    }
+    if (_index == _map._keys.length) {
+      _current = null;
+      return false;
+    }
+    _current = _map._keys[_index++];
+    return true;
+  }
+
+  K get current => _current;
+}
+
+Null unreachable([_, __]) => throw "unreachable";
diff --git a/tests/html/audiobuffersourcenode_test.dart b/tests/html/audiobuffersourcenode_test.dart
index 7da731f..34dc221 100644
--- a/tests/html/audiobuffersourcenode_test.dart
+++ b/tests/html/audiobuffersourcenode_test.dart
@@ -19,7 +19,7 @@
         var ctx = new AudioContext();
         AudioBufferSourceNode node = ctx.createBufferSource();
         expect(node is AudioBufferSourceNode, isTrue);
-        node.start(ctx.currentTime, 0, 2);
+        node.start2(ctx.currentTime, 0, 2);
         expect(node is AudioBufferSourceNode, isTrue);
       }
     });
diff --git a/tests/html/client_rect_test.dart b/tests/html/client_rect_test.dart
index 4b4481a..7b086f3 100644
--- a/tests/html/client_rect_test.dart
+++ b/tests/html/client_rect_test.dart
@@ -5,8 +5,7 @@
 import 'dart:html';
 
 main() {
-  var isRectList =
-      predicate((x) => x is List<Rectangle>, 'is a List<Rectangle>');
+  var isRectList = predicate((x) => x is DomRectList, 'is a DomRectList');
 
   insertTestDiv() {
     var element = new Element.tag('div');
diff --git a/tests/html/element_types_constructors2_test.dart b/tests/html/element_types_constructors2_test.dart
index f351831..a714031 100644
--- a/tests/html/element_types_constructors2_test.dart
+++ b/tests/html/element_types_constructors2_test.dart
@@ -35,7 +35,5 @@
     check('iframe', () => new IFrameElement() is IFrameElement);
     check('img', () => new ImageElement() is ImageElement);
     check('input', () => new InputElement() is InputElement);
-    check('keygen', () => new KeygenElement() is KeygenElement,
-        KeygenElement.supported);
   });
 }
diff --git a/tests/html/element_types_test.dart b/tests/html/element_types_test.dart
index 57129b9..6f434b9 100644
--- a/tests/html/element_types_test.dart
+++ b/tests/html/element_types_test.dart
@@ -35,12 +35,6 @@
     });
   });
 
-  group('supported_keygen', () {
-    test('supported', () {
-      expect(KeygenElement.supported, true);
-    });
-  });
-
   group('supported_meter', () {
     test('supported', () {
       expect(MeterElement.supported, true);
diff --git a/tests/html/fileapi_test.dart b/tests/html/fileapi_test.dart
index 4c36c53..a867c92 100644
--- a/tests/html/fileapi_test.dart
+++ b/tests/html/fileapi_test.dart
@@ -43,8 +43,8 @@
 
       test('directoryDoesntExist', () {
         return fs.root.getDirectory('directory2').catchError((error) {
-          expect(error.code, equals(FileError.NOT_FOUND_ERR));
-        }, test: (e) => e is FileError);
+          expect(error.code, equals(DomException.NOT_FOUND));
+        }, test: (e) => e is DomError);
       });
 
       test('directoryCreate', () {
@@ -61,8 +61,8 @@
 
       test('fileDoesntExist', () {
         return fs.root.getFile('file2').catchError((error) {
-          expect(error.code, equals(FileError.NOT_FOUND_ERR));
-        }, test: (e) => e is FileError);
+          expect(error.code, equals(DomException.NOT_FOUND));
+        }, test: (e) => e is DomError);
       });
 
       test('fileCreate', () {
@@ -139,8 +139,8 @@
           expect(entry.fullPath, '/dir_moveTo/movedFile');
           return fs.root.getFile('file4');
         }).catchError((error) {
-          expect(error.code, equals(FileError.NOT_FOUND_ERR));
-        }, test: (e) => e is FileError);
+          expect(error.code, equals(DomException.NOT_FOUND));
+        }, test: (e) => e is DomError);
       });
 
       test('remove', () {
diff --git a/tests/html/html.status b/tests/html/html.status
index 3796ec1..bd4fae9 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -65,6 +65,7 @@
 deferred_multi_app_htmltest: Skip # Times out on IE.  Issue 21537
 element_animate_test: Fail # Element.animate not supported on these browsers.
 element_test/click: Fail # IE does not support firing this event.
+element_test/position: RuntimeError # Issue 32578
 element_types_test/supported_content: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
 element_types_test/supported_details: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
 element_types_test/supported_keygen: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
@@ -100,6 +101,7 @@
 shadow_dom_test/supported: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
 speechrecognition_test/supported: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
 storage_test: Pass, RuntimeError # Issue 22166
+svgelement_test/getBoundingClientRect: RuntimeError # Isue 32580
 svgelement_test/supported_altGlyph: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
 svgelement_test/supported_animate: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
 svgelement_test/supported_animateMotion: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
@@ -501,7 +503,6 @@
 js_typed_interop_default_arg_test/explicit_argument: RuntimeError
 js_typed_interop_test/static_method_tearoff_1: RuntimeError
 mirrors_js_typed_interop_test: SkipByDesign
-websql_test/Database/Database: Pass, RuntimeError
 
 [ $compiler == dart2js && $fasta && $host_checked ]
 fontface_loaded_test: Crash
diff --git a/tests/html/indexeddb_5_test.dart b/tests/html/indexeddb_5_test.dart
index cc50cea..b61b90f 100644
--- a/tests/html/indexeddb_5_test.dart
+++ b/tests/html/indexeddb_5_test.dart
@@ -32,14 +32,6 @@
     });
   });
 
-  if (html.window.indexedDB.supportsDatabaseNames) {
-    test('getDatabaseNames', () {
-      return html.window.indexedDB.getDatabaseNames().then((names) {
-        expect(names.contains(dbName), isTrue);
-      });
-    });
-  }
-
   var value = {'name_index': 'one', 'value': 'add_value'};
   test('add/delete', () {
     var transaction = db.transaction(storeName, 'readwrite');
diff --git a/tests/html/touchevent_test.dart b/tests/html/touchevent_test.dart
index 48cc98d..b1a92e8 100644
--- a/tests/html/touchevent_test.dart
+++ b/tests/html/touchevent_test.dart
@@ -11,20 +11,12 @@
 main() {
   useHtmlIndividualConfiguration();
 
-  group('supported', () {
-    test('supported', () {
-      expect(TouchEvent.supported, true);
-    });
-  });
-
   group('functional', () {
-    test('unsupported throws', () {
-      var expectation = TouchEvent.supported ? returnsNormally : throws;
-
-      expect(() {
-        var e = new TouchEvent(null, null, null, 'touch');
-        expect(e is TouchEvent, true);
-      }, expectation);
+    test('Basic TouchEvent', () {
+      if (TouchEvent.supported) {
+        var e = new TouchEvent('touch');
+        expect(e is TouchEvent, isTrue);
+      }
     });
   });
 }
diff --git a/tests/language_2/closure_type_variables_test.dart b/tests/language_2/closure_type_variables_test.dart
index 9c39a70..2fe276c 100644
--- a/tests/language_2/closure_type_variables_test.dart
+++ b/tests/language_2/closure_type_variables_test.dart
@@ -2,6 +2,8 @@
 // for 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:expect/expect.dart";
 
 // Test that type variables are available in closures.
@@ -26,7 +28,18 @@
   }
 }
 
+class B<K> {
+  makeBaz() {
+    return (K key) async {
+      return null;
+    };
+  }
+}
+
+typedef Future<Null> aBaz(int a);
+
 main() {
   Expect.isTrue(new A<int>().foo() is A<int>);
   Expect.isTrue(new A<int>.bar().foo() is A<int>);
+  Expect.isTrue(new B<int>().makeBaz() is aBaz);
 }
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index db6dba1..f42f191 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -1145,110 +1145,51 @@
 assertion_initializer_const_error2_test/none: CompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
-async_and_or_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_catch_regression_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_foreign_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_await_syntax_test/a01a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a02a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a03a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a03b: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a05a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a05b: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a06a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a09a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a11c: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a11d: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/a12g: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b01a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b02a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b03a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b05a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b06a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b09a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b11c: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b11d: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/b12g: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/c01a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/c02a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/c03a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/c05a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/c06a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/c09a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/d01a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/d02a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/d03a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/d05a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/d06a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_syntax_test/d09a: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_await_test/02: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_await_test/03: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_await_test/none: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_break_in_finally_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_call_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_cascade_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_congruence_local_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_congruence_method_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_congruence_top_level_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_congruence_unnamed_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_continue_label_test/await_in_body: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_continue_label_test/await_in_condition: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_continue_label_test/await_in_init: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_continue_label_test/await_in_update: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_continue_label_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_control_structures_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+async_await_syntax_test/a06a: RuntimeError
+async_await_syntax_test/b06a: RuntimeError
+async_await_syntax_test/c06a: RuntimeError
+async_await_syntax_test/d06a: RuntimeError
+async_await_test/02: RuntimeError
+async_await_test/03: RuntimeError
+async_await_test/none: RuntimeError
+async_congruence_local_test/none: RuntimeError
+async_congruence_method_test/none: RuntimeError
+async_congruence_top_level_test: RuntimeError
+async_congruence_unnamed_test/none: RuntimeError
 async_error_timing_test: RuntimeError
-async_finally_rethrow_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
-async_regression_23058_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_rethrow_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_return_types_test/nestedFuture: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_return_types_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+async_return_types_test/none: RuntimeError
 async_return_types_test/tooManyTypeParameters: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_return_types_test/wrongReturnType: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_await_pauses_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_star_cancel_and_throw_in_finally_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+async_star_await_pauses_test: RuntimeError
+async_star_cancel_and_throw_in_finally_test: RuntimeError
 async_star_cancel_while_paused_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_no_cancel2_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_no_cancel_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_pause_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_regression_2238_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_star_regression_23116_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_regression_fisk_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_stream_take_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_star_take_reyield_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_test/01: Crash # Assertion failure: Unexpected arguments. Expected 1 argument, actual: [invoke dynamic method: selector=Selector(operator, *, arity=1), mask=[subclass=JSUInt32], HTypeInfoReadVariable(ListQueue.E)].
-async_star_test/02: Crash # Assertion failure: Unexpected arguments. Expected 1 argument, actual: [invoke dynamic method: selector=Selector(operator, *, arity=1), mask=[subclass=JSUInt32], HTypeInfoReadVariable(ListQueue.E)].
-async_star_test/03: Crash # Assertion failure: Unexpected arguments. Expected 1 argument, actual: [invoke dynamic method: selector=Selector(operator, *, arity=1), mask=[subclass=JSUInt32], HTypeInfoReadVariable(ListQueue.E)].
-async_star_test/04: Crash # Assertion failure: Unexpected arguments. Expected 1 argument, actual: [invoke dynamic method: selector=Selector(operator, *, arity=1), mask=[subclass=JSUInt32], HTypeInfoReadVariable(ListQueue.E)].
-async_star_test/05: Crash # Assertion failure: Unexpected arguments. Expected 1 argument, actual: [invoke dynamic method: selector=Selector(operator, *, arity=1), mask=[subclass=JSUInt32], HTypeInfoReadVariable(ListQueue.E)].
-async_star_test/none: Crash # Assertion failure: Unexpected arguments. Expected 1 argument, actual: [invoke dynamic method: selector=Selector(operator, *, arity=1), mask=[subclass=JSUInt32], HTypeInfoReadVariable(ListQueue.E)].
-async_switch_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_switch_test/withDefault: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_this_bound_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_throw_in_catch_test/forceAwait: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_throw_in_catch_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-asyncstar_concat_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-asyncstar_throw_in_catch_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-asyncstar_yield_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-asyncstar_yieldstar_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_and_ifnull_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_backwards_compatibility_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_exceptions_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_for_cancel_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_for_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-await_for_use_local_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_future_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_in_cascade_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_nonfuture_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+async_star_no_cancel2_test: RuntimeError
+async_star_no_cancel_test: RuntimeError
+async_star_pause_test: RuntimeError
+async_star_regression_2238_test: RuntimeError
+async_star_regression_23116_test: RuntimeError
+async_star_regression_fisk_test: RuntimeError
+async_star_stream_take_test: RuntimeError
+async_star_take_reyield_test: RuntimeError
+async_star_test/01: RuntimeError
+async_star_test/02: RuntimeError
+async_star_test/03: RuntimeError
+async_star_test/04: RuntimeError
+async_star_test/05: RuntimeError
+async_star_test/none: RuntimeError
+async_test: RuntimeError
+asyncstar_concat_test: RuntimeError
+asyncstar_yield_test: RuntimeError
+asyncstar_yieldstar_test: RuntimeError
+await_for_cancel_test: RuntimeError
+await_for_test: RuntimeError
+await_for_use_local_test: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-await_null_aware_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_postfix_expr_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_regression_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_started_immediately_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-await_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+await_test: RuntimeError
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
@@ -1263,9 +1204,9 @@
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-cha_deopt1_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-cha_deopt2_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-cha_deopt3_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+cha_deopt1_test: RuntimeError
+cha_deopt2_test: RuntimeError
+cha_deopt3_test: RuntimeError
 check_member_static_test/01: MissingCompileTimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
@@ -1332,7 +1273,6 @@
 covariant_subtyping_unsafe_call2_test: RuntimeError
 covariant_subtyping_unsafe_call3_test: RuntimeError
 ct_const_test: CompileTimeError
-custom_await_stack_trace_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 cyclic_constructor_test/01: Crash # Issue 30856
 cyclic_type_variable_test/01: MissingCompileTimeError
 cyclic_type_variable_test/02: MissingCompileTimeError
@@ -1342,44 +1282,40 @@
 cyclic_typedef_test/11: Crash # Stack Overflow
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
-deferred_closurize_load_library_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constant_list_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constraints_constants_test/default_argument2: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constraints_constants_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constraints_constants_test/reference_after_load: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constraints_type_annotation_test/new: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constraints_type_annotation_test/new_generic1: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constraints_type_annotation_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constraints_type_annotation_test/static_method: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_function_type_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_global_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_import_core_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+deferred_closurize_load_library_test: RuntimeError
+deferred_constant_list_test: RuntimeError
+deferred_constraints_constants_test/none: RuntimeError
+deferred_constraints_constants_test/reference_after_load: RuntimeError
+deferred_constraints_type_annotation_test/new: RuntimeError
+deferred_constraints_type_annotation_test/new_generic1: RuntimeError
+deferred_constraints_type_annotation_test/none: RuntimeError
+deferred_constraints_type_annotation_test/static_method: RuntimeError
+deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError
+deferred_function_type_test: RuntimeError
+deferred_global_test: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-deferred_inlined_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_load_constants_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_load_inval_code_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+deferred_inlined_test: RuntimeError
+deferred_load_constants_test/none: RuntimeError
+deferred_load_inval_code_test: RuntimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
-deferred_load_library_wrong_args_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_mixin_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_no_such_method_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+deferred_mixin_test: RuntimeError
+deferred_no_such_method_test: RuntimeError
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
-deferred_only_constant_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_optimized_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_redirecting_factory_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_regression_22995_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_regression_28678_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_shadow_load_library_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+deferred_only_constant_test: RuntimeError
+deferred_optimized_test: RuntimeError
+deferred_redirecting_factory_test: RuntimeError
+deferred_regression_22995_test: RuntimeError
+deferred_regression_28678_test: RuntimeError
+deferred_shadow_load_library_test: RuntimeError
 deferred_shared_and_unshared_classes_test: CompileTimeError
-deferred_static_seperate_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_super_dependency_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_type_dependency_test/as: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_type_dependency_test/is: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_type_dependency_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-deferred_type_dependency_test/type_annotation: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+deferred_static_seperate_test: RuntimeError
+deferred_type_dependency_test/as: RuntimeError
+deferred_type_dependency_test/is: RuntimeError
+deferred_type_dependency_test/none: RuntimeError
+deferred_type_dependency_test/type_annotation: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
@@ -1412,19 +1348,10 @@
 field_override4_test/02: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
-flatten_test/01: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/02: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/03: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/04: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/05: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/06: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/07: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/08: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/09: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/10: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/11: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/12: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-flatten_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+flatten_test/05: MissingRuntimeError
+flatten_test/08: MissingRuntimeError
+flatten_test/09: MissingRuntimeError
+flatten_test/12: MissingRuntimeError
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
@@ -1462,8 +1389,7 @@
 function_type_alias_test: RuntimeError
 function_type_call_getter2_test/none: RuntimeError
 function_type_test: RuntimeError
-generic_async_star_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-generic_async_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+generic_async_star_test: RuntimeError
 generic_closure_test/01: RuntimeError
 generic_closure_test/none: RuntimeError
 generic_field_mixin6_test/none: RuntimeError
@@ -1541,8 +1467,7 @@
 issue31596_override_test/08: MissingCompileTimeError
 issue31596_super_test/01: CompileTimeError
 issue31596_super_test/03: CompileTimeError
-issue_1751477_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-known_identifier_usage_error_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+known_identifier_usage_error_test/none: RuntimeError
 left_shift_test: RuntimeError # non JS number semantics
 library_env_test/has_mirror_support: RuntimeError
 library_env_test/has_no_html_support: RuntimeError
@@ -1782,28 +1707,15 @@
 reg_exp_test: RuntimeError
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
-regress_22443_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_22445_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_22579_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_22728_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_22777_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+regress_22443_test: RuntimeError
 regress_23089_test: Crash # Stack Overflow
 regress_23408_test: CompileTimeError
-regress_23498_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_23500_test/01: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_23500_test/02: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_23500_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_23996_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+regress_23996_test: RuntimeError
 regress_24283_test: RuntimeError # non JS number semantics
-regress_24935_test/01: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_24935_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_26175_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-regress_26668_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-regress_26948_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+regress_24935_test/none: RuntimeError
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
-regress_27659_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 regress_28255_test: RuntimeError
-regress_28278_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+regress_28278_test: RuntimeError
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
@@ -1817,7 +1729,7 @@
 setter_override_test/01: MissingCompileTimeError
 setter_override_test/02: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
-shadow_parameter_and_local_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+shadow_parameter_and_local_test: RuntimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
@@ -1830,12 +1742,6 @@
 super_bound_closure_test/none: CompileTimeError
 super_call4_test: CompileTimeError
 super_getter_setter_test: CompileTimeError
-super_in_async1_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-super_in_async2_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-super_in_async3_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-super_in_async4_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-super_in_async5_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-super_in_async6_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
 super_no_such_method3_test: CompileTimeError
@@ -1853,8 +1759,6 @@
 switch_case_test/02: MissingCompileTimeError
 sync_generator2_test/41: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
 sync_generator2_test/52: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
-sync_generator2_test/none: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-syncstar_yieldstar_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 syntax_test/04: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 syntax_test/05: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 syntax_test/06: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
@@ -1914,7 +1818,6 @@
 type_variable_promotion_test: RuntimeError
 typedef_is_test: RuntimeError
 typevariable_substitution2_test/02: RuntimeError
-unused_overridden_async_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 vm/async_await_catch_stacktrace_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 vm/await_synchronous_future_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 vm/causal_async_exception_stack2_test: Crash # Assertion failure: Unexpected arguments. Expected 1 argument, actual: [invoke dynamic method: selector=Selector(operator, *, arity=1), mask=[subclass=JSUInt32], HTypeInfoReadVariable(ListQueue.E)].
@@ -1987,7 +1890,7 @@
 void_type_usage_test/paren_null_equals2: Crash # 'package:front_end/src/fasta/type_inference/type_schema_environment.dart': Failed assertion: line 214 pos 12: 'false': is not true.
 wrong_number_type_arguments_test/01: MissingCompileTimeError
 wrong_number_type_arguments_test/none: Pass
-yieldstar_pause_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
+yieldstar_pause_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && $minified && $strong ]
 abstract_factory_constructor_test/00: MissingCompileTimeError
@@ -2003,110 +1906,51 @@
 assertion_initializer_const_error2_test/none: CompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
-async_and_or_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_catch_regression_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_foreign_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_await_syntax_test/a01a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a02a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a03a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a03b: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a05a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a05b: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a06a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a09a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a11c: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a11d: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/a12g: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b01a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b02a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b03a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b05a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b06a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b09a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b11c: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b11d: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/b12g: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/c01a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/c02a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/c03a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/c05a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/c06a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/c09a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/d01a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/d02a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/d03a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/d05a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/d06a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_syntax_test/d09a: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_await_test/02: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_await_test/03: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_await_test/none: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_break_in_finally_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_call_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_cascade_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_congruence_local_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_congruence_method_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_congruence_top_level_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_congruence_unnamed_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_continue_label_test/await_in_body: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_continue_label_test/await_in_condition: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_continue_label_test/await_in_init: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_continue_label_test/await_in_update: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_continue_label_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_control_structures_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+async_await_syntax_test/a06a: RuntimeError
+async_await_syntax_test/b06a: RuntimeError
+async_await_syntax_test/c06a: RuntimeError
+async_await_syntax_test/d06a: RuntimeError
+async_await_test/02: RuntimeError
+async_await_test/03: RuntimeError
+async_await_test/none: RuntimeError
+async_congruence_local_test/none: RuntimeError
+async_congruence_method_test/none: RuntimeError
+async_congruence_top_level_test: RuntimeError
+async_congruence_unnamed_test/none: RuntimeError
 async_error_timing_test: RuntimeError
-async_finally_rethrow_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
-async_regression_23058_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_rethrow_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_return_types_test/nestedFuture: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_return_types_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+async_return_types_test/none: RuntimeError
 async_return_types_test/tooManyTypeParameters: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_return_types_test/wrongReturnType: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_await_pauses_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_star_cancel_and_throw_in_finally_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+async_star_await_pauses_test: RuntimeError
+async_star_cancel_and_throw_in_finally_test: RuntimeError
 async_star_cancel_while_paused_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_no_cancel2_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_no_cancel_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_pause_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_regression_2238_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_star_regression_23116_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_regression_fisk_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_stream_take_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_star_take_reyield_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_test/01: Crash # Wrong number of template arguments, given 2, expected 1
-async_star_test/02: Crash # Wrong number of template arguments, given 2, expected 1
-async_star_test/03: Crash # Wrong number of template arguments, given 2, expected 1
-async_star_test/04: Crash # Wrong number of template arguments, given 2, expected 1
-async_star_test/05: Crash # Wrong number of template arguments, given 2, expected 1
-async_star_test/none: Crash # Wrong number of template arguments, given 2, expected 1
-async_switch_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_switch_test/withDefault: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-async_this_bound_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_throw_in_catch_test/forceAwait: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_throw_in_catch_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-asyncstar_concat_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-asyncstar_throw_in_catch_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-asyncstar_yield_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-asyncstar_yieldstar_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_and_ifnull_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_backwards_compatibility_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_exceptions_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_for_cancel_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_for_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-await_for_use_local_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_future_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_in_cascade_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_nonfuture_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+async_star_no_cancel2_test: RuntimeError
+async_star_no_cancel_test: RuntimeError
+async_star_pause_test: RuntimeError
+async_star_regression_2238_test: RuntimeError
+async_star_regression_23116_test: RuntimeError
+async_star_regression_fisk_test: RuntimeError
+async_star_stream_take_test: RuntimeError
+async_star_take_reyield_test: RuntimeError
+async_star_test/01: RuntimeError
+async_star_test/02: RuntimeError
+async_star_test/03: RuntimeError
+async_star_test/04: RuntimeError
+async_star_test/05: RuntimeError
+async_star_test/none: RuntimeError
+async_test: RuntimeError
+asyncstar_concat_test: RuntimeError
+asyncstar_yield_test: RuntimeError
+asyncstar_yieldstar_test: RuntimeError
+await_for_cancel_test: RuntimeError
+await_for_test: RuntimeError
+await_for_use_local_test: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-await_null_aware_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_postfix_expr_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_regression_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_started_immediately_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-await_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+await_test: RuntimeError
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
@@ -2120,9 +1964,9 @@
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-cha_deopt1_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-cha_deopt2_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-cha_deopt3_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+cha_deopt1_test: RuntimeError
+cha_deopt2_test: RuntimeError
+cha_deopt3_test: RuntimeError
 check_member_static_test/01: MissingCompileTimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
@@ -2188,7 +2032,6 @@
 covariant_subtyping_unsafe_call2_test: RuntimeError
 covariant_subtyping_unsafe_call3_test: RuntimeError
 ct_const_test: CompileTimeError
-custom_await_stack_trace_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 cyclic_constructor_test/01: Crash # Issue 30856
 cyclic_type_variable_test/01: MissingCompileTimeError
 cyclic_type_variable_test/02: MissingCompileTimeError
@@ -2198,44 +2041,40 @@
 cyclic_typedef_test/11: Crash # Stack Overflow
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
-deferred_closurize_load_library_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constant_list_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constraints_constants_test/default_argument2: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constraints_constants_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constraints_constants_test/reference_after_load: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constraints_type_annotation_test/new: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constraints_type_annotation_test/new_generic1: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constraints_type_annotation_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constraints_type_annotation_test/static_method: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_function_type_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_global_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_import_core_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+deferred_closurize_load_library_test: RuntimeError
+deferred_constant_list_test: RuntimeError
+deferred_constraints_constants_test/none: RuntimeError
+deferred_constraints_constants_test/reference_after_load: RuntimeError
+deferred_constraints_type_annotation_test/new: RuntimeError
+deferred_constraints_type_annotation_test/new_generic1: RuntimeError
+deferred_constraints_type_annotation_test/none: RuntimeError
+deferred_constraints_type_annotation_test/static_method: RuntimeError
+deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError
+deferred_function_type_test: RuntimeError
+deferred_global_test: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-deferred_inlined_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_load_constants_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_load_inval_code_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+deferred_inlined_test: RuntimeError
+deferred_load_constants_test/none: RuntimeError
+deferred_load_inval_code_test: RuntimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
-deferred_load_library_wrong_args_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_mixin_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_no_such_method_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+deferred_mixin_test: RuntimeError
+deferred_no_such_method_test: RuntimeError
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
-deferred_only_constant_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_optimized_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_redirecting_factory_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_regression_22995_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_regression_28678_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_shadow_load_library_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+deferred_only_constant_test: RuntimeError
+deferred_optimized_test: RuntimeError
+deferred_redirecting_factory_test: RuntimeError
+deferred_regression_22995_test: RuntimeError
+deferred_regression_28678_test: RuntimeError
+deferred_shadow_load_library_test: RuntimeError
 deferred_shared_and_unshared_classes_test: CompileTimeError
-deferred_static_seperate_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_super_dependency_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_type_dependency_test/as: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_type_dependency_test/is: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_type_dependency_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-deferred_type_dependency_test/type_annotation: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+deferred_static_seperate_test: RuntimeError
+deferred_type_dependency_test/as: RuntimeError
+deferred_type_dependency_test/is: RuntimeError
+deferred_type_dependency_test/none: RuntimeError
+deferred_type_dependency_test/type_annotation: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
@@ -2269,19 +2108,10 @@
 field_override4_test/02: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
-flatten_test/01: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/02: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/03: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/04: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/05: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/06: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/07: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/08: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/09: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/10: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/11: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/12: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-flatten_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+flatten_test/05: MissingRuntimeError
+flatten_test/08: MissingRuntimeError
+flatten_test/09: MissingRuntimeError
+flatten_test/12: MissingRuntimeError
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
@@ -2319,8 +2149,7 @@
 function_type_alias_test: RuntimeError
 function_type_call_getter2_test/none: RuntimeError
 function_type_test: RuntimeError
-generic_async_star_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-generic_async_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+generic_async_star_test: RuntimeError
 generic_field_mixin6_test/none: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
@@ -2390,13 +2219,11 @@
 issue18628_2_test/01: MissingCompileTimeError
 issue21079_test: RuntimeError
 issue23244_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-issue28498_test: Crash
 issue31596_override_test/07: MissingCompileTimeError
 issue31596_override_test/08: MissingCompileTimeError
 issue31596_super_test/01: CompileTimeError
 issue31596_super_test/03: CompileTimeError
-issue_1751477_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-known_identifier_usage_error_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+known_identifier_usage_error_test/none: RuntimeError
 left_shift_test: RuntimeError # non JS number semantics
 library_env_test/has_mirror_support: RuntimeError
 library_env_test/has_no_html_support: RuntimeError
@@ -2633,28 +2460,15 @@
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
 regress_21795_test: RuntimeError # Issue 12605
-regress_22443_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_22445_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_22579_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_22728_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_22777_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+regress_22443_test: RuntimeError
 regress_23089_test: Crash # Stack Overflow
 regress_23408_test: CompileTimeError
-regress_23498_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_23500_test/01: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_23500_test/02: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_23500_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_23996_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+regress_23996_test: RuntimeError
 regress_24283_test: RuntimeError, OK # Requires 64 bit numbers.
-regress_24935_test/01: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_24935_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_26175_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-regress_26668_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-regress_26948_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+regress_24935_test/none: RuntimeError
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
-regress_27659_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 regress_28255_test: RuntimeError
-regress_28278_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+regress_28278_test: RuntimeError
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
 regress_29784_test/01: Crash # Issue 29784
@@ -2668,7 +2482,7 @@
 setter_override_test/01: MissingCompileTimeError
 setter_override_test/02: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
-shadow_parameter_and_local_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+shadow_parameter_and_local_test: RuntimeError
 stack_trace_test: RuntimeError, OK # Stack trace not preserved in minified code.
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
@@ -2682,12 +2496,6 @@
 super_bound_closure_test/none: CompileTimeError
 super_call4_test: CompileTimeError
 super_getter_setter_test: CompileTimeError
-super_in_async1_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-super_in_async2_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-super_in_async3_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-super_in_async4_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-super_in_async5_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-super_in_async6_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
 super_no_such_method3_test: CompileTimeError
@@ -2704,8 +2512,6 @@
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
 symbol_conflict_test: RuntimeError # Issue 23857
-sync_generator2_test/none: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-syncstar_yieldstar_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 syntax_test/28: MissingCompileTimeError
 syntax_test/29: MissingCompileTimeError
 syntax_test/30: MissingCompileTimeError
@@ -2743,7 +2549,6 @@
 type_variable_promotion_test: RuntimeError
 typedef_is_test: RuntimeError
 typevariable_substitution2_test/02: RuntimeError
-unused_overridden_async_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 vm/async_await_catch_stacktrace_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 vm/await_synchronous_future_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 vm/causal_async_exception_stack2_test: Crash # Wrong number of template arguments, given 2, expected 1
@@ -2780,7 +2585,7 @@
 void_type_usage_test/conditional_return_to_void: MissingCompileTimeError
 wrong_number_type_arguments_test/01: MissingCompileTimeError
 wrong_number_type_arguments_test/none: Pass
-yieldstar_pause_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
+yieldstar_pause_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && $strong ]
 mixin_type_parameter5_test: RuntimeError
diff --git a/tests/language_2/naming3_test.dart b/tests/language_2/naming3_test.dart
index 1af4356..3936778 100644
--- a/tests/language_2/naming3_test.dart
+++ b/tests/language_2/naming3_test.dart
@@ -93,4 +93,5 @@
 
   regress31049();
   regress31050();
+  regress31117();
 }
diff --git a/tests/lib_2/html/audiobuffersourcenode_test.dart b/tests/lib_2/html/audiobuffersourcenode_test.dart
index 9c98cf0..ddfb55c 100644
--- a/tests/lib_2/html/audiobuffersourcenode_test.dart
+++ b/tests/lib_2/html/audiobuffersourcenode_test.dart
@@ -15,7 +15,7 @@
         var ctx = new AudioContext();
         AudioBufferSourceNode node = ctx.createBufferSource();
         expect(node is AudioBufferSourceNode, isTrue);
-        node.start(ctx.currentTime, 0, 2);
+        node.start2(ctx.currentTime, 0, 2);
         expect(node is AudioBufferSourceNode, isTrue);
       }
     });
diff --git a/tests/lib_2/html/client_rect_test.dart b/tests/lib_2/html/client_rect_test.dart
index 983be6b..10d84b2 100644
--- a/tests/lib_2/html/client_rect_test.dart
+++ b/tests/lib_2/html/client_rect_test.dart
@@ -4,7 +4,13 @@
 
 main() {
   var isRectList =
-      predicate((x) => x is List<Rectangle>, 'is a List<Rectangle>');
+      predicate((x) => x is DomRectList, 'should be a DomRectList');
+  var isListOfRectangle =
+      predicate((x) => x is List<Rectangle>, 'should be a List<Rectangle>');
+
+  var isRectangle = predicate((x) => x is Rectangle, 'should be a Rectangle');
+  var isDomRectReadOnly =
+      predicate((x) => x is DomRectReadOnly, 'should be a DomRectReadOnly');
 
   insertTestDiv() {
     var element = new Element.tag('div');
@@ -17,16 +23,19 @@
     return element;
   }
 
-  test("ClientRectList test", () {
+  test("DomRectList test", () {
     insertTestDiv();
     var range = new Range();
     var rects = range.getClientRects();
+    expect(rects, isListOfRectangle);
     expect(rects, isRectList);
   });
 
   test("ClientRect ==", () {
     var rect1 = document.body.getBoundingClientRect();
     var rect2 = document.body.getBoundingClientRect();
+    expect(rect1, isRectangle);
+    expect(rect1, isDomRectReadOnly);
     expect(rect1, equals(rect2));
   });
 }
diff --git a/tests/lib_2/html/custom/attribute_changed_callback_test.dart b/tests/lib_2/html/custom/attribute_changed_callback_test.dart
index 5d685c5..1d6a85e 100644
--- a/tests/lib_2/html/custom/attribute_changed_callback_test.dart
+++ b/tests/lib_2/html/custom/attribute_changed_callback_test.dart
@@ -58,8 +58,8 @@
   setUp(() => customElementsReady.then((_) {
         if (!registered) {
           registered = true;
-          document.registerElement(A.tag, A);
-          document.registerElement(B.tag, B);
+          document.registerElement2(A.tag, {'prototype': A});
+          document.registerElement2(B.tag, {'prototype': B});
         }
       }));
 
diff --git a/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.dart b/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.dart
index eb0f55b..9b6818b 100644
--- a/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.dart
+++ b/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.dart
@@ -30,7 +30,7 @@
     return customElementsReady.then((_) {
       if (!registered) {
         registered = true;
-        document.registerElement(A.tag, A);
+        document.registerElement2(A.tag, {'prototype': A});
       }
     });
   });
@@ -51,8 +51,8 @@
   });
 
   test("can extend elements that don't have special prototypes", () {
-    document.registerElement('fancy-section', FancySection,
-        extendsTag: 'section');
+    document.registerElement2(
+        'fancy-section', {'prototype': FancySection, 'extends': 'section'});
     var fancy = document.createElement('section', 'fancy-section');
     expect(fancy is FancySection, true, reason: 'fancy-section was registered');
     expect((fancy as FancySection).wasCreated, true,
diff --git a/tests/lib_2/html/custom/created_callback_test.dart b/tests/lib_2/html/custom/created_callback_test.dart
index 492fb3e..4961b8b 100644
--- a/tests/lib_2/html/custom/created_callback_test.dart
+++ b/tests/lib_2/html/custom/created_callback_test.dart
@@ -65,15 +65,15 @@
     return customElementsReady.then((_) {
       if (!registered) {
         registered = true;
-        document.registerElement(B.tag, B);
-        document.registerElement(C.tag, C);
+        document.registerElement2(B.tag, {'prototype': B});
+        document.registerElement2(C.tag, {'prototype': C});
         ErrorConstructorElement.register();
       }
     });
   });
 
   test('transfer created callback', () {
-    document.registerElement(A.tag, A as dynamic);
+    document.registerElement2(A.tag, {'prototype': A as dynamic});
     var x = new A();
     expect(A.createdInvocations, 1);
   });
@@ -107,8 +107,8 @@
 
   test('cannot register without created', () {
     expect(() {
-      document.registerElement(
-          MissingCreatedElement.tag, MissingCreatedElement);
+      document.registerElement2(
+          MissingCreatedElement.tag, {'prototype': MissingCreatedElement});
     }, throws);
   });
 
@@ -150,8 +150,8 @@
 
   test('cannot register created with params', () {
     expect(() {
-      document.registerElement(
-          'x-created-with-params', CreatedWithParametersElement);
+      document.registerElement2(
+          'x-created-with-params', {'prototype': CreatedWithParametersElement});
     }, throws);
   });
 
@@ -171,7 +171,7 @@
   NestedElement.created() : super.created();
 
   static void register() {
-    document.registerElement(tag, NestedElement);
+    document.registerElement2(tag, {'prototype': NestedElement});
   }
 
   static void test() {
@@ -202,7 +202,7 @@
   }
 
   static void register() {
-    document.registerElement(tag, AccessWhileUpgradingElement);
+    document.registerElement2(tag, {'prototype': AccessWhileUpgradingElement});
   }
 
   static void test() {
@@ -238,7 +238,7 @@
   }
 
   static void register() {
-    document.registerElement(tag, ErrorConstructorElement);
+    document.registerElement2(tag, {'prototype': ErrorConstructorElement});
   }
 }
 
@@ -253,7 +253,8 @@
   NestedCreatedConstructorElement.created() : super.created();
 
   static void register() {
-    document.registerElement(tag, NestedCreatedConstructorElement);
+    document
+        .registerElement2(tag, {'prototype': NestedCreatedConstructorElement});
   }
 
   // Try to run the created constructor, and record the results.
diff --git a/tests/lib_2/html/custom/document_register_basic_test.dart b/tests/lib_2/html/custom/document_register_basic_test.dart
index 156556e..c295b7f7 100644
--- a/tests/lib_2/html/custom/document_register_basic_test.dart
+++ b/tests/lib_2/html/custom/document_register_basic_test.dart
@@ -48,23 +48,29 @@
 
   setUp(() => customElementsReady);
 
-  test('Testing document.registerElement() basic behaviors', () {
-    document.registerElement(Foo.tag, Foo);
+  test('Testing document.registerElement2() basic behaviors', () {
+    document.registerElement2(Foo.tag, {'prototype': Foo});
 
     // Cannot register an existing dart:html type.
-    expect(() => document.registerElement('x-bad-a', HtmlElement), throws);
+    expect(
+        () => document.registerElement2('x-bad-a', {'prototype': HtmlElement}),
+        throws);
 
     // Invalid user type.  Doesn't inherit from HtmlElement.
-    expect(() => document.registerElement('x-bad-b', BadB), throws);
+    expect(() => document.registerElement2('x-bad-b', {'prototype': BadB}),
+        throws);
 
     // Cannot register abstract class.
-    expect(() => document.registerElement('x-bad-c', BadC), throws);
+    expect(() => document.registerElement2('x-bad-c', {'prototype': BadC}),
+        throws);
 
     // Not a type.
-    expect(() => document.registerElement('x-bad-d', null), throws);
+    expect(() => document.registerElement2('x-bad-d', {'prototype': null}),
+        throws);
 
     // Cannot register system type.
-    expect(() => document.registerElement('x-bad-e', Object), throws);
+    expect(() => document.registerElement2('x-bad-e', {'prototype': Object}),
+        throws);
 
     // Constructor initiated instantiation
     var createdFoo = new Foo();
@@ -105,14 +111,14 @@
     expect(someProperty[container.firstChild], someProperty[parsedFoo]);
 
     // Having another constructor
-    document.registerElement(Bar.tag, Bar);
+    document.registerElement2(Bar.tag, {'prototype': Bar});
     var createdBar = new Bar();
     expect(createdBar is Bar, isTrue);
     expect(createdBar is Foo, isFalse);
     expect(createdBar.tagName, "X-BAR");
 
     // Having a subclass
-    document.registerElement(Baz.tag, Baz);
+    document.registerElement2(Baz.tag, {'prototype': Baz});
     var createdBaz = new Baz();
     expect(createdBaz.tagName, "X-BAZ");
     expect(createdBaz.thisIsACustomClass, isTrue);
diff --git a/tests/lib_2/html/custom/document_register_template_test.dart b/tests/lib_2/html/custom/document_register_template_test.dart
index f7819fa..883f4f0 100644
--- a/tests/lib_2/html/custom/document_register_template_test.dart
+++ b/tests/lib_2/html/custom/document_register_template_test.dart
@@ -8,7 +8,8 @@
   setUp(() => customElementsReady);
 
   test('can register custom template with webcomponents-lite polyfill', () {
-    document.registerElement('my-element', MyElement, extendsTag: 'template');
+    document.registerElement2(
+        'my-element', {'prototype': MyElement, 'extends': 'template'});
     dynamic e = new Element.tag('template', 'my-element');
     document.body.append(e);
     expect(e is TemplateElement, isTrue);
diff --git a/tests/lib_2/html/custom/document_register_type_extensions_test.dart b/tests/lib_2/html/custom/document_register_type_extensions_test.dart
index e9143ea..2e652c4 100644
--- a/tests/lib_2/html/custom/document_register_type_extensions_test.dart
+++ b/tests/lib_2/html/custom/document_register_type_extensions_test.dart
@@ -96,13 +96,13 @@
       return;
     }
     registeredTypes = true;
-    document.registerElement(Foo.tag, Foo);
-    document.registerElement(Bar.tag, Bar, extendsTag: 'input');
-    document.registerElement(Baz.tag, Baz);
-    document.registerElement(Qux.tag, Qux, extendsTag: 'input');
-    document.registerElement(MyCanvas.tag, MyCanvas, extendsTag: 'canvas');
-    document.registerElement(CustomCustomDiv.tag, CustomCustomDiv,
-        extendsTag: 'div');
+    document.registerElement2(Foo.tag, {'prototype': Foo});
+    document.registerElement2(Bar.tag, {'prototype': Bar, 'extends': 'input'});
+    document.registerElement2(Baz.tag, {'prototype': Baz});
+    document.registerElement2(Qux.tag, {'prototype': Qux, 'extends': 'input'});
+    document.registerElement2(MyCanvas.tag, {'prototype': MyCanvas, 'extends': 'canvas'});
+    document.registerElement2(CustomCustomDiv.tag, {'prototype': CustomCustomDiv,
+        'extends': 'div'});
   }
 
   setUp(() => customElementsReady);
@@ -111,19 +111,19 @@
     setUp(registerTypes);
 
     test('cannot register twice', () {
-      expect(() => document.registerElement(FooBad.tag, Foo, extendsTag: 'div'),
+      expect(() => document.registerElement2(FooBad.tag, {'prototype': Foo, 'extends': 'div'}),
           throws);
     });
 
     test('cannot register for non-matching tag', () {
       expect(() {
-        document.registerElement('x-input-div', Bar, extendsTag: 'div');
+        document.registerElement2('x-input-div', {'prototype': Bar, 'extends': 'div'});
       }, throws);
     });
 
     test('cannot register type extension for custom tag', () {
       expect(() {
-        document.registerElement('x-custom-tag', CustomCustomDiv);
+        document.registerElement2('x-custom-tag',  {'prototype': CustomCustomDiv});
       }, throws);
     });
   });
diff --git a/tests/lib_2/html/custom/element_upgrade_test.dart b/tests/lib_2/html/custom/element_upgrade_test.dart
index c025552..15a9f85 100644
--- a/tests/lib_2/html/custom/element_upgrade_test.dart
+++ b/tests/lib_2/html/custom/element_upgrade_test.dart
@@ -38,7 +38,8 @@
             upgrader.upgrade(e);
           };
 
-          document.registerElement('custom-element', CustomElement);
+          document
+              .registerElement2('custom-element', {'prototype': CustomElement});
         }
       }));
 
diff --git a/tests/lib_2/html/custom/entered_left_view_test.dart b/tests/lib_2/html/custom/entered_left_view_test.dart
index 20d5dc1..3badfdb 100644
--- a/tests/lib_2/html/custom/entered_left_view_test.dart
+++ b/tests/lib_2/html/custom/entered_left_view_test.dart
@@ -79,8 +79,8 @@
   setUp(() => customElementsReady.then((_) {
         if (registeredTypes) return;
         registeredTypes = true;
-        document.registerElement('x-a', Foo);
-        document.registerElement('x-a-old', FooOldCallbacks);
+        document.registerElement2('x-a', {'prototype': Foo});
+        document.registerElement2('x-a-old', {'prototype': FooOldCallbacks});
       }));
 
   group('standard_events', () {
diff --git a/tests/lib_2/html/custom/js_custom_test.dart b/tests/lib_2/html/custom/js_custom_test.dart
index 9044134..1a7fd47 100644
--- a/tests/lib_2/html/custom/js_custom_test.dart
+++ b/tests/lib_2/html/custom/js_custom_test.dart
@@ -31,7 +31,7 @@
     return customElementsReady.then((_) {
       if (!registered) {
         registered = true;
-        document.registerElement(A.tag, A);
+        document.registerElement2(A.tag, {'prototype': A});
       }
     });
   });
@@ -51,7 +51,7 @@
 
   test('accessing custom JS element from Dart', () {
     var script = '''
-    var Foo = document.registerElement('x-foo', {
+    var Foo = document.registerElement2('x-foo', {
       prototype: Object.create(HTMLElement.prototype, {
         createdCallback: {
           value: function() {
diff --git a/tests/lib_2/html/custom/mirrors_2_test.dart b/tests/lib_2/html/custom/mirrors_2_test.dart
index a489ede..6fa8ab3 100644
--- a/tests/lib_2/html/custom/mirrors_2_test.dart
+++ b/tests/lib_2/html/custom/mirrors_2_test.dart
@@ -27,8 +27,8 @@
   setUp(() => customElementsReady.then((_) {
         if (!registered) {
           registered = true;
-          document.registerElement(A.tag, A);
-          document.registerElement(B.tag, B);
+          document.registerElement2(A.tag, {'prototype': A});
+          document.registerElement2(B.tag, {'prototype': B});
         }
       }));
 
diff --git a/tests/lib_2/html/custom/mirrors_test.dart b/tests/lib_2/html/custom/mirrors_test.dart
index e5225af..c08e777 100644
--- a/tests/lib_2/html/custom/mirrors_test.dart
+++ b/tests/lib_2/html/custom/mirrors_test.dart
@@ -22,8 +22,8 @@
   setUp(() => customElementsReady.then((_) {
         if (!registered) {
           registered = true;
-          document.registerElement(A.tag, A);
-          document.registerElement(B.tag, B);
+          document.registerElement2(A.tag, {'prototype': A});
+          document.registerElement2(B.tag, {'prototype': B});
         }
       }));
 
diff --git a/tests/lib_2/html/custom/regress_194523002_test.dart b/tests/lib_2/html/custom/regress_194523002_test.dart
index 7cb1394..a705e34 100644
--- a/tests/lib_2/html/custom/regress_194523002_test.dart
+++ b/tests/lib_2/html/custom/regress_194523002_test.dart
@@ -27,7 +27,7 @@
     return customElementsReady.then((_) {
       if (!registered) {
         registered = true;
-        document.registerElement(A.tag, A);
+        document.registerElement2(A.tag, {'prototype': A});
       }
     });
   });
diff --git a/tests/lib_2/html/custom_element_method_clash_test.dart b/tests/lib_2/html/custom_element_method_clash_test.dart
index e088b65..b9ad26d 100644
--- a/tests/lib_2/html/custom_element_method_clash_test.dart
+++ b/tests/lib_2/html/custom_element_method_clash_test.dart
@@ -28,7 +28,7 @@
 
   group('test', () {
     test('test', () {
-      document.registerElement('x-custom', CustomElement);
+      document.registerElement2('x-custom', {'prototype': CustomElement});
       CustomElement custom = new CustomElement();
       document.body.children.add(custom);
 
diff --git a/tests/lib_2/html/custom_element_name_clash_test.dart b/tests/lib_2/html/custom_element_name_clash_test.dart
index a11c565..58e29d3 100644
--- a/tests/lib_2/html/custom_element_name_clash_test.dart
+++ b/tests/lib_2/html/custom_element_name_clash_test.dart
@@ -26,7 +26,7 @@
 
   group('test', () {
     test('test', () {
-      document.registerElement('x-custom', CustomElement);
+      document.registerElement2('x-custom', {'prototype': CustomElement});
       CustomElement custom = new CustomElement();
       document.body.children.add(custom);
       // Will call appendChild in JS.
diff --git a/tests/lib_2/html/element_types_constructors2_test.dart b/tests/lib_2/html/element_types_constructors2_test.dart
index f21ae78..d1376b0 100644
--- a/tests/lib_2/html/element_types_constructors2_test.dart
+++ b/tests/lib_2/html/element_types_constructors2_test.dart
@@ -33,7 +33,5 @@
     check('iframe', () => new IFrameElement() is IFrameElement);
     check('img', () => new ImageElement() is ImageElement);
     check('input', () => new InputElement() is InputElement);
-    check('keygen', () => new KeygenElement() is KeygenElement,
-        KeygenElement.supported);
   });
 }
diff --git a/tests/lib_2/html/element_types_keygen_test.dart b/tests/lib_2/html/element_types_keygen_test.dart
deleted file mode 100644
index ec27ac8..0000000
--- a/tests/lib_2/html/element_types_keygen_test.dart
+++ /dev/null
@@ -1,13 +0,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.
-
-import 'dart:html';
-
-import 'package:expect/minitest.dart';
-
-main() {
-  test('keygen_supported', () {
-    expect(KeygenElement.supported, true);
-  });
-}
diff --git a/tests/lib_2/html/fileapi_directory_test.dart b/tests/lib_2/html/fileapi_directory_test.dart
index 6dda69a..03f8e2f 100644
--- a/tests/lib_2/html/fileapi_directory_test.dart
+++ b/tests/lib_2/html/fileapi_directory_test.dart
@@ -1,5 +1,6 @@
 library fileapi;
 
+
 import 'dart:async';
 import 'dart:html';
 
@@ -40,5 +41,6 @@
       expect(entry.name, equals('directory3'));
     });
   }
+
 }
 
diff --git a/tests/lib_2/html/fileapi_file_test.dart b/tests/lib_2/html/fileapi_file_test.dart
index 3511ec3..9075a65 100644
--- a/tests/lib_2/html/fileapi_file_test.dart
+++ b/tests/lib_2/html/fileapi_file_test.dart
@@ -7,6 +7,12 @@
 import 'package:unittest/html_config.dart';
 import 'package:async_helper/async_helper.dart';
 
+class FileAndDir {
+  FileEntry file;
+  DirectoryEntry dir;
+  FileAndDir(this.file, this.dir);
+}
+
 FileSystem fs;
 
 main() async {
diff --git a/tests/lib_2/html/indexeddb_5_test.dart b/tests/lib_2/html/indexeddb_5_test.dart
index d4d3a28..3197c33 100644
--- a/tests/lib_2/html/indexeddb_5_test.dart
+++ b/tests/lib_2/html/indexeddb_5_test.dart
@@ -29,14 +29,6 @@
     });
   });
 
-  if (html.window.indexedDB.supportsDatabaseNames) {
-    test('getDatabaseNames', () {
-      return html.window.indexedDB.getDatabaseNames().then((names) {
-        expect(names.contains(dbName), isTrue);
-      });
-    });
-  }
-
   var value = {'name_index': 'one', 'value': 'add_value'};
   test('add/delete', () {
     var transaction = db.transaction(storeName, 'readwrite');
diff --git a/tests/lib_2/html/touchevent_test.dart b/tests/lib_2/html/touchevent_test.dart
index 7ad89c6..7e9645f 100644
--- a/tests/lib_2/html/touchevent_test.dart
+++ b/tests/lib_2/html/touchevent_test.dart
@@ -4,23 +4,16 @@
 
 import 'dart:html';
 
-import 'package:expect/minitest.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
 
 main() {
-  group('supported', () {
-    test('supported', () {
-      expect(TouchEvent.supported, isTrue);
-    });
-  });
+  useHtmlConfiguration();
 
-  group('functional', () {
-    test('unsupported throws', () {
-      var expectation = TouchEvent.supported ? returnsNormally : throws;
-
-      expect(() {
-        var e = new TouchEvent(null, null, null, 'touch');
-        expect(e is TouchEvent, isTrue);
-      }, expectation);
-    });
+  test('Basic TouchEvent', () {
+    if (TouchEvent.supported) {
+      var e = new TouchEvent('touch');
+      expect(e is TouchEvent, isTrue);
+    }
   });
 }
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index fbcb2db..322ea0f 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -15,7 +15,6 @@
 
 [ $runtime == chrome ]
 html/element_animate_test/timing_dict: RuntimeError # Issue 26730
-html/touchevent_test: Fail # Touch events are only supported on touch devices
 
 [ $runtime == drt ]
 html/webgl_extensions_test: Skip # webgl does not work properly on DRT, which is 'headless'.
@@ -99,7 +98,6 @@
 html/rtc_test: Fail
 html/shadow_dom_test: Fail
 html/speechrecognition_test: Fail
-html/touchevent_test: Fail # Safari does not support TouchEvents
 html/webgl_1_test: Pass, Fail # Issue 8219
 html/worker_api_test: Skip # Issue 13221
 typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
diff --git a/tests/lib_2/lib_2_analyzer.status b/tests/lib_2/lib_2_analyzer.status
index 8c96e84..96499ee 100644
--- a/tests/lib_2/lib_2_analyzer.status
+++ b/tests/lib_2/lib_2_analyzer.status
@@ -4,6 +4,7 @@
 
 [ $compiler == dart2analyzer ]
 html/debugger_test: CompileTimeError # Issue 28969
+html/element_types_keygen_test: CompileTimeError # Chrome 57 keygen removed
 html/js_function_getter_trust_types_test: Skip # dart2js specific flags.
 html/js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue #25759
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 17522
@@ -20,7 +21,6 @@
 mirrors/metadata_nested_constructor_call_test/none: CompileTimeError
 
 [ $compiler == dart2analyzer && $strong ]
-html/transferables_test: CompileTimeError # Issue 30975
 mirrors/deferred_mirrors_metadata_test: StaticWarning # Issue 28969
 mirrors/deferred_type_test: CompileTimeError, OK # Deliberately refers to a deferred type in a declaration.
 mirrors/generic_f_bounded_mixin_application_test: CompileTimeError
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 01f5583..85c39cc 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -406,7 +406,6 @@
 html/shadow_dom_test: Fail
 html/speechrecognition_test: RuntimeError # Please triage.
 html/text_event_test: Fail # Issue 17893
-html/touchevent_test: Fail
 html/webgl_1_test: Pass, Fail # Issue 8219
 html/websql_test: Fail
 isolate/kill_self_synchronously_test: RuntimeError
@@ -484,6 +483,8 @@
 
 [ $compiler == dart2js && $runtime == safari ]
 html/audiobuffersourcenode_test: RuntimeError
+html/client_rect_test: RuntimeError # Issue 32572
+html/css_test/functional/functional: RuntimeError # Issue 32576
 html/custom/attribute_changed_callback_test: RuntimeError, Timeout
 html/custom/constructor_calls_created_synchronously_test: Pass, Timeout
 html/custom/created_callback_test: Pass, Timeout
@@ -494,6 +495,8 @@
 html/file_sample_test: Skip # FileSystem not supported on Safari.
 html/fileapi_supported_throws_test: Skip # FileSystem not supported on Safari
 html/js_mock_test: RuntimeError # Issue 32286
+html/svgelement_test: RuntimeError # Issue 32571
+html/svgelement_test/getBoundingClientRect/getBoundingClientRect: RuntimeError # Issue 32571
 html/xhr_test: RuntimeError
 isolate/cross_isolate_message_test: Skip # Issue 12627
 isolate/message_test: Skip # Issue 12627
@@ -849,7 +852,6 @@
 html/mirrors_js_typed_interop_test: RuntimeError
 html/postmessage_structured_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/speechrecognition_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
-html/touchevent_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/trusted_html_tree_sanitizer_test/not_create_document_fragment: RuntimeError
 html/trusted_html_tree_sanitizer_test/untrusted: RuntimeError
 html/typed_arrays_1_test/arrays: RuntimeError
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 476cbd7..d3e9fe3 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartdevc ]
+html/element_types_keygen_test: CompileTimeError # Chrome 57 keygen removed
 html/xhr_test: Pass, Slow
 
 [ $compiler == dartdevk ]
@@ -19,9 +20,8 @@
 
 [ $runtime == chrome && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/element_animate_test/timing_dict: RuntimeError # Issue 29922
-html/element_types_keygen_test: RuntimeError # Issue 29055
+html/element_types_keygen_test: CompileTimeError # Issue 29055
 html/js_dispatch_property_test: Skip # Timeout Issue 31030
-html/touchevent_test: RuntimeError # Issue 29922
 
 [ $runtime == drt && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/svg_test: RuntimeError # Issue 29922
@@ -61,7 +61,6 @@
 convert/utf85_test: Slow, Pass
 html/async_spawnuri_test: RuntimeError # Issue 29922
 html/async_test: RuntimeError # Issue 29922
-html/client_rect_test: RuntimeError # Issue 29922, seems to be a reified type problem with DOMClientRect
 html/custom/attribute_changed_callback_test: Skip # Issue 31577
 html/custom/constructor_calls_created_synchronously_test: Skip # Issue 31577
 html/custom/created_callback_test: RuntimeError
@@ -103,12 +102,10 @@
 html/no_linked_scripts_htmltest: Skip # Issue 29919
 html/notification_permission_test: Timeout # Issue 32002
 html/scripts_htmltest: Skip # Issue 29919
-html/transferables_test: CompileTimeError # Issue 30975
 html/transition_event_test: Pass, RuntimeError, Timeout # Issue 29922, this test seems flaky
 html/two_scripts_htmltest: Skip # Issue 29919
 html/webgl_extensions_test: RuntimeError # Issue 31017
 html/worker_api_test: RuntimeError # Issue 29922
-html/xhr_cross_origin_test/functional: RuntimeError # Issue 29922
 isolate/*: SkipByDesign # No support for dart:isolate in dart4web (http://dartbug.com/30538)
 js/null_test: RuntimeError # Issue 30652
 math/double_pow_test: RuntimeError # Issue 29922
diff --git a/tools/VERSION b/tools/VERSION
index 08a79fe..bdaeec8 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 39
+PRERELEASE 40
 PRERELEASE_PATCH 0
diff --git a/tools/bots/browsers/README b/tools/bots/browsers/README
new file mode 100644
index 0000000..91d325c
--- /dev/null
+++ b/tools/bots/browsers/README
@@ -0,0 +1,20 @@
+This directory contains the hashes of tar.gz files uploaded to cloud storage.
+Steps in the test.py script run "download_from_google_storage"
+to download these tarfiles and unpack them, if the browser cache directory exists.
+These tar files contain browser installations on the different platforms.
+We currently download Chrome.
+
+The downloads use the --auto-platform feature, so that only the browsers for the
+current platform (linux, macos, or windows) is downloaded. This requires
+the subdirectories to have the special names "linux", "win", and "mac", which
+the download_from_google_storage script in depot_tools is hardcoded to
+recognize.
+
+The download is intended to run on bots from the swarming pools, and they
+download to a named cache directory called "browsers" on those swarming bots.
+
+To upload new versions of these tar files, use the "upload_to_google_storage"
+tool in depot_tools, after replacing the existing downloaded browser in-place
+with the new version.
+
+Currently, we only have the Chrome browser for Linux uploaded.
\ No newline at end of file
diff --git a/tools/bots/browsers/chrome/linux/chrome.tar.gz.sha1 b/tools/bots/browsers/chrome/linux/chrome.tar.gz.sha1
new file mode 100644
index 0000000..ef2e989
--- /dev/null
+++ b/tools/bots/browsers/chrome/linux/chrome.tar.gz.sha1
@@ -0,0 +1 @@
+3d7ff2d8ee18bdb06f84b381795b53351437138b
\ No newline at end of file
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 8a113c8..e5c2f48 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -16,6 +16,21 @@
     },
     "support_level": "untriaged"
   },
+  "AbortPaymentEvent": {
+    "members": {
+      "AbortPaymentEvent": {},
+      "respondWith": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AbsoluteOrientationSensor": {
+    "members": {
+      "AbsoluteOrientationSensor": {}
+    },
+    "support_level": "untriaged"
+  },
   "AbstractWorker": {
     "comment": "http://www.w3.org/TR/workers/#the-abstractworker-abstract-interface",
     "members": {
@@ -26,6 +41,210 @@
     },
     "support_level": "stable"
   },
+  "Accelerometer": {
+    "members": {
+      "Accelerometer": {},
+      "x": {
+        "support_level": "untriaged"
+      },
+      "y": {
+        "support_level": "untriaged"
+      },
+      "z": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AccessibleNode": {
+    "members": {
+      "AccessibleNode": {},
+      "activeDescendant": {
+        "support_level": "untriaged"
+      },
+      "appendChild": {
+        "support_level": "untriaged"
+      },
+      "atomic": {
+        "support_level": "untriaged"
+      },
+      "autocomplete": {
+        "support_level": "untriaged"
+      },
+      "busy": {
+        "support_level": "untriaged"
+      },
+      "checked": {
+        "support_level": "untriaged"
+      },
+      "colCount": {
+        "support_level": "untriaged"
+      },
+      "colIndex": {
+        "support_level": "untriaged"
+      },
+      "colSpan": {
+        "support_level": "untriaged"
+      },
+      "controls": {
+        "support_level": "untriaged"
+      },
+      "current": {
+        "support_level": "untriaged"
+      },
+      "describedBy": {
+        "support_level": "untriaged"
+      },
+      "details": {
+        "support_level": "untriaged"
+      },
+      "disabled": {
+        "support_level": "untriaged"
+      },
+      "errorMessage": {
+        "support_level": "untriaged"
+      },
+      "expanded": {
+        "support_level": "untriaged"
+      },
+      "flowTo": {
+        "support_level": "untriaged"
+      },
+      "hasPopUp": {
+        "support_level": "untriaged"
+      },
+      "hidden": {
+        "support_level": "untriaged"
+      },
+      "invalid": {
+        "support_level": "untriaged"
+      },
+      "keyShortcuts": {
+        "support_level": "untriaged"
+      },
+      "label": {
+        "support_level": "untriaged"
+      },
+      "labeledBy": {
+        "support_level": "untriaged"
+      },
+      "level": {
+        "support_level": "untriaged"
+      },
+      "live": {
+        "support_level": "untriaged"
+      },
+      "modal": {
+        "support_level": "untriaged"
+      },
+      "multiline": {
+        "support_level": "untriaged"
+      },
+      "multiselectable": {
+        "support_level": "untriaged"
+      },
+      "onaccessibleclick": {
+        "support_level": "untriaged"
+      },
+      "onaccessiblecontextmenu": {
+        "support_level": "untriaged"
+      },
+      "onaccessibledecrement": {
+        "support_level": "untriaged"
+      },
+      "onaccessiblefocus": {
+        "support_level": "untriaged"
+      },
+      "onaccessibleincrement": {
+        "support_level": "untriaged"
+      },
+      "onaccessiblescrollintoview": {
+        "support_level": "untriaged"
+      },
+      "orientation": {
+        "support_level": "untriaged"
+      },
+      "owns": {
+        "support_level": "untriaged"
+      },
+      "placeholder": {
+        "support_level": "untriaged"
+      },
+      "posInSet": {
+        "support_level": "untriaged"
+      },
+      "pressed": {
+        "support_level": "untriaged"
+      },
+      "readOnly": {
+        "support_level": "untriaged"
+      },
+      "relevant": {
+        "support_level": "untriaged"
+      },
+      "required": {
+        "support_level": "untriaged"
+      },
+      "role": {
+        "support_level": "untriaged"
+      },
+      "roleDescription": {
+        "support_level": "untriaged"
+      },
+      "rowCount": {
+        "support_level": "untriaged"
+      },
+      "rowIndex": {
+        "support_level": "untriaged"
+      },
+      "rowSpan": {
+        "support_level": "untriaged"
+      },
+      "selected": {
+        "support_level": "untriaged"
+      },
+      "setSize": {
+        "support_level": "untriaged"
+      },
+      "sort": {
+        "support_level": "untriaged"
+      },
+      "valueMax": {
+        "support_level": "untriaged"
+      },
+      "valueMin": {
+        "support_level": "untriaged"
+      },
+      "valueNow": {
+        "support_level": "untriaged"
+      },
+      "valueText": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AccessibleNodeList": {
+    "members": {
+      "AccessibleNodeList": {},
+      "__setter__": {
+        "support_level": "untriaged"
+      },
+      "add": {
+        "support_level": "untriaged"
+      },
+      "item": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      },
+      "remove": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AesCbcParams": {
     "members": {
       "iv": {
@@ -69,9 +288,19 @@
     },
     "support_level": "untriaged"
   },
+  "AmbientLightSensor": {
+    "members": {
+      "AmbientLightSensor": {},
+      "illuminance": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AnalyserNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AnalyserNode",
     "members": {
+      "AnalyserNode": {},
       "fftSize": {},
       "frequencyBinCount": {},
       "getByteFrequencyData": {},
@@ -110,6 +339,12 @@
       "id": {
         "support_level": "untriaged"
       },
+      "oncancel": {
+        "support_level": "untriaged"
+      },
+      "onfinish": {
+        "support_level": "untriaged"
+      },
       "pause": {
         "support_level": "untriaged"
       },
@@ -133,6 +368,9 @@
       },
       "startTime": {
         "support_level": "untriaged"
+      },
+      "timeline": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -146,6 +384,9 @@
       "computedTiming": {
         "support_level": "untriaged"
       },
+      "getComputedTiming": {
+        "support_level": "untriaged"
+      },
       "timing": {
         "support_level": "untriaged"
       }
@@ -184,6 +425,35 @@
     },
     "support_level": "untriaged"
   },
+  "AnimationEffectTimingReadOnly": {
+    "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"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AnimationEvent": {
     "members": {
       "AnimationEvent": {},
@@ -225,6 +495,18 @@
     },
     "support_level": "untriaged"
   },
+  "AnimationPlaybackEvent": {
+    "members": {
+      "AnimationPlaybackEvent": {},
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "timelineTime": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AnimationPlayer": {
     "members": {
       "cancel": {
@@ -301,6 +583,14 @@
     },
     "support_level": "untriaged"
   },
+  "AnimationWorkletGlobalScope": {
+    "members": {
+      "registerAnimator": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AppBannerPromptResult": {
     "members": {
       "outcome": {
@@ -407,6 +697,7 @@
   "AudioBuffer": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section",
     "members": {
+      "AudioBuffer": {},
       "copyFromChannel": {
         "support_level": "untriaged"
       },
@@ -432,6 +723,7 @@
   "AudioBufferSourceNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section",
     "members": {
+      "AudioBufferSourceNode": {},
       "FINISHED_STATE": {},
       "PLAYING_STATE": {},
       "SCHEDULED_STATE": {},
@@ -486,6 +778,9 @@
         "support_level": "untriaged"
       },
       "start": {},
+      "start2": {
+        "support_level": "untriaged"
+      },
       "stop": {}
     },
     "support_level": "experimental"
@@ -498,6 +793,9 @@
       "addEventListener": {
         "support_level": "untriaged"
       },
+      "baseLatency": {
+        "support_level": "untriaged"
+      },
       "close": {
         "support_level": "untriaged"
       },
@@ -539,6 +837,9 @@
       "dispatchEvent": {
         "support_level": "untriaged"
       },
+      "getOutputTimestamp": {
+        "support_level": "untriaged"
+      },
       "listener": {},
       "oncomplete": {},
       "removeEventListener": {
@@ -569,10 +870,37 @@
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioListener-section",
     "members": {
       "dopplerFactor": {},
+      "forwardX": {
+        "support_level": "untriaged"
+      },
+      "forwardY": {
+        "support_level": "untriaged"
+      },
+      "forwardZ": {
+        "support_level": "untriaged"
+      },
+      "positionX": {
+        "support_level": "untriaged"
+      },
+      "positionY": {
+        "support_level": "untriaged"
+      },
+      "positionZ": {
+        "support_level": "untriaged"
+      },
       "setOrientation": {},
       "setPosition": {},
       "setVelocity": {},
-      "speedOfSound": {}
+      "speedOfSound": {},
+      "upX": {
+        "support_level": "untriaged"
+      },
+      "upY": {
+        "support_level": "untriaged"
+      },
+      "upZ": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -596,6 +924,9 @@
   "AudioParam": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioParam",
     "members": {
+      "cancelAndHoldAtTime": {
+        "support_level": "untriaged"
+      },
       "cancelScheduledValues": {},
       "defaultValue": {},
       "exponentialRampToValueAtTime": {},
@@ -612,9 +943,14 @@
     },
     "support_level": "experimental"
   },
+  "AudioParamMap": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "AudioProcessingEvent": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent-section",
     "members": {
+      "AudioProcessingEvent": {},
       "inputBuffer": {},
       "outputBuffer": {},
       "playbackTime": {
@@ -623,6 +959,23 @@
     },
     "support_level": "experimental"
   },
+  "AudioScheduledSourceNode": {
+    "members": {
+      "onended": {
+        "support_level": "untriaged"
+      },
+      "start": {
+        "support_level": "untriaged"
+      },
+      "start2": {
+        "support_level": "untriaged"
+      },
+      "stop": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AudioSourceNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html",
     "members": {},
@@ -644,6 +997,9 @@
       },
       "language": {
         "support_level": "untriaged"
+      },
+      "sourceBuffer": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -660,8 +1016,68 @@
       "length": {
         "support_level": "untriaged"
       },
+      "onaddtrack": {
+        "support_level": "untriaged"
+      },
       "onchange": {
         "support_level": "untriaged"
+      },
+      "onremovetrack": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AudioWorkletGlobalScope": {
+    "members": {
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "registerProcessor": {
+        "support_level": "untriaged"
+      },
+      "sampleRate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AudioWorkletNode": {
+    "members": {
+      "AudioWorkletNode": {},
+      "parameters": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AudioWorkletProcessor": {
+    "members": {},
+    "support_level": "untriaged"
+  },
+  "AuthenticatorAssertionResponse": {
+    "members": {
+      "authenticatorData": {
+        "support_level": "untriaged"
+      },
+      "signature": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AuthenticatorAttestationResponse": {
+    "members": {
+      "attestationObject": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AuthenticatorResponse": {
+    "members": {
+      "clientDataJSON": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -674,6 +1090,108 @@
     },
     "support_level": "experimental"
   },
+  "BackgroundFetchClickEvent": {
+    "members": {
+      "BackgroundFetchClickEvent": {},
+      "state": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BackgroundFetchEvent": {
+    "members": {
+      "BackgroundFetchEvent": {},
+      "id": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BackgroundFetchFailEvent": {
+    "members": {
+      "BackgroundFetchFailEvent": {},
+      "fetches": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BackgroundFetchFetch": {
+    "members": {
+      "request": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BackgroundFetchManager": {
+    "members": {
+      "fetch": {
+        "support_level": "untriaged"
+      },
+      "get": {
+        "support_level": "untriaged"
+      },
+      "getIds": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BackgroundFetchRegistration": {
+    "members": {
+      "abort": {
+        "support_level": "untriaged"
+      },
+      "downloadTotal": {
+        "support_level": "untriaged"
+      },
+      "downloaded": {
+        "support_level": "untriaged"
+      },
+      "id": {
+        "support_level": "untriaged"
+      },
+      "onprogress": {
+        "support_level": "untriaged"
+      },
+      "title": {
+        "support_level": "untriaged"
+      },
+      "totalDownloadSize": {
+        "support_level": "untriaged"
+      },
+      "uploadTotal": {
+        "support_level": "untriaged"
+      },
+      "uploaded": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BackgroundFetchSettledFetch": {
+    "members": {
+      "BackgroundFetchSettledFetch": {},
+      "response": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BackgroundFetchedEvent": {
+    "members": {
+      "BackgroundFetchedEvent": {},
+      "fetches": {
+        "support_level": "untriaged"
+      },
+      "updateUI": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "BarProp": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop",
     "dart_action": "suppress",
@@ -682,6 +1200,107 @@
     },
     "support_level": "standard"
   },
+  "BarcodeDetector": {
+    "members": {
+      "BarcodeDetector": {},
+      "detect": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BaseAudioContext": {
+    "members": {
+      "createAnalyser": {
+        "support_level": "untriaged"
+      },
+      "createBiquadFilter": {
+        "support_level": "untriaged"
+      },
+      "createBuffer": {
+        "support_level": "untriaged"
+      },
+      "createBufferSource": {
+        "support_level": "untriaged"
+      },
+      "createChannelMerger": {
+        "support_level": "untriaged"
+      },
+      "createChannelSplitter": {
+        "support_level": "untriaged"
+      },
+      "createConstantSource": {
+        "support_level": "untriaged"
+      },
+      "createConvolver": {
+        "support_level": "untriaged"
+      },
+      "createDelay": {
+        "support_level": "untriaged"
+      },
+      "createDynamicsCompressor": {
+        "support_level": "untriaged"
+      },
+      "createGain": {
+        "support_level": "untriaged"
+      },
+      "createIIRFilter": {
+        "support_level": "untriaged"
+      },
+      "createMediaElementSource": {
+        "support_level": "untriaged"
+      },
+      "createMediaStreamDestination": {
+        "support_level": "untriaged"
+      },
+      "createMediaStreamSource": {
+        "support_level": "untriaged"
+      },
+      "createOscillator": {
+        "support_level": "untriaged"
+      },
+      "createPanner": {
+        "support_level": "untriaged"
+      },
+      "createPeriodicWave": {
+        "support_level": "untriaged"
+      },
+      "createScriptProcessor": {
+        "support_level": "untriaged"
+      },
+      "createStereoPanner": {
+        "support_level": "untriaged"
+      },
+      "createWaveShaper": {
+        "support_level": "untriaged"
+      },
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "decodeAudioData": {
+        "support_level": "untriaged"
+      },
+      "destination": {
+        "support_level": "untriaged"
+      },
+      "listener": {
+        "support_level": "untriaged"
+      },
+      "onstatechange": {
+        "support_level": "untriaged"
+      },
+      "resume": {
+        "support_level": "untriaged"
+      },
+      "sampleRate": {
+        "support_level": "untriaged"
+      },
+      "state": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "BatteryManager": {
     "comment": "https://dvcs.w3.org/hg/dap/raw-file/default/battery/Overview.html#batterymanager-interface",
     "dart_action": "experimental",
@@ -733,6 +1352,7 @@
     "members": {
       "ALLPASS": {},
       "BANDPASS": {},
+      "BiquadFilterNode": {},
       "HIGHPASS": {},
       "HIGHSHELF": {},
       "LOWPASS": {},
@@ -770,6 +1390,9 @@
       "BlobEvent": {},
       "data": {
         "support_level": "untriaged"
+      },
+      "timecode": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -931,6 +1554,26 @@
     },
     "support_level": "untriaged"
   },
+  "BluetoothRemoteGATTDescriptor": {
+    "members": {
+      "characteristic": {
+        "support_level": "untriaged"
+      },
+      "readValue": {
+        "support_level": "untriaged"
+      },
+      "uuid": {
+        "support_level": "untriaged"
+      },
+      "value": {
+        "support_level": "untriaged"
+      },
+      "writeValue": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "BluetoothRemoteGATTServer": {
     "members": {
       "connect": {
@@ -996,6 +1639,9 @@
       "bodyUsed": {
         "support_level": "untriaged"
       },
+      "formData": {
+        "support_level": "untriaged"
+      },
       "json": {
         "support_level": "untriaged"
       },
@@ -1005,6 +1651,52 @@
     },
     "support_level": "untriaged"
   },
+  "BroadcastChannel": {
+    "members": {
+      "BroadcastChannel": {},
+      "close": {
+        "support_level": "untriaged"
+      },
+      "name": {
+        "support_level": "untriaged"
+      },
+      "onmessage": {
+        "support_level": "untriaged"
+      },
+      "onmessageerror": {
+        "support_level": "untriaged"
+      },
+      "postMessage": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BudgetService": {
+    "members": {
+      "getBudget": {
+        "support_level": "untriaged"
+      },
+      "getCost": {
+        "support_level": "untriaged"
+      },
+      "reserve": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "BudgetState": {
+    "members": {
+      "budgetAt": {
+        "support_level": "untriaged"
+      },
+      "time": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CDATASection": {
     "comment": "http://dom.spec.whatwg.org/#cdatasection",
     "dart_action": "suppress",
@@ -1051,12 +1743,105 @@
     "comment": "http://www.w3.org/TR/css3-conditional/#the-css-interface",
     "dart_action": "experimental",
     "members": {
+      "Hz": {
+        "support_level": "untriaged"
+      },
+      "ch": {
+        "support_level": "untriaged"
+      },
+      "cm": {
+        "support_level": "untriaged"
+      },
+      "deg": {
+        "support_level": "untriaged"
+      },
+      "dpcm": {
+        "support_level": "untriaged"
+      },
+      "dpi": {
+        "support_level": "untriaged"
+      },
+      "dppx": {
+        "support_level": "untriaged"
+      },
+      "em": {
+        "support_level": "untriaged"
+      },
       "escape": {
         "support_level": "untriaged"
       },
+      "ex": {
+        "support_level": "untriaged"
+      },
+      "fr": {
+        "support_level": "untriaged"
+      },
+      "grad": {
+        "support_level": "untriaged"
+      },
+      "in": {
+        "support_level": "untriaged"
+      },
+      "inch": {
+        "support_level": "untriaged"
+      },
+      "kHz": {
+        "support_level": "untriaged"
+      },
+      "mm": {
+        "support_level": "untriaged"
+      },
+      "ms": {
+        "support_level": "untriaged"
+      },
+      "number": {
+        "support_level": "untriaged"
+      },
+      "paintWorklet": {
+        "support_level": "untriaged"
+      },
+      "pc": {
+        "support_level": "untriaged"
+      },
+      "percent": {
+        "support_level": "untriaged"
+      },
+      "pt": {
+        "support_level": "untriaged"
+      },
+      "px": {
+        "support_level": "untriaged"
+      },
+      "rad": {
+        "support_level": "untriaged"
+      },
+      "registerProperty": {
+        "support_level": "untriaged"
+      },
+      "rem": {
+        "support_level": "untriaged"
+      },
+      "s": {
+        "support_level": "untriaged"
+      },
       "supports": {},
       "supportsCondition": {},
-      "supportsProperty": {}
+      "supportsProperty": {},
+      "turn": {
+        "support_level": "untriaged"
+      },
+      "vh": {
+        "support_level": "untriaged"
+      },
+      "vmax": {
+        "support_level": "untriaged"
+      },
+      "vmin": {
+        "support_level": "untriaged"
+      },
+      "vw": {
+        "support_level": "untriaged"
+      }
     }
   },
   "CSSCharsetRule": {
@@ -1066,6 +1851,14 @@
     },
     "support_level": "experimental"
   },
+  "CSSConditionRule": {
+    "members": {
+      "conditionText": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSFontFaceLoadEvent": {
     "comment": "http://www.w3.org/TR/css3-fonts/",
     "members": {
@@ -1107,6 +1900,20 @@
     },
     "support_level": "experimental"
   },
+  "CSSImageValue": {
+    "members": {
+      "intrinsicHeight": {
+        "support_level": "untriaged"
+      },
+      "intrinsicRatio": {
+        "support_level": "untriaged"
+      },
+      "intrinsicWidth": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSImportRule": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule",
     "members": {
@@ -1154,6 +1961,24 @@
     },
     "support_level": "untriaged"
   },
+  "CSSKeywordValue": {
+    "members": {
+      "CSSKeywordValue": {},
+      "value": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSMatrixComponent": {
+    "members": {
+      "CSSMatrixComponent": {},
+      "matrix": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSMediaRule": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule",
     "members": {
@@ -1175,6 +2000,29 @@
     },
     "support_level": "untriaged"
   },
+  "CSSNumericValue": {
+    "members": {
+      "add": {
+        "support_level": "untriaged"
+      },
+      "div": {
+        "support_level": "untriaged"
+      },
+      "mul": {
+        "support_level": "untriaged"
+      },
+      "parse": {
+        "support_level": "untriaged"
+      },
+      "sub": {
+        "support_level": "untriaged"
+      },
+      "to": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSPageRule": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPageRule",
     "members": {
@@ -1183,6 +2031,27 @@
     },
     "support_level": "stable"
   },
+  "CSSPerspective": {
+    "members": {
+      "CSSPerspective": {},
+      "length": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSPositionValue": {
+    "members": {
+      "CSSPositionValue": {},
+      "x": {
+        "support_level": "untriaged"
+      },
+      "y": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSPrimitiveValue": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface",
     "dart_action": "suppress",
@@ -1228,6 +2097,32 @@
     },
     "support_level": "deprecated"
   },
+  "CSSResourceValue": {
+    "members": {
+      "state": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSRotation": {
+    "members": {
+      "CSSRotation": {},
+      "angle": {
+        "support_level": "untriaged"
+      },
+      "x": {
+        "support_level": "untriaged"
+      },
+      "y": {
+        "support_level": "untriaged"
+      },
+      "z": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSRule": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule",
     "members": {
@@ -1290,6 +2185,33 @@
     },
     "support_level": "stable"
   },
+  "CSSScale": {
+    "members": {
+      "CSSScale": {},
+      "x": {
+        "support_level": "untriaged"
+      },
+      "y": {
+        "support_level": "untriaged"
+      },
+      "z": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSSkew": {
+    "members": {
+      "CSSSkew": {},
+      "ax": {
+        "support_level": "untriaged"
+      },
+      "ay": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSStyleDeclaration": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface",
     "members": {
@@ -1353,6 +2275,14 @@
     },
     "support_level": "stable"
   },
+  "CSSStyleValue": {
+    "members": {
+      "parse": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSSupportsRule": {
     "comment": "http://www.w3.org/TR/css3-conditional/#csssupportsrule",
     "members": {
@@ -1363,12 +2293,88 @@
     },
     "support_level": "standard"
   },
+  "CSSTransformComponent": {
+    "members": {
+      "is2D": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSTransformValue": {
+    "members": {
+      "CSSTransformValue": {},
+      "componentAtIndex": {
+        "support_level": "untriaged"
+      },
+      "is2D": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      },
+      "toMatrix": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSTranslation": {
+    "members": {
+      "CSSTranslation": {},
+      "x": {
+        "support_level": "untriaged"
+      },
+      "y": {
+        "support_level": "untriaged"
+      },
+      "z": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSURLImageValue": {
+    "members": {
+      "CSSURLImageValue": {},
+      "url": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSUnitValue": {
+    "members": {
+      "CSSUnitValue": {},
+      "type": {
+        "support_level": "untriaged"
+      },
+      "unit": {
+        "support_level": "untriaged"
+      },
+      "value": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSUnknownRule": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-cssstylesheet-interface",
     "dart_action": "suppress",
     "members": {},
     "support_level": "deprecated"
   },
+  "CSSUnparsedValue": {
+    "members": {
+      "fragmentAtIndex": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSValue": {
     "comment": "http://dev.w3.org/csswg/cssom/",
     "dart_action": "suppress",
@@ -1403,6 +2409,17 @@
     },
     "support_level": "deprecated"
   },
+  "CSSVariableReferenceValue": {
+    "members": {
+      "fallback": {
+        "support_level": "untriaged"
+      },
+      "variable": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSVariablesMap": {
     "members": {
       "clear": {
@@ -1525,6 +2542,27 @@
     },
     "support_level": "untriaged"
   },
+  "CanMakePaymentEvent": {
+    "members": {
+      "CanMakePaymentEvent": {},
+      "methodData": {
+        "support_level": "untriaged"
+      },
+      "modifiers": {
+        "support_level": "untriaged"
+      },
+      "paymentRequestOrigin": {
+        "support_level": "untriaged"
+      },
+      "respondWith": {
+        "support_level": "untriaged"
+      },
+      "topLevelOrigin": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Canvas2DContextAttributes": {
     "comment": "http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL",
     "members": {
@@ -1553,6 +2591,38 @@
     },
     "support_level": "stable"
   },
+  "CanvasPath": {
+    "members": {
+      "arc": {
+        "support_level": "untriaged"
+      },
+      "arcTo": {
+        "support_level": "untriaged"
+      },
+      "bezierCurveTo": {
+        "support_level": "untriaged"
+      },
+      "closePath": {
+        "support_level": "untriaged"
+      },
+      "ellipse": {
+        "support_level": "untriaged"
+      },
+      "lineTo": {
+        "support_level": "untriaged"
+      },
+      "moveTo": {
+        "support_level": "untriaged"
+      },
+      "quadraticCurveTo": {
+        "support_level": "untriaged"
+      },
+      "rect": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CanvasPathMethods": {
     "members": {
       "arc": {
@@ -1779,12 +2849,16 @@
   },
   "ChannelMergerNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelMergerNode-section",
-    "members": {},
+    "members": {
+      "ChannelMergerNode": {}
+    },
     "support_level": "experimental"
   },
   "ChannelSplitterNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelSplitterNode-section",
-    "members": {},
+    "members": {
+      "ChannelSplitterNode": {}
+    },
     "support_level": "experimental"
   },
   "CharacterData": {
@@ -1891,6 +2965,9 @@
       "postMessage": {
         "support_level": "untriaged"
       },
+      "type": {
+        "support_level": "untriaged"
+      },
       "url": {
         "support_level": "untriaged"
       }
@@ -1946,14 +3023,27 @@
       "files": {},
       "getData": {},
       "items": {},
+      "read": {
+        "support_level": "untriaged"
+      },
+      "readText": {
+        "support_level": "untriaged"
+      },
       "setData": {},
       "setDragImage": {},
-      "types": {}
+      "types": {},
+      "write": {
+        "support_level": "untriaged"
+      },
+      "writeText": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "stable"
   },
   "ClipboardEvent": {
     "members": {
+      "ClipboardEvent": {},
       "clipboardData": {
         "support_level": "untriaged"
       }
@@ -2207,14 +3297,35 @@
     },
     "support_level": "untriaged"
   },
+  "ConstantSourceNode": {
+    "members": {
+      "ConstantSourceNode": {},
+      "offset": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ConvolverNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ConvolverNode",
     "members": {
+      "ConvolverNode": {},
       "buffer": {},
       "normalize": {}
     },
     "support_level": "experimental"
   },
+  "CookieStore": {
+    "members": {
+      "getAll": {
+        "support_level": "untriaged"
+      },
+      "set": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Coordinates": {
     "comment": "http://www.w3.org/TR/geolocation-API/#coordinates_interface",
     "members": {
@@ -2258,8 +3369,22 @@
     },
     "support_level": "untriaged"
   },
+  "CredentialUserData": {
+    "members": {
+      "iconURL": {
+        "support_level": "untriaged"
+      },
+      "name": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CredentialsContainer": {
     "members": {
+      "create": {
+        "support_level": "untriaged"
+      },
       "get": {
         "support_level": "untriaged"
       },
@@ -2272,6 +3397,9 @@
       "notifySignedOut": {
         "support_level": "untriaged"
       },
+      "preventSilentAccess": {
+        "support_level": "untriaged"
+      },
       "request": {
         "support_level": "untriaged"
       },
@@ -2362,9 +3490,27 @@
   "CustomElementConstructor": {
     "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-custom-element-constructor-generation",
     "dart_action": "suppress",
-    "members": {},
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "experimental"
   },
+  "CustomElementRegistry": {
+    "members": {
+      "define": {
+        "support_level": "untriaged"
+      },
+      "get": {
+        "support_level": "untriaged"
+      },
+      "whenDefined": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CustomEvent": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Events/#interface-CustomEvent",
     "members": {
@@ -2600,6 +3746,18 @@
       "f": {
         "support_level": "untriaged"
       },
+      "fromFloat32Array": {
+        "support_level": "untriaged"
+      },
+      "fromFloat64Array": {
+        "support_level": "untriaged"
+      },
+      "fromMatrix": {
+        "support_level": "untriaged"
+      },
+      "invertSelf": {
+        "support_level": "untriaged"
+      },
       "m11": {
         "support_level": "untriaged"
       },
@@ -2654,6 +3812,15 @@
       "preMultiplySelf": {
         "support_level": "untriaged"
       },
+      "rotateAxisAngleSelf": {
+        "support_level": "untriaged"
+      },
+      "rotateFromVectorSelf": {
+        "support_level": "untriaged"
+      },
+      "rotateSelf": {
+        "support_level": "untriaged"
+      },
       "scale3dSelf": {
         "support_level": "untriaged"
       },
@@ -2663,6 +3830,15 @@
       "scaleSelf": {
         "support_level": "untriaged"
       },
+      "setMatrixValue": {
+        "support_level": "untriaged"
+      },
+      "skewXSelf": {
+        "support_level": "untriaged"
+      },
+      "skewYSelf": {
+        "support_level": "untriaged"
+      },
       "translateSelf": {
         "support_level": "untriaged"
       }
@@ -2671,6 +3847,7 @@
   },
   "DOMMatrixReadOnly": {
     "members": {
+      "DOMMatrixReadOnly": {},
       "a": {
         "support_level": "untriaged"
       },
@@ -2689,6 +3866,24 @@
       "f": {
         "support_level": "untriaged"
       },
+      "flipX": {
+        "support_level": "untriaged"
+      },
+      "flipY": {
+        "support_level": "untriaged"
+      },
+      "fromFloat32Array": {
+        "support_level": "untriaged"
+      },
+      "fromFloat64Array": {
+        "support_level": "untriaged"
+      },
+      "fromMatrix": {
+        "support_level": "untriaged"
+      },
+      "inverse": {
+        "support_level": "untriaged"
+      },
       "is2D": {
         "support_level": "untriaged"
       },
@@ -2746,6 +3941,15 @@
       "multiply": {
         "support_level": "untriaged"
       },
+      "rotate": {
+        "support_level": "untriaged"
+      },
+      "rotateAxisAngle": {
+        "support_level": "untriaged"
+      },
+      "rotateFromVector": {
+        "support_level": "untriaged"
+      },
       "scale": {
         "support_level": "untriaged"
       },
@@ -2755,12 +3959,21 @@
       "scaleNonUniform": {
         "support_level": "untriaged"
       },
+      "skewX": {
+        "support_level": "untriaged"
+      },
+      "skewY": {
+        "support_level": "untriaged"
+      },
       "toFloat32Array": {
         "support_level": "untriaged"
       },
       "toFloat64Array": {
         "support_level": "untriaged"
       },
+      "transformPoint": {
+        "support_level": "untriaged"
+      },
       "translate": {
         "support_level": "untriaged"
       }
@@ -2777,6 +3990,9 @@
   "DOMPoint": {
     "members": {
       "DOMPoint": {},
+      "fromPoint": {
+        "support_level": "untriaged"
+      },
       "w": {
         "support_level": "untriaged"
       },
@@ -2795,6 +4011,12 @@
   "DOMPointReadOnly": {
     "members": {
       "DOMPointReadOnly": {},
+      "fromPoint": {
+        "support_level": "untriaged"
+      },
+      "matrixTransform": {
+        "support_level": "untriaged"
+      },
       "w": {
         "support_level": "untriaged"
       },
@@ -2810,9 +4032,39 @@
     },
     "support_level": "untriaged"
   },
+  "DOMQuad": {
+    "members": {
+      "DOMQuad": {},
+      "fromQuad": {
+        "support_level": "untriaged"
+      },
+      "fromRect": {
+        "support_level": "untriaged"
+      },
+      "getBounds": {
+        "support_level": "untriaged"
+      },
+      "p1": {
+        "support_level": "untriaged"
+      },
+      "p2": {
+        "support_level": "untriaged"
+      },
+      "p3": {
+        "support_level": "untriaged"
+      },
+      "p4": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "DOMRect": {
     "members": {
       "DOMRect": {},
+      "fromRect": {
+        "support_level": "untriaged"
+      },
       "height": {
         "support_level": "untriaged"
       },
@@ -2828,12 +4080,26 @@
     },
     "support_level": "untriaged"
   },
+  "DOMRectList": {
+    "members": {
+      "item": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "DOMRectReadOnly": {
     "members": {
       "DOMRectReadOnly": {},
       "bottom": {
         "support_level": "untriaged"
       },
+      "fromRect": {
+        "support_level": "untriaged"
+      },
       "height": {
         "support_level": "untriaged"
       },
@@ -2907,6 +4173,9 @@
       "remove": {
         "support_level": "untriaged"
       },
+      "replace": {
+        "support_level": "untriaged"
+      },
       "supports": {
         "support_level": "untriaged"
       },
@@ -2920,6 +4189,7 @@
   },
   "DataTransfer": {
     "members": {
+      "DataTransfer": {},
       "clearData": {
         "support_level": "untriaged"
       },
@@ -3019,6 +4289,9 @@
     "comment": "http://www.w3.org/TR/webdatabase/#databasecallback",
     "dart_action": "experimental",
     "members": {
+      "callback": {
+        "support_level": "untriaged"
+      },
       "handleEvent": {}
     },
     "support_level": "deprecated"
@@ -3035,6 +4308,22 @@
     },
     "support_level": "deprecated"
   },
+  "DecodeErrorCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "DecodeSuccessCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "DedicatedWorkerContext": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html",
     "members": {
@@ -3051,9 +4340,15 @@
       "TEMPORARY": {
         "support_level": "untriaged"
       },
+      "close": {
+        "support_level": "untriaged"
+      },
       "onmessage": {
         "support_level": "untriaged"
       },
+      "onmessageerror": {
+        "support_level": "untriaged"
+      },
       "postMessage": {
         "support_level": "untriaged"
       },
@@ -3084,6 +4379,7 @@
   "DelayNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DelayNode",
     "members": {
+      "DelayNode": {},
       "delayTime": {}
     },
     "support_level": "experimental"
@@ -3116,6 +4412,62 @@
     },
     "support_level": "untriaged"
   },
+  "DeprecationReport": {
+    "members": {
+      "lineNumber": {
+        "support_level": "untriaged"
+      },
+      "message": {
+        "support_level": "untriaged"
+      },
+      "sourceFile": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "DetectedBarcode": {
+    "members": {
+      "DetectedBarcode": {},
+      "boundingBox": {
+        "support_level": "untriaged"
+      },
+      "cornerPoints": {
+        "support_level": "untriaged"
+      },
+      "rawValue": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "DetectedFace": {
+    "members": {
+      "DetectedFace": {},
+      "boundingBox": {
+        "support_level": "untriaged"
+      },
+      "landmarks": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "DetectedText": {
+    "members": {
+      "DetectedText": {},
+      "boundingBox": {
+        "support_level": "untriaged"
+      },
+      "cornerPoints": {
+        "support_level": "untriaged"
+      },
+      "rawValue": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "DeviceAcceleration": {
     "comment": "http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion",
     "members": {
@@ -3137,6 +4489,7 @@
   "DeviceMotionEvent": {
     "comment": "http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion",
     "members": {
+      "DeviceMotionEvent": {},
       "acceleration": {},
       "accelerationIncludingGravity": {},
       "initDeviceMotionEvent": {
@@ -3150,6 +4503,7 @@
   "DeviceOrientationEvent": {
     "comment": "http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion",
     "members": {
+      "DeviceOrientationEvent": {},
       "absolute": {},
       "alpha": {},
       "beta": {},
@@ -3237,10 +4591,14 @@
   "Document": {
     "comment": "http://dom.spec.whatwg.org/#interface-document",
     "members": {
+      "Document": {},
       "URL": {},
       "activeElement": {
         "support_level": "untriaged"
       },
+      "addressSpace": {
+        "support_level": "untriaged"
+      },
       "adoptNode": {},
       "anchors": {
         "dart_action": "suppress"
@@ -3367,6 +4725,9 @@
       "fullscreenEnabled": {
         "support_level": "untriaged"
       },
+      "getAnimations": {
+        "support_level": "untriaged"
+      },
       "getCSSCanvasContext": {
         "comment": "https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html",
         "support_level": "nonstandard"
@@ -3545,6 +4906,9 @@
         "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
         "support_level": "experimental"
       },
+      "onvisibilitychange": {
+        "support_level": "untriaged"
+      },
       "onvolumechange": {
         "support_level": "untriaged"
       },
@@ -3588,9 +4952,18 @@
       "querySelectorAll": {},
       "readyState": {},
       "referrer": {},
+      "registerElement": {
+        "support_level": "untriaged"
+      },
+      "registerElement2": {
+        "support_level": "untriaged"
+      },
       "rootElement": {
         "support_level": "untriaged"
       },
+      "rootScroller": {
+        "support_level": "untriaged"
+      },
       "scrollingElement": {
         "support_level": "untriaged"
       },
@@ -3712,6 +5085,38 @@
     },
     "support_level": "stable"
   },
+  "DocumentOrShadowRoot": {
+    "members": {
+      "activeElement": {
+        "support_level": "untriaged"
+      },
+      "elementFromPoint": {
+        "support_level": "untriaged"
+      },
+      "elementsFromPoint": {
+        "support_level": "untriaged"
+      },
+      "fullscreenElement": {
+        "support_level": "untriaged"
+      },
+      "getSelection": {
+        "support_level": "untriaged"
+      },
+      "pointerLockElement": {
+        "support_level": "untriaged"
+      },
+      "styleSheets": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "DocumentTimeline": {
+    "members": {
+      "DocumentTimeline": {}
+    },
+    "support_level": "untriaged"
+  },
   "DocumentType": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-412266927",
     "dart_action": "suppress",
@@ -3758,6 +5163,7 @@
   "DynamicsCompressorNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DynamicsCompressorNode",
     "members": {
+      "DynamicsCompressorNode": {},
       "attack": {},
       "knee": {},
       "ratio": {},
@@ -3782,6 +5188,10 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "EXTColorBufferHalfFloat": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "EXTDisjointTimerQuery": {
     "members": {
       "CURRENT_QUERY_EXT": {
@@ -3832,6 +5242,26 @@
     },
     "support_level": "untriaged"
   },
+  "EXTDisjointTimerQueryWebGL2": {
+    "members": {
+      "GPU_DISJOINT_EXT": {
+        "support_level": "untriaged"
+      },
+      "QUERY_COUNTER_BITS_EXT": {
+        "support_level": "untriaged"
+      },
+      "TIMESTAMP_EXT": {
+        "support_level": "untriaged"
+      },
+      "TIME_ELAPSED_EXT": {
+        "support_level": "untriaged"
+      },
+      "queryCounterEXT": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "EXTFragDepth": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/",
     "members": {},
@@ -3878,6 +5308,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "accessibleNode": {
+        "support_level": "untriaged"
+      },
       "after": {
         "support_level": "untriaged"
       },
@@ -3962,6 +5395,9 @@
       "getAttributeNS": {
         "support_level": "untriaged"
       },
+      "getAttributeNames": {
+        "support_level": "untriaged"
+      },
       "getAttributeNode": {
         "comment": "http://dom.spec.whatwg.org/#dom-element-getattributenode",
         "dart_action": "suppress",
@@ -3989,6 +5425,9 @@
       "hasAttribute": {},
       "hasAttributeNS": {},
       "hasAttributes": {},
+      "hasPointerCapture": {
+        "support_level": "untriaged"
+      },
       "hidden": {
         "comment": "http://www.whatwg.org/specs/web-apps/2007-10-26/multipage/section-elements.html#htmlelement",
         "dart_action": "stable",
@@ -3999,6 +5438,9 @@
         "dart_action": "stable",
         "support_level": "nonstandard"
       },
+      "inert": {
+        "support_level": "untriaged"
+      },
       "innerHTML": {
         "comment": "http://www.whatwg.org/specs/web-apps/2007-10-26/multipage/section-elements.html#htmlelement",
         "dart_action": "stable",
@@ -4009,6 +5451,9 @@
         "dart_action": "suppress",
         "support_level": "untriaged"
       },
+      "inputMode": {
+        "support_level": "untriaged"
+      },
       "insertAdjacentElement": {
         "support_level": "untriaged"
       },
@@ -4216,6 +5661,9 @@
       },
       "querySelector": {},
       "querySelectorAll": {},
+      "releasePointerCapture": {
+        "support_level": "untriaged"
+      },
       "remove": {
         "dart_action": "stable",
         "support_level": "nonstandard"
@@ -4269,6 +5717,9 @@
       "setDistributeScroll": {
         "support_level": "untriaged"
       },
+      "setPointerCapture": {
+        "support_level": "untriaged"
+      },
       "shadowRoot": {
         "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root",
         "support_level": "experimental"
@@ -4282,6 +5733,9 @@
         "support_level": "nonstandard"
       },
       "style": {},
+      "styleMap": {
+        "support_level": "untriaged"
+      },
       "tabIndex": {
         "comment": "http://www.whatwg.org/specs/web-apps/2007-10-26/multipage/section-elements.html#htmlelement",
         "dart_action": "stable",
@@ -4564,6 +6018,12 @@
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
+      "composed": {
+        "support_level": "untriaged"
+      },
+      "composedPath": {
+        "support_level": "untriaged"
+      },
       "currentTarget": {},
       "deepPath": {
         "support_level": "untriaged"
@@ -4679,12 +6139,38 @@
     },
     "support_level": "untriaged"
   },
+  "External": {
+    "members": {
+      "AddSearchProvider": {
+        "support_level": "untriaged"
+      },
+      "IsSearchProviderInstalled": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "FaceDetector": {
+    "members": {
+      "FaceDetector": {},
+      "detect": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "FederatedCredential": {
     "members": {
       "FederatedCredential": {},
       "federation": {
         "support_level": "untriaged"
       },
+      "iconURL": {
+        "support_level": "untriaged"
+      },
+      "name": {
+        "support_level": "untriaged"
+      },
       "protocol": {
         "support_level": "untriaged"
       },
@@ -4720,6 +6206,9 @@
       "isReload": {
         "support_level": "untriaged"
       },
+      "preloadResponse": {
+        "support_level": "untriaged"
+      },
       "request": {
         "support_level": "untriaged"
       },
@@ -4973,6 +6462,9 @@
   "FontFace": {
     "members": {
       "FontFace": {},
+      "display": {
+        "support_level": "untriaged"
+      },
       "family": {
         "support_level": "untriaged"
       },
@@ -5035,6 +6527,15 @@
       "match": {
         "support_level": "untriaged"
       },
+      "onloading": {
+        "support_level": "untriaged"
+      },
+      "onloadingdone": {
+        "support_level": "untriaged"
+      },
+      "onloadingerror": {
+        "support_level": "untriaged"
+      },
       "removeEventListener": {
         "support_level": "untriaged"
       },
@@ -5053,12 +6554,21 @@
   },
   "FontFaceSetLoadEvent": {
     "members": {
+      "FontFaceSetLoadEvent": {},
       "fontfaces": {
         "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
   },
+  "FontFaceSource": {
+    "members": {
+      "fonts": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "FontLoader": {
     "comment": "http://www.w3.org/TR/css3-fonts/#document-fontloader",
     "members": {
@@ -5077,6 +6587,21 @@
     },
     "support_level": "experimental"
   },
+  "ForeignFetchEvent": {
+    "members": {
+      "ForeignFetchEvent": {},
+      "origin": {
+        "support_level": "untriaged"
+      },
+      "request": {
+        "support_level": "untriaged"
+      },
+      "respondWith": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "FormData": {
     "comment": "http://www.w3.org/TR/XMLHttpRequest2/#interface-formdata",
     "members": {
@@ -5103,12 +6628,25 @@
     "support_level": "stable"
   },
   "FrameRequestCallback": {
-    "members": {},
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "FunctionStringCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "untriaged"
   },
   "GainNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#GainNode",
     "members": {
+      "GainNode": {},
       "gain": {}
     },
     "support_level": "experimental"
@@ -5121,11 +6659,20 @@
       "connected": {
         "support_level": "untriaged"
       },
+      "displayId": {
+        "support_level": "untriaged"
+      },
+      "hand": {
+        "support_level": "untriaged"
+      },
       "id": {},
       "index": {},
       "mapping": {
         "support_level": "untriaged"
       },
+      "pose": {
+        "support_level": "untriaged"
+      },
       "timestamp": {}
     },
     "support_level": "experimental"
@@ -5135,6 +6682,9 @@
       "pressed": {
         "support_level": "untriaged"
       },
+      "touched": {
+        "support_level": "untriaged"
+      },
       "value": {
         "support_level": "untriaged"
       }
@@ -5158,6 +6708,35 @@
     },
     "support_level": "experimental"
   },
+  "GamepadPose": {
+    "members": {
+      "angularAcceleration": {
+        "support_level": "untriaged"
+      },
+      "angularVelocity": {
+        "support_level": "untriaged"
+      },
+      "hasOrientation": {
+        "support_level": "untriaged"
+      },
+      "hasPosition": {
+        "support_level": "untriaged"
+      },
+      "linearAcceleration": {
+        "support_level": "untriaged"
+      },
+      "linearVelocity": {
+        "support_level": "untriaged"
+      },
+      "orientation": {
+        "support_level": "untriaged"
+      },
+      "position": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Geofencing": {
     "members": {
       "getRegisteredRegions": {
@@ -5215,9 +6794,15 @@
       "onabort": {
         "support_level": "untriaged"
       },
+      "onauxclick": {
+        "support_level": "untriaged"
+      },
       "onblur": {
         "support_level": "untriaged"
       },
+      "oncancel": {
+        "support_level": "untriaged"
+      },
       "oncanplay": {
         "support_level": "untriaged"
       },
@@ -5230,9 +6815,15 @@
       "onclick": {
         "support_level": "untriaged"
       },
+      "onclose": {
+        "support_level": "untriaged"
+      },
       "oncontextmenu": {
         "support_level": "untriaged"
       },
+      "oncuechange": {
+        "support_level": "untriaged"
+      },
       "ondblclick": {
         "support_level": "untriaged"
       },
@@ -5275,6 +6866,9 @@
       "onfocus": {
         "support_level": "untriaged"
       },
+      "ongotpointercapture": {
+        "support_level": "untriaged"
+      },
       "oninput": {
         "support_level": "untriaged"
       },
@@ -5299,6 +6893,12 @@
       "onloadedmetadata": {
         "support_level": "untriaged"
       },
+      "onloadstart": {
+        "support_level": "untriaged"
+      },
+      "onlostpointercapture": {
+        "support_level": "untriaged"
+      },
       "onmousedown": {
         "support_level": "untriaged"
       },
@@ -5332,6 +6932,33 @@
       "onplaying": {
         "support_level": "untriaged"
       },
+      "onpointercancel": {
+        "support_level": "untriaged"
+      },
+      "onpointerdown": {
+        "support_level": "untriaged"
+      },
+      "onpointerenter": {
+        "support_level": "untriaged"
+      },
+      "onpointerleave": {
+        "support_level": "untriaged"
+      },
+      "onpointermove": {
+        "support_level": "untriaged"
+      },
+      "onpointerout": {
+        "support_level": "untriaged"
+      },
+      "onpointerover": {
+        "support_level": "untriaged"
+      },
+      "onpointerup": {
+        "support_level": "untriaged"
+      },
+      "onprogress": {
+        "support_level": "untriaged"
+      },
       "onratechange": {
         "support_level": "untriaged"
       },
@@ -5365,6 +6992,9 @@
       "ontimeupdate": {
         "support_level": "untriaged"
       },
+      "ontoggle": {
+        "support_level": "untriaged"
+      },
       "ontouchcancel": {
         "support_level": "untriaged"
       },
@@ -5382,6 +7012,24 @@
       },
       "onwaiting": {
         "support_level": "untriaged"
+      },
+      "onwheel": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "Gyroscope": {
+    "members": {
+      "Gyroscope": {},
+      "x": {
+        "support_level": "untriaged"
+      },
+      "y": {
+        "support_level": "untriaged"
+      },
+      "z": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -5454,6 +7102,9 @@
       },
       "port": {},
       "protocol": {},
+      "referrerPolicy": {
+        "support_level": "untriaged"
+      },
       "referrerpolicy": {
         "support_level": "untriaged"
       },
@@ -5503,6 +7154,9 @@
       "HTMLAreaElement": {},
       "alt": {},
       "coords": {},
+      "download": {
+        "support_level": "untriaged"
+      },
       "hash": {},
       "host": {},
       "hostname": {},
@@ -5526,9 +7180,15 @@
       },
       "port": {},
       "protocol": {},
+      "referrerPolicy": {
+        "support_level": "untriaged"
+      },
       "referrerpolicy": {
         "support_level": "untriaged"
       },
+      "rel": {
+        "support_level": "untriaged"
+      },
       "search": {},
       "shape": {},
       "target": {},
@@ -5612,6 +7272,9 @@
       "onmessage": {},
       "onoffline": {},
       "ononline": {},
+      "onorientationchange": {
+        "support_level": "untriaged"
+      },
       "onpopstate": {},
       "onresize": {},
       "onscroll": {
@@ -5681,6 +7344,9 @@
         "support_level": "untriaged"
       },
       "toDataURL": {},
+      "transferControlToOffscreen": {
+        "support_level": "untriaged"
+      },
       "width": {}
     },
     "support_level": "stable"
@@ -5717,6 +7383,14 @@
     },
     "support_level": "stable"
   },
+  "HTMLDataElement": {
+    "members": {
+      "value": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "HTMLDataListElement": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-datalist-element",
     "members": {
@@ -5868,6 +7542,9 @@
       },
       "hidden": {},
       "id": {},
+      "inert": {
+        "support_level": "untriaged"
+      },
       "innerHTML": {},
       "innerText": {
         "dart_action": "suppress",
@@ -5876,6 +7553,9 @@
       "inputMethodContext": {
         "support_level": "untriaged"
       },
+      "inputMode": {
+        "support_level": "untriaged"
+      },
       "insertAdjacentElement": {
         "support_level": "nonstandard"
       },
@@ -5887,6 +7567,9 @@
       },
       "isContentEditable": {},
       "lang": {},
+      "nonce": {
+        "support_level": "untriaged"
+      },
       "onabort": {
         "support_level": "untriaged"
       },
@@ -6058,6 +7741,9 @@
       "onwaiting": {
         "support_level": "untriaged"
       },
+      "onwheel": {
+        "support_level": "untriaged"
+      },
       "outerHTML": {},
       "outerText": {
         "dart_action": "suppress",
@@ -6308,6 +7994,44 @@
     },
     "support_level": "stable"
   },
+  "HTMLHyperlinkElementUtils": {
+    "members": {
+      "hash": {
+        "support_level": "untriaged"
+      },
+      "host": {
+        "support_level": "untriaged"
+      },
+      "hostname": {
+        "support_level": "untriaged"
+      },
+      "href": {
+        "support_level": "untriaged"
+      },
+      "origin": {
+        "support_level": "untriaged"
+      },
+      "password": {
+        "support_level": "untriaged"
+      },
+      "pathname": {
+        "support_level": "untriaged"
+      },
+      "port": {
+        "support_level": "untriaged"
+      },
+      "protocol": {
+        "support_level": "untriaged"
+      },
+      "search": {
+        "support_level": "untriaged"
+      },
+      "username": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "HTMLIFrameElement": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#the-iframe-element",
     "members": {
@@ -6317,11 +8041,20 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "allow": {
+        "support_level": "untriaged"
+      },
       "allowFullscreen": {
         "support_level": "untriaged"
       },
+      "allowPaymentRequest": {
+        "support_level": "untriaged"
+      },
       "contentDocument": {},
       "contentWindow": {},
+      "csp": {
+        "support_level": "untriaged"
+      },
       "frameBorder": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLIFrameElement-partial",
         "dart_action": "suppress",
@@ -6352,6 +8085,9 @@
         "support_level": "deprecated"
       },
       "name": {},
+      "referrerPolicy": {
+        "support_level": "untriaged"
+      },
       "referrerpolicy": {
         "support_level": "untriaged"
       },
@@ -6378,6 +8114,9 @@
         "support_level": "deprecated"
       },
       "alt": {},
+      "async": {
+        "support_level": "untriaged"
+      },
       "border": {
         "dart_action": "suppress",
         "support_level": "deprecated"
@@ -6387,6 +8126,9 @@
       "currentSrc": {
         "support_level": "untriaged"
       },
+      "decode": {
+        "support_level": "untriaged"
+      },
       "height": {},
       "hspace": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLImageElement-partial",
@@ -6409,6 +8151,9 @@
       "name": {},
       "naturalHeight": {},
       "naturalWidth": {},
+      "referrerPolicy": {
+        "support_level": "untriaged"
+      },
       "referrerpolicy": {
         "support_level": "untriaged"
       },
@@ -6643,6 +8388,9 @@
         "support_level": "untriaged"
       },
       "media": {},
+      "referrerPolicy": {
+        "support_level": "untriaged"
+      },
       "rel": {},
       "relList": {
         "support_level": "untriaged"
@@ -6652,6 +8400,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "scope": {
+        "support_level": "untriaged"
+      },
       "sheet": {},
       "sizes": {},
       "target": {
@@ -6723,6 +8474,9 @@
       },
       "controller": {},
       "controls": {},
+      "controlsList": {
+        "support_level": "untriaged"
+      },
       "crossOrigin": {
         "support_level": "untriaged"
       },
@@ -6756,6 +8510,9 @@
       "oncanplaythrough": {},
       "ondurationchange": {},
       "onemptied": {},
+      "onencrypted": {
+        "support_level": "untriaged"
+      },
       "onended": {},
       "onkeyadded": {
         "support_level": "untriaged"
@@ -6814,6 +8571,9 @@
       "onwaiting": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart"
       },
+      "onwaitingforkey": {
+        "support_level": "untriaged"
+      },
       "onwebkitkeyadded": {
         "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded",
         "support_level": "experimental"
@@ -6837,6 +8597,9 @@
       "played": {},
       "preload": {},
       "readyState": {},
+      "remote": {
+        "support_level": "untriaged"
+      },
       "seekable": {},
       "seeking": {},
       "session": {
@@ -6852,6 +8615,9 @@
         "support_level": "untriaged"
       },
       "src": {},
+      "srcObject": {
+        "support_level": "untriaged"
+      },
       "startTime": {
         "support_level": "nonstandard"
       },
@@ -7040,6 +8806,9 @@
         "support_level": "deprecated"
       },
       "contentDocument": {},
+      "contentWindow": {
+        "support_level": "untriaged"
+      },
       "data": {},
       "declare": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLObjectElement-partial",
@@ -7247,6 +9016,9 @@
       "integrity": {
         "support_level": "untriaged"
       },
+      "noModule": {
+        "support_level": "untriaged"
+      },
       "nonce": {
         "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive",
         "support_level": "experimental"
@@ -7312,6 +9084,9 @@
   },
   "HTMLSlotElement": {
     "members": {
+      "assignedNodes": {
+        "support_level": "untriaged"
+      },
       "getAssignedNodes": {
         "support_level": "untriaged"
       },
@@ -7666,6 +9441,14 @@
     },
     "support_level": "stable"
   },
+  "HTMLTimeElement": {
+    "members": {
+      "dateTime": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "HTMLTitleElement": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#the-title-element",
     "members": {
@@ -7980,6 +9763,9 @@
       "bound_": {
         "support_level": "nonstandard"
       },
+      "includes": {
+        "support_level": "untriaged"
+      },
       "lower": {},
       "lowerBound": {},
       "lowerBound_": {
@@ -8017,6 +9803,9 @@
       "getAllKeys": {
         "support_level": "untriaged"
       },
+      "getKey": {
+        "support_level": "untriaged"
+      },
       "index": {},
       "indexNames": {},
       "keyPath": {},
@@ -8030,6 +9819,54 @@
     },
     "support_level": "stable"
   },
+  "IDBObservation": {
+    "members": {
+      "key": {
+        "support_level": "untriaged"
+      },
+      "type": {
+        "support_level": "untriaged"
+      },
+      "value": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "IDBObserver": {
+    "members": {
+      "IDBObserver": {},
+      "observe": {
+        "support_level": "untriaged"
+      },
+      "unobserve": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "IDBObserverCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "IDBObserverChanges": {
+    "members": {
+      "database": {
+        "support_level": "untriaged"
+      },
+      "records": {
+        "support_level": "untriaged"
+      },
+      "transaction": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "IDBOpenDBRequest": {
     "comment": "http://www.w3.org/TR/IndexedDB/#idl-def-IDBOpenDBRequest",
     "dart_action": "unstable",
@@ -8107,6 +9944,7 @@
   },
   "IIRFilterNode": {
     "members": {
+      "IIRFilterNode": {},
       "getFrequencyResponse": {
         "support_level": "untriaged"
       }
@@ -8125,7 +9963,11 @@
     "support_level": "untriaged"
   },
   "IdleRequestCallback": {
-    "members": {},
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "untriaged"
   },
   "ImageBitmap": {
@@ -8159,17 +10001,50 @@
       "canvas": {
         "support_level": "untriaged"
       },
+      "transferFromImageBitmap": {
+        "support_level": "untriaged"
+      },
       "transferImageBitmap": {
         "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
   },
+  "ImageCapture": {
+    "members": {
+      "ImageCapture": {},
+      "getPhotoCapabilities": {
+        "support_level": "untriaged"
+      },
+      "getPhotoSettings": {
+        "support_level": "untriaged"
+      },
+      "grabFrame": {
+        "support_level": "untriaged"
+      },
+      "setOptions": {
+        "support_level": "untriaged"
+      },
+      "takePhoto": {
+        "support_level": "untriaged"
+      },
+      "track": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ImageData": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata",
     "members": {
       "ImageData": {},
       "data": {},
+      "dataUnion": {
+        "support_level": "untriaged"
+      },
+      "getColorSettings": {
+        "support_level": "untriaged"
+      },
       "height": {},
       "width": {}
     },
@@ -8241,6 +10116,9 @@
   "InstallEvent": {
     "members": {
       "InstallEvent": {},
+      "registerForeignFetch": {
+        "support_level": "untriaged"
+      },
       "registerForeignFetchScopes": {
         "support_level": "untriaged"
       },
@@ -8293,6 +10171,7 @@
   },
   "IntersectionObserver": {
     "members": {
+      "IntersectionObserver": {},
       "disconnect": {
         "support_level": "untriaged"
       },
@@ -8317,14 +10196,28 @@
     },
     "support_level": "untriaged"
   },
+  "IntersectionObserverCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "IntersectionObserverEntry": {
     "members": {
       "boundingClientRect": {
         "support_level": "untriaged"
       },
+      "intersectionRatio": {
+        "support_level": "untriaged"
+      },
       "intersectionRect": {
         "support_level": "untriaged"
       },
+      "isIntersecting": {
+        "support_level": "untriaged"
+      },
       "rootBounds": {
         "support_level": "untriaged"
       },
@@ -8337,6 +10230,20 @@
     },
     "support_level": "untriaged"
   },
+  "InterventionReport": {
+    "members": {
+      "lineNumber": {
+        "support_level": "untriaged"
+      },
+      "message": {
+        "support_level": "untriaged"
+      },
+      "sourceFile": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Iterator": {
     "members": {
       "next": {
@@ -8413,6 +10320,9 @@
         "support_level": "untriaged"
       },
       "initKeyboardEvent": {},
+      "isComposing": {
+        "support_level": "untriaged"
+      },
       "key": {
         "support_level": "untriaged"
       },
@@ -8447,6 +10357,12 @@
     },
     "support_level": "untriaged"
   },
+  "KeyframeEffectReadOnly": {
+    "members": {
+      "KeyframeEffectReadOnly": {}
+    },
+    "support_level": "untriaged"
+  },
   "KeywordValue": {
     "members": {
       "KeywordValue": {},
@@ -8482,6 +10398,12 @@
     },
     "support_level": "untriaged"
   },
+  "LinearAccelerationSensor": {
+    "members": {
+      "LinearAccelerationSensor": {}
+    },
+    "support_level": "untriaged"
+  },
   "LocalCredential": {
     "members": {
       "LocalCredential": {},
@@ -8538,6 +10460,9 @@
         "comment": "http://url.spec.whatwg.org/#urlutils"
       },
       "toString": {},
+      "trustedHref": {
+        "support_level": "untriaged"
+      },
       "valueOf": {
         "dart_action": "experimental",
         "support_level": "nonstandard"
@@ -8553,6 +10478,9 @@
       "inputs": {},
       "onconnect": {},
       "ondisconnect": {},
+      "onstatechange": {
+        "support_level": "untriaged"
+      },
       "outputs": {},
       "removeEventListener": {},
       "sysexEnabled": {
@@ -8666,6 +10594,9 @@
       "manufacturer": {},
       "name": {},
       "ondisconnect": {},
+      "onstatechange": {
+        "support_level": "untriaged"
+      },
       "open": {
         "support_level": "untriaged"
       },
@@ -8682,6 +10613,21 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "Magnetometer": {
+    "members": {
+      "Magnetometer": {},
+      "x": {
+        "support_level": "untriaged"
+      },
+      "y": {
+        "support_level": "untriaged"
+      },
+      "z": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Matrix": {
     "members": {
       "Matrix": {},
@@ -8754,6 +10700,31 @@
     },
     "support_level": "untriaged"
   },
+  "MediaCapabilities": {
+    "members": {
+      "decodingInfo": {
+        "support_level": "untriaged"
+      },
+      "encodingInfo": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MediaCapabilitiesInfo": {
+    "members": {
+      "powerEfficient": {
+        "support_level": "untriaged"
+      },
+      "smooth": {
+        "support_level": "untriaged"
+      },
+      "supported": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "MediaController": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#mediacontroller",
     "members": {
@@ -8804,8 +10775,14 @@
       "enumerateDevices": {
         "support_level": "untriaged"
       },
+      "getSupportedConstraints": {
+        "support_level": "untriaged"
+      },
       "getUserMedia": {
         "support_level": "untriaged"
+      },
+      "ondevicechange": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -8813,6 +10790,7 @@
   "MediaElementAudioSourceNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaElementAudioSourceNode",
     "members": {
+      "MediaElementAudioSourceNode": {},
       "addEventListener": {
         "support_level": "untriaged"
       },
@@ -8876,7 +10854,10 @@
       },
       "MEDIA_ERR_NETWORK": {},
       "MEDIA_ERR_SRC_NOT_SUPPORTED": {},
-      "code": {}
+      "code": {},
+      "message": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "stable"
   },
@@ -8964,6 +10945,12 @@
       "onkeymessage": {
         "support_level": "untriaged"
       },
+      "onkeystatuseschange": {
+        "support_level": "untriaged"
+      },
+      "onmessage": {
+        "support_level": "untriaged"
+      },
       "onwebkitkeyadded": {},
       "onwebkitkeyerror": {},
       "onwebkitkeymessage": {},
@@ -8981,6 +10968,12 @@
   },
   "MediaKeyStatusMap": {
     "members": {
+      "get": {
+        "support_level": "untriaged"
+      },
+      "has": {
+        "support_level": "untriaged"
+      },
       "size": {
         "support_level": "untriaged"
       }
@@ -9009,6 +11002,9 @@
         "support_level": "untriaged"
       },
       "createSession": {},
+      "getStatusForPolicy": {
+        "support_level": "untriaged"
+      },
       "isTypeSupported": {
         "support_level": "untriaged"
       },
@@ -9019,6 +11015,15 @@
     },
     "support_level": "experimental"
   },
+  "MediaKeysPolicy": {
+    "members": {
+      "MediaKeysPolicy": {},
+      "minHdcpVersion": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "MediaList": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule",
     "dart_action": "unstable",
@@ -9040,6 +11045,9 @@
       "artist": {
         "support_level": "untriaged"
       },
+      "artwork": {
+        "support_level": "untriaged"
+      },
       "title": {
         "support_level": "untriaged"
       }
@@ -9095,12 +11103,24 @@
       "mimeType": {
         "support_level": "untriaged"
       },
+      "ondataavailable": {
+        "support_level": "untriaged"
+      },
       "onerror": {
         "support_level": "untriaged"
       },
       "onpause": {
         "support_level": "untriaged"
       },
+      "onresume": {
+        "support_level": "untriaged"
+      },
+      "onstart": {
+        "support_level": "untriaged"
+      },
+      "onstop": {
+        "support_level": "untriaged"
+      },
       "pause": {
         "support_level": "untriaged"
       },
@@ -9139,6 +11159,34 @@
       },
       "metadata": {
         "support_level": "untriaged"
+      },
+      "playbackState": {
+        "support_level": "untriaged"
+      },
+      "setActionHandler": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MediaSessionActionHandler": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MediaSettingsRange": {
+    "members": {
+      "max": {
+        "support_level": "untriaged"
+      },
+      "min": {
+        "support_level": "untriaged"
+      },
+      "step": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -9150,13 +11198,28 @@
       "activeSourceBuffers": {},
       "addEventListener": {},
       "addSourceBuffer": {},
+      "clearLiveSeekableRange": {
+        "support_level": "untriaged"
+      },
       "dispatchEvent": {},
       "duration": {},
       "endOfStream": {},
       "isTypeSupported": {},
+      "onsourceclose": {
+        "support_level": "untriaged"
+      },
+      "onsourceended": {
+        "support_level": "untriaged"
+      },
+      "onsourceopen": {
+        "support_level": "untriaged"
+      },
       "readyState": {},
       "removeEventListener": {},
       "removeSourceBuffer": {},
+      "setLiveSeekableRange": {
+        "support_level": "untriaged"
+      },
       "sourceBuffers": {}
     },
     "support_level": "experimental"
@@ -9185,8 +11248,14 @@
       "label": {
         "support_level": "nonstandard"
       },
+      "onactive": {
+        "support_level": "untriaged"
+      },
       "onaddtrack": {},
       "onended": {},
+      "oninactive": {
+        "support_level": "untriaged"
+      },
       "onremovetrack": {},
       "removeEventListener": {},
       "removeTrack": {},
@@ -9197,6 +11266,7 @@
   "MediaStreamAudioDestinationNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioDestinationNode",
     "members": {
+      "MediaStreamAudioDestinationNode": {},
       "stream": {}
     },
     "support_level": "experimental"
@@ -9204,6 +11274,7 @@
   "MediaStreamAudioSourceNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioSourceNode",
     "members": {
+      "MediaStreamAudioSourceNode": {},
       "addEventListener": {
         "support_level": "untriaged"
       },
@@ -9253,11 +11324,26 @@
     "comment": "http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack",
     "members": {
       "addEventListener": {},
+      "applyConstraints": {
+        "support_level": "untriaged"
+      },
       "clone": {
         "support_level": "untriaged"
       },
+      "contentHint": {
+        "support_level": "untriaged"
+      },
       "dispatchEvent": {},
       "enabled": {},
+      "getCapabilities": {
+        "support_level": "untriaged"
+      },
+      "getConstraints": {
+        "support_level": "untriaged"
+      },
+      "getSettings": {
+        "support_level": "untriaged"
+      },
       "getSources": {
         "support_level": "untriaged"
       },
@@ -9284,6 +11370,7 @@
   "MediaStreamTrackEvent": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/getusermedia.html",
     "members": {
+      "MediaStreamTrackEvent": {},
       "track": {}
     },
     "support_level": "experimental"
@@ -9301,6 +11388,10 @@
     },
     "support_level": "nonstandard"
   },
+  "MessageCallback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "MessageChannel": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html#message-channels",
     "dart_action": "unstable",
@@ -9343,6 +11434,9 @@
       "close": {},
       "dispatchEvent": {},
       "onmessage": {},
+      "onmessageerror": {
+        "support_level": "untriaged"
+      },
       "postMessage": {},
       "removeEventListener": {},
       "start": {}
@@ -9383,6 +11477,152 @@
     },
     "support_level": "nonstandard"
   },
+  "Mojo": {
+    "members": {
+      "RESULT_ABORTED": {
+        "support_level": "untriaged"
+      },
+      "RESULT_ALREADY_EXISTS": {
+        "support_level": "untriaged"
+      },
+      "RESULT_BUSY": {
+        "support_level": "untriaged"
+      },
+      "RESULT_CANCELLED": {
+        "support_level": "untriaged"
+      },
+      "RESULT_DATA_LOSS": {
+        "support_level": "untriaged"
+      },
+      "RESULT_DEADLINE_EXCEEDED": {
+        "support_level": "untriaged"
+      },
+      "RESULT_FAILED_PRECONDITION": {
+        "support_level": "untriaged"
+      },
+      "RESULT_INTERNAL": {
+        "support_level": "untriaged"
+      },
+      "RESULT_INVALID_ARGUMENT": {
+        "support_level": "untriaged"
+      },
+      "RESULT_NOT_FOUND": {
+        "support_level": "untriaged"
+      },
+      "RESULT_OK": {
+        "support_level": "untriaged"
+      },
+      "RESULT_OUT_OF_RANGE": {
+        "support_level": "untriaged"
+      },
+      "RESULT_PERMISSION_DENIED": {
+        "support_level": "untriaged"
+      },
+      "RESULT_RESOURCE_EXHAUSTED": {
+        "support_level": "untriaged"
+      },
+      "RESULT_SHOULD_WAIT": {
+        "support_level": "untriaged"
+      },
+      "RESULT_UNAVAILABLE": {
+        "support_level": "untriaged"
+      },
+      "RESULT_UNIMPLEMENTED": {
+        "support_level": "untriaged"
+      },
+      "RESULT_UNKNOWN": {
+        "support_level": "untriaged"
+      },
+      "bindInterface": {
+        "support_level": "untriaged"
+      },
+      "createDataPipe": {
+        "support_level": "untriaged"
+      },
+      "createMessagePipe": {
+        "support_level": "untriaged"
+      },
+      "createSharedBuffer": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MojoHandle": {
+    "members": {
+      "close": {
+        "support_level": "untriaged"
+      },
+      "discardData": {
+        "support_level": "untriaged"
+      },
+      "duplicateBufferHandle": {
+        "support_level": "untriaged"
+      },
+      "mapBuffer": {
+        "support_level": "untriaged"
+      },
+      "queryData": {
+        "support_level": "untriaged"
+      },
+      "readData": {
+        "support_level": "untriaged"
+      },
+      "readMessage": {
+        "support_level": "untriaged"
+      },
+      "watch": {
+        "support_level": "untriaged"
+      },
+      "writeData": {
+        "support_level": "untriaged"
+      },
+      "writeMessage": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MojoInterfaceInterceptor": {
+    "members": {
+      "MojoInterfaceInterceptor": {},
+      "oninterfacerequest": {
+        "support_level": "untriaged"
+      },
+      "start": {
+        "support_level": "untriaged"
+      },
+      "stop": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MojoInterfaceRequestEvent": {
+    "members": {
+      "MojoInterfaceRequestEvent": {},
+      "handle": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MojoWatchCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MojoWatcher": {
+    "members": {
+      "cancel": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "MouseEvent": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Events/#events-mouseevents",
     "members": {
@@ -9545,6 +11785,20 @@
     },
     "support_level": "deprecated"
   },
+  "NavigationPreloadManager": {
+    "members": {
+      "disable": {
+        "support_level": "untriaged"
+      },
+      "enable": {
+        "support_level": "untriaged"
+      },
+      "getState": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Navigator": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigator",
     "members": {
@@ -9560,6 +11814,15 @@
       "bluetooth": {
         "support_level": "untriaged"
       },
+      "budget": {
+        "support_level": "untriaged"
+      },
+      "cancelKeyboardLock": {
+        "support_level": "untriaged"
+      },
+      "clipboard": {
+        "support_level": "untriaged"
+      },
       "connection": {
         "support_level": "untriaged"
       },
@@ -9574,6 +11837,9 @@
       "dartEnabled": {
         "support_level": "untriaged"
       },
+      "deviceMemory": {
+        "support_level": "untriaged"
+      },
       "doNotTrack": {
         "comment": "http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom",
         "dart_action": "experimental",
@@ -9593,6 +11859,9 @@
       "getGamepads": {
         "support_level": "untriaged"
       },
+      "getInstalledRelatedApps": {
+        "support_level": "untriaged"
+      },
       "getMediaDevices": {
         "support_level": "untriaged"
       },
@@ -9600,9 +11869,15 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils",
         "support_level": "experimental"
       },
+      "getUserMedia": {
+        "support_level": "untriaged"
+      },
       "getVRDevices": {
         "support_level": "untriaged"
       },
+      "getVRDisplays": {
+        "support_level": "untriaged"
+      },
       "hardwareConcurrency": {
         "support_level": "untriaged"
       },
@@ -9622,9 +11897,15 @@
       "maxTouchPoints": {
         "support_level": "untriaged"
       },
+      "mediaCapabilities": {
+        "support_level": "untriaged"
+      },
       "mediaDevices": {
         "support_level": "untriaged"
       },
+      "mediaSession": {
+        "support_level": "untriaged"
+      },
       "mimeTypes": {
         "dart_action": "experimental",
         "support_level": "nonstandard"
@@ -9665,6 +11946,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorcontentutils",
         "dart_action": "unstable"
       },
+      "requestKeyboardLock": {
+        "support_level": "untriaged"
+      },
       "requestMIDIAccess": {
         "support_level": "untriaged"
       },
@@ -9680,6 +11964,9 @@
       "services": {
         "support_level": "untriaged"
       },
+      "share": {
+        "support_level": "untriaged"
+      },
       "storage": {
         "support_level": "untriaged"
       },
@@ -9703,6 +11990,12 @@
         "dart_action": "unstable",
         "support_level": "nonstandard"
       },
+      "vr": {
+        "support_level": "untriaged"
+      },
+      "webdriver": {
+        "support_level": "untriaged"
+      },
       "webkitBattery": {
         "comment": "https://dvcs.w3.org/hg/dap/raw-file/tip/battery/Overview.html",
         "support_level": "experimental"
@@ -9726,6 +12019,14 @@
     },
     "support_level": "stable"
   },
+  "NavigatorAutomationInformation": {
+    "members": {
+      "webdriver": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "NavigatorCPU": {
     "members": {
       "hardwareConcurrency": {
@@ -9734,6 +12035,22 @@
     },
     "support_level": "untriaged"
   },
+  "NavigatorConcurrentHardware": {
+    "members": {
+      "hardwareConcurrency": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "NavigatorCookies": {
+    "members": {
+      "cookieEnabled": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "NavigatorID": {
     "members": {
       "appCodeName": {
@@ -9823,12 +12140,24 @@
   },
   "NetworkInformation": {
     "members": {
+      "downlink": {
+        "support_level": "untriaged"
+      },
       "downlinkMax": {
         "support_level": "untriaged"
       },
+      "effectiveType": {
+        "support_level": "untriaged"
+      },
       "onchange": {
         "support_level": "untriaged"
       },
+      "ontypechange": {
+        "support_level": "untriaged"
+      },
+      "rtt": {
+        "support_level": "untriaged"
+      },
       "type": {
         "support_level": "untriaged"
       }
@@ -9865,8 +12194,14 @@
       "contains": {},
       "dispatchEvent": {},
       "firstChild": {},
+      "getRootNode": {
+        "support_level": "untriaged"
+      },
       "hasChildNodes": {},
       "insertBefore": {},
+      "isConnected": {
+        "support_level": "untriaged"
+      },
       "isDefaultNamespace": {},
       "isEqualNode": {},
       "isSameNode": {
@@ -10001,6 +12336,14 @@
     },
     "support_level": "untriaged"
   },
+  "NoncedElement": {
+    "members": {
+      "nonce": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Notation": {
     "comment": "http://dom.spec.whatwg.org/#notation",
     "dart_action": "suppress",
@@ -10019,6 +12362,9 @@
         "support_level": "untriaged"
       },
       "addEventListener": {},
+      "badge": {
+        "support_level": "untriaged"
+      },
       "body": {
         "support_level": "untriaged"
       },
@@ -10038,6 +12384,9 @@
       "icon": {
         "support_level": "untriaged"
       },
+      "image": {
+        "support_level": "untriaged"
+      },
       "lang": {
         "support_level": "untriaged"
       },
@@ -10096,6 +12445,9 @@
       },
       "notification": {
         "support_level": "untriaged"
+      },
+      "reply": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -10169,6 +12521,7 @@
   "OfflineAudioCompletionEvent": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioCompletionEvent-section",
     "members": {
+      "OfflineAudioCompletionEvent": {},
       "renderedBuffer": {}
     },
     "support_level": "experimental"
@@ -10252,9 +12605,15 @@
       "dispatchEvent": {
         "support_level": "untriaged"
       },
+      "length": {
+        "support_level": "untriaged"
+      },
       "listener": {
         "support_level": "untriaged"
       },
+      "oncomplete": {
+        "support_level": "untriaged"
+      },
       "removeEventListener": {
         "support_level": "untriaged"
       },
@@ -10279,15 +12638,220 @@
   "OffscreenCanvas": {
     "members": {
       "OffscreenCanvas": {},
+      "convertToBlob": {
+        "support_level": "untriaged"
+      },
+      "getContext": {
+        "support_level": "untriaged"
+      },
       "height": {
         "support_level": "untriaged"
       },
+      "transferToImageBitmap": {
+        "support_level": "untriaged"
+      },
       "width": {
         "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
   },
+  "OffscreenCanvasRenderingContext2D": {
+    "members": {
+      "arc": {
+        "support_level": "untriaged"
+      },
+      "arcTo": {
+        "support_level": "untriaged"
+      },
+      "beginPath": {
+        "support_level": "untriaged"
+      },
+      "bezierCurveTo": {
+        "support_level": "untriaged"
+      },
+      "canvas": {
+        "support_level": "untriaged"
+      },
+      "clearRect": {
+        "support_level": "untriaged"
+      },
+      "clip": {
+        "support_level": "untriaged"
+      },
+      "closePath": {
+        "support_level": "untriaged"
+      },
+      "commit": {
+        "support_level": "untriaged"
+      },
+      "createImageData": {
+        "support_level": "untriaged"
+      },
+      "createLinearGradient": {
+        "support_level": "untriaged"
+      },
+      "createPattern": {
+        "support_level": "untriaged"
+      },
+      "createRadialGradient": {
+        "support_level": "untriaged"
+      },
+      "direction": {
+        "support_level": "untriaged"
+      },
+      "drawImage": {
+        "support_level": "untriaged"
+      },
+      "ellipse": {
+        "support_level": "untriaged"
+      },
+      "fill": {
+        "support_level": "untriaged"
+      },
+      "fillRect": {
+        "support_level": "untriaged"
+      },
+      "fillStyle": {
+        "support_level": "untriaged"
+      },
+      "fillText": {
+        "support_level": "untriaged"
+      },
+      "filter": {
+        "support_level": "untriaged"
+      },
+      "font": {
+        "support_level": "untriaged"
+      },
+      "getImageData": {
+        "support_level": "untriaged"
+      },
+      "getLineDash": {
+        "support_level": "untriaged"
+      },
+      "globalAlpha": {
+        "support_level": "untriaged"
+      },
+      "globalCompositeOperation": {
+        "support_level": "untriaged"
+      },
+      "imageSmoothingEnabled": {
+        "support_level": "untriaged"
+      },
+      "imageSmoothingQuality": {
+        "support_level": "untriaged"
+      },
+      "isPointInPath": {
+        "support_level": "untriaged"
+      },
+      "isPointInStroke": {
+        "support_level": "untriaged"
+      },
+      "lineCap": {
+        "support_level": "untriaged"
+      },
+      "lineDashOffset": {
+        "support_level": "untriaged"
+      },
+      "lineJoin": {
+        "support_level": "untriaged"
+      },
+      "lineTo": {
+        "support_level": "untriaged"
+      },
+      "lineWidth": {
+        "support_level": "untriaged"
+      },
+      "measureText": {
+        "support_level": "untriaged"
+      },
+      "miterLimit": {
+        "support_level": "untriaged"
+      },
+      "moveTo": {
+        "support_level": "untriaged"
+      },
+      "putImageData": {
+        "support_level": "untriaged"
+      },
+      "quadraticCurveTo": {
+        "support_level": "untriaged"
+      },
+      "rect": {
+        "support_level": "untriaged"
+      },
+      "resetTransform": {
+        "support_level": "untriaged"
+      },
+      "restore": {
+        "support_level": "untriaged"
+      },
+      "rotate": {
+        "support_level": "untriaged"
+      },
+      "save": {
+        "support_level": "untriaged"
+      },
+      "scale": {
+        "support_level": "untriaged"
+      },
+      "setLineDash": {
+        "support_level": "untriaged"
+      },
+      "setTransform": {
+        "support_level": "untriaged"
+      },
+      "shadowBlur": {
+        "support_level": "untriaged"
+      },
+      "shadowColor": {
+        "support_level": "untriaged"
+      },
+      "shadowOffsetX": {
+        "support_level": "untriaged"
+      },
+      "shadowOffsetY": {
+        "support_level": "untriaged"
+      },
+      "stroke": {
+        "support_level": "untriaged"
+      },
+      "strokeRect": {
+        "support_level": "untriaged"
+      },
+      "strokeStyle": {
+        "support_level": "untriaged"
+      },
+      "strokeText": {
+        "support_level": "untriaged"
+      },
+      "textAlign": {
+        "support_level": "untriaged"
+      },
+      "textBaseline": {
+        "support_level": "untriaged"
+      },
+      "transform": {
+        "support_level": "untriaged"
+      },
+      "translate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "OrientationSensor": {
+    "members": {
+      "populateMatrix": {
+        "support_level": "untriaged"
+      },
+      "quaternion": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "OscillatorNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-OscillatorNode",
     "members": {
@@ -10297,6 +12861,7 @@
         "support_level": "deprecated"
       },
       "FINISHED_STATE": {},
+      "OscillatorNode": {},
       "PLAYING_STATE": {},
       "SAWTOOTH": {
         "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames",
@@ -10371,6 +12936,21 @@
     },
     "support_level": "experimental"
   },
+  "OverconstrainedError": {
+    "members": {
+      "OverconstrainedError": {},
+      "constraint": {
+        "support_level": "untriaged"
+      },
+      "message": {
+        "support_level": "untriaged"
+      },
+      "name": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "OverflowEvent": {
     "dart_action": "experimental",
     "members": {
@@ -10404,6 +12984,180 @@
     },
     "support_level": "experimental"
   },
+  "PaintRenderingContext2D": {
+    "members": {
+      "arc": {
+        "support_level": "untriaged"
+      },
+      "arcTo": {
+        "support_level": "untriaged"
+      },
+      "beginPath": {
+        "support_level": "untriaged"
+      },
+      "bezierCurveTo": {
+        "support_level": "untriaged"
+      },
+      "clearRect": {
+        "support_level": "untriaged"
+      },
+      "clip": {
+        "support_level": "untriaged"
+      },
+      "closePath": {
+        "support_level": "untriaged"
+      },
+      "createLinearGradient": {
+        "support_level": "untriaged"
+      },
+      "createPattern": {
+        "support_level": "untriaged"
+      },
+      "createRadialGradient": {
+        "support_level": "untriaged"
+      },
+      "currentTransform": {
+        "support_level": "untriaged"
+      },
+      "drawImage": {
+        "support_level": "untriaged"
+      },
+      "ellipse": {
+        "support_level": "untriaged"
+      },
+      "fill": {
+        "support_level": "untriaged"
+      },
+      "fillRect": {
+        "support_level": "untriaged"
+      },
+      "fillStyle": {
+        "support_level": "untriaged"
+      },
+      "filter": {
+        "support_level": "untriaged"
+      },
+      "getLineDash": {
+        "support_level": "untriaged"
+      },
+      "globalAlpha": {
+        "support_level": "untriaged"
+      },
+      "globalCompositeOperation": {
+        "support_level": "untriaged"
+      },
+      "imageSmoothingEnabled": {
+        "support_level": "untriaged"
+      },
+      "imageSmoothingQuality": {
+        "support_level": "untriaged"
+      },
+      "isPointInPath": {
+        "support_level": "untriaged"
+      },
+      "isPointInStroke": {
+        "support_level": "untriaged"
+      },
+      "lineCap": {
+        "support_level": "untriaged"
+      },
+      "lineDashOffset": {
+        "support_level": "untriaged"
+      },
+      "lineJoin": {
+        "support_level": "untriaged"
+      },
+      "lineTo": {
+        "support_level": "untriaged"
+      },
+      "lineWidth": {
+        "support_level": "untriaged"
+      },
+      "miterLimit": {
+        "support_level": "untriaged"
+      },
+      "moveTo": {
+        "support_level": "untriaged"
+      },
+      "quadraticCurveTo": {
+        "support_level": "untriaged"
+      },
+      "rect": {
+        "support_level": "untriaged"
+      },
+      "resetTransform": {
+        "support_level": "untriaged"
+      },
+      "restore": {
+        "support_level": "untriaged"
+      },
+      "rotate": {
+        "support_level": "untriaged"
+      },
+      "save": {
+        "support_level": "untriaged"
+      },
+      "scale": {
+        "support_level": "untriaged"
+      },
+      "setLineDash": {
+        "support_level": "untriaged"
+      },
+      "setTransform": {
+        "support_level": "untriaged"
+      },
+      "shadowBlur": {
+        "support_level": "untriaged"
+      },
+      "shadowColor": {
+        "support_level": "untriaged"
+      },
+      "shadowOffsetX": {
+        "support_level": "untriaged"
+      },
+      "shadowOffsetY": {
+        "support_level": "untriaged"
+      },
+      "stroke": {
+        "support_level": "untriaged"
+      },
+      "strokeRect": {
+        "support_level": "untriaged"
+      },
+      "strokeStyle": {
+        "support_level": "untriaged"
+      },
+      "transform": {
+        "support_level": "untriaged"
+      },
+      "translate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PaintSize": {
+    "members": {
+      "height": {
+        "support_level": "untriaged"
+      },
+      "width": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PaintWorkletGlobalScope": {
+    "members": {
+      "devicePixelRatio": {
+        "support_level": "untriaged"
+      },
+      "registerPaint": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PannerNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#PannerNode",
     "members": {
@@ -10432,6 +13186,7 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "PannerNode": {},
       "SOUNDFIELD": {
         "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames",
         "dart_action": "suppress",
@@ -10442,7 +13197,25 @@
       "coneOuterGain": {},
       "distanceModel": {},
       "maxDistance": {},
+      "orientationX": {
+        "support_level": "untriaged"
+      },
+      "orientationY": {
+        "support_level": "untriaged"
+      },
+      "orientationZ": {
+        "support_level": "untriaged"
+      },
       "panningModel": {},
+      "positionX": {
+        "support_level": "untriaged"
+      },
+      "positionY": {
+        "support_level": "untriaged"
+      },
+      "positionZ": {
+        "support_level": "untriaged"
+      },
       "refDistance": {},
       "rolloffFactor": {},
       "setOrientation": {},
@@ -10483,9 +13256,15 @@
       "formData": {
         "support_level": "untriaged"
       },
+      "iconURL": {
+        "support_level": "untriaged"
+      },
       "idName": {
         "support_level": "untriaged"
       },
+      "name": {
+        "support_level": "untriaged"
+      },
       "password": {
         "support_level": "untriaged"
       },
@@ -10546,6 +13325,185 @@
     },
     "support_level": "untriaged"
   },
+  "PaymentAddress": {
+    "members": {
+      "addressLine": {
+        "support_level": "untriaged"
+      },
+      "city": {
+        "support_level": "untriaged"
+      },
+      "country": {
+        "support_level": "untriaged"
+      },
+      "dependentLocality": {
+        "support_level": "untriaged"
+      },
+      "languageCode": {
+        "support_level": "untriaged"
+      },
+      "organization": {
+        "support_level": "untriaged"
+      },
+      "phone": {
+        "support_level": "untriaged"
+      },
+      "postalCode": {
+        "support_level": "untriaged"
+      },
+      "recipient": {
+        "support_level": "untriaged"
+      },
+      "region": {
+        "support_level": "untriaged"
+      },
+      "sortingCode": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PaymentInstruments": {
+    "members": {
+      "clear": {
+        "support_level": "untriaged"
+      },
+      "delete": {
+        "support_level": "untriaged"
+      },
+      "get": {
+        "support_level": "untriaged"
+      },
+      "has": {
+        "support_level": "untriaged"
+      },
+      "keys": {
+        "support_level": "untriaged"
+      },
+      "set": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PaymentManager": {
+    "members": {
+      "instruments": {
+        "support_level": "untriaged"
+      },
+      "userHint": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PaymentRequest": {
+    "members": {
+      "PaymentRequest": {},
+      "abort": {
+        "support_level": "untriaged"
+      },
+      "canMakePayment": {
+        "support_level": "untriaged"
+      },
+      "id": {
+        "support_level": "untriaged"
+      },
+      "onshippingaddresschange": {
+        "support_level": "untriaged"
+      },
+      "onshippingoptionchange": {
+        "support_level": "untriaged"
+      },
+      "shippingAddress": {
+        "support_level": "untriaged"
+      },
+      "shippingOption": {
+        "support_level": "untriaged"
+      },
+      "shippingType": {
+        "support_level": "untriaged"
+      },
+      "show": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PaymentRequestEvent": {
+    "members": {
+      "PaymentRequestEvent": {},
+      "instrumentKey": {
+        "support_level": "untriaged"
+      },
+      "methodData": {
+        "support_level": "untriaged"
+      },
+      "modifiers": {
+        "support_level": "untriaged"
+      },
+      "openWindow": {
+        "support_level": "untriaged"
+      },
+      "paymentRequestId": {
+        "support_level": "untriaged"
+      },
+      "paymentRequestOrigin": {
+        "support_level": "untriaged"
+      },
+      "respondWith": {
+        "support_level": "untriaged"
+      },
+      "topLevelOrigin": {
+        "support_level": "untriaged"
+      },
+      "total": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PaymentRequestUpdateEvent": {
+    "members": {
+      "PaymentRequestUpdateEvent": {},
+      "updateWith": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PaymentResponse": {
+    "members": {
+      "complete": {
+        "support_level": "untriaged"
+      },
+      "details": {
+        "support_level": "untriaged"
+      },
+      "methodName": {
+        "support_level": "untriaged"
+      },
+      "payerEmail": {
+        "support_level": "untriaged"
+      },
+      "payerName": {
+        "support_level": "untriaged"
+      },
+      "payerPhone": {
+        "support_level": "untriaged"
+      },
+      "requestId": {
+        "support_level": "untriaged"
+      },
+      "shippingAddress": {
+        "support_level": "untriaged"
+      },
+      "shippingOption": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Performance": {
     "comment": "http://www.w3.org/TR/navigation-timing/#performance",
     "members": {
@@ -10613,6 +13571,9 @@
       "setResourceTimingBufferSize": {
         "support_level": "untriaged"
       },
+      "timeOrigin": {
+        "support_level": "untriaged"
+      },
       "timing": {},
       "webkitClearResourceTimings": {
         "comment": "http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface",
@@ -10651,6 +13612,14 @@
     },
     "support_level": "experimental"
   },
+  "PerformanceLongTaskTiming": {
+    "members": {
+      "attribution": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PerformanceMark": {
     "comment": "http://www.w3.org/TR/user-timing/#performancemark",
     "members": {},
@@ -10674,8 +13643,44 @@
     },
     "support_level": "stable"
   },
+  "PerformanceNavigationTiming": {
+    "members": {
+      "domComplete": {
+        "support_level": "untriaged"
+      },
+      "domContentLoadedEventEnd": {
+        "support_level": "untriaged"
+      },
+      "domContentLoadedEventStart": {
+        "support_level": "untriaged"
+      },
+      "domInteractive": {
+        "support_level": "untriaged"
+      },
+      "loadEventEnd": {
+        "support_level": "untriaged"
+      },
+      "loadEventStart": {
+        "support_level": "untriaged"
+      },
+      "redirectCount": {
+        "support_level": "untriaged"
+      },
+      "type": {
+        "support_level": "untriaged"
+      },
+      "unloadEventEnd": {
+        "support_level": "untriaged"
+      },
+      "unloadEventStart": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PerformanceObserver": {
     "members": {
+      "PerformanceObserver": {},
       "disconnect": {
         "support_level": "untriaged"
       },
@@ -10685,6 +13690,14 @@
     },
     "support_level": "untriaged"
   },
+  "PerformanceObserverCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PerformanceObserverEntryList": {
     "members": {
       "getEntries": {
@@ -10699,6 +13712,10 @@
     },
     "support_level": "untriaged"
   },
+  "PerformancePaintTiming": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "PerformanceRenderTiming": {
     "members": {
       "sourceFrame": {
@@ -10712,10 +13729,19 @@
     "members": {
       "connectEnd": {},
       "connectStart": {},
+      "decodedBodySize": {
+        "support_level": "untriaged"
+      },
       "domainLookupEnd": {},
       "domainLookupStart": {},
+      "encodedBodySize": {
+        "support_level": "untriaged"
+      },
       "fetchStart": {},
       "initiatorType": {},
+      "nextHopProtocol": {
+        "support_level": "untriaged"
+      },
       "redirectEnd": {},
       "redirectStart": {},
       "requestStart": {
@@ -10731,12 +13757,32 @@
         "support_level": "nonstandard"
       },
       "secureConnectionStart": {},
+      "serverTiming": {
+        "support_level": "untriaged"
+      },
+      "transferSize": {
+        "support_level": "untriaged"
+      },
       "workerStart": {
         "support_level": "untriaged"
       }
     },
     "support_level": "experimental"
   },
+  "PerformanceServerTiming": {
+    "members": {
+      "description": {
+        "support_level": "untriaged"
+      },
+      "duration": {
+        "support_level": "untriaged"
+      },
+      "name": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PerformanceTiming": {
     "comment": "http://w3c-test.org/webperf/specs/NavigationTiming/#sec-navigation-timing-interface",
     "dart_action": "unstable",
@@ -10815,7 +13861,9 @@
     "support_level": "untriaged"
   },
   "PeriodicWave": {
-    "members": {},
+    "members": {
+      "PeriodicWave": {}
+    },
     "support_level": "untriaged"
   },
   "PermissionStatus": {
@@ -10858,6 +13906,23 @@
     },
     "support_level": "untriaged"
   },
+  "PhotoCapabilities": {
+    "members": {
+      "fillLightMode": {
+        "support_level": "untriaged"
+      },
+      "imageHeight": {
+        "support_level": "untriaged"
+      },
+      "imageWidth": {
+        "support_level": "untriaged"
+      },
+      "redEyeReduction": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Player": {
     "members": {
       "cancel": {
@@ -10940,6 +14005,9 @@
   "PointerEvent": {
     "members": {
       "PointerEvent": {},
+      "getCoalescedEvents": {
+        "support_level": "untriaged"
+      },
       "height": {
         "support_level": "untriaged"
       },
@@ -10955,12 +14023,18 @@
       "pressure": {
         "support_level": "untriaged"
       },
+      "tangentialPressure": {
+        "support_level": "untriaged"
+      },
       "tiltX": {
         "support_level": "untriaged"
       },
       "tiltY": {
         "support_level": "untriaged"
       },
+      "twist": {
+        "support_level": "untriaged"
+      },
       "width": {
         "support_level": "untriaged"
       }
@@ -10975,10 +14049,24 @@
     },
     "support_level": "stable"
   },
+  "Position": {
+    "members": {
+      "coords": {
+        "support_level": "untriaged"
+      },
+      "timestamp": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PositionCallback": {
     "comment": "http://www.w3.org/TR/geolocation-API/#position-callback",
     "dart_action": "unstable",
     "members": {
+      "callback": {
+        "support_level": "untriaged"
+      },
       "handleEvent": {}
     },
     "support_level": "stable"
@@ -11074,9 +14162,18 @@
       "id": {
         "support_level": "untriaged"
       },
+      "onclose": {
+        "support_level": "untriaged"
+      },
+      "onconnect": {
+        "support_level": "untriaged"
+      },
       "onmessage": {
         "support_level": "untriaged"
       },
+      "onterminate": {
+        "support_level": "untriaged"
+      },
       "send": {
         "support_level": "untriaged"
       },
@@ -11085,6 +14182,9 @@
       },
       "terminate": {
         "support_level": "untriaged"
+      },
+      "url": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -11110,8 +14210,22 @@
     },
     "support_level": "untriaged"
   },
+  "PresentationConnectionList": {
+    "members": {
+      "connections": {
+        "support_level": "untriaged"
+      },
+      "onconnectionavailable": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PresentationReceiver": {
     "members": {
+      "connectionList": {
+        "support_level": "untriaged"
+      },
       "getConnection": {
         "support_level": "untriaged"
       },
@@ -11127,6 +14241,9 @@
       "getAvailability": {
         "support_level": "untriaged"
       },
+      "onconnectionavailable": {
+        "support_level": "untriaged"
+      },
       "reconnect": {
         "support_level": "untriaged"
       },
@@ -11241,6 +14358,17 @@
     },
     "support_level": "untriaged"
   },
+  "PublicKeyCredential": {
+    "members": {
+      "rawId": {
+        "support_level": "untriaged"
+      },
+      "response": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "PushEvent": {
     "members": {
       "PushEvent": {},
@@ -11263,6 +14391,9 @@
       },
       "subscribe": {
         "support_level": "untriaged"
+      },
+      "supportedContentEncodings": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -11301,15 +14432,32 @@
       "endpoint": {
         "support_level": "untriaged"
       },
+      "expirationTime": {
+        "support_level": "untriaged"
+      },
       "getKey": {
         "support_level": "untriaged"
       },
+      "options": {
+        "support_level": "untriaged"
+      },
       "unsubscribe": {
         "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
   },
+  "PushSubscriptionOptions": {
+    "members": {
+      "applicationServerKey": {
+        "support_level": "untriaged"
+      },
+      "userVisibleOnly": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RGBColor": {
     "comment": "http://dev.w3.org/csswg/cssom/",
     "dart_action": "suppress",
@@ -11324,6 +14472,9 @@
     "members": {
       "expires": {
         "support_level": "untriaged"
+      },
+      "getFingerprints": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -11376,6 +14527,9 @@
       "negotiated": {
         "support_level": "untriaged"
       },
+      "onbufferedamountlow": {
+        "support_level": "untriaged"
+      },
       "onclose": {},
       "onerror": {},
       "onmessage": {},
@@ -11400,6 +14554,7 @@
   "RTCDataChannelEvent": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcdatachannelevent",
     "members": {
+      "RTCDataChannelEvent": {},
       "channel": {}
     },
     "support_level": "experimental"
@@ -11428,6 +14583,26 @@
     },
     "support_level": "experimental"
   },
+  "RTCLegacyStatsReport": {
+    "members": {
+      "id": {
+        "support_level": "untriaged"
+      },
+      "names": {
+        "support_level": "untriaged"
+      },
+      "stat": {
+        "support_level": "untriaged"
+      },
+      "timestamp": {
+        "support_level": "untriaged"
+      },
+      "type": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RTCPeerConnection": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCPeerConnection",
     "members": {
@@ -11435,6 +14610,9 @@
       "addEventListener": {},
       "addIceCandidate": {},
       "addStream": {},
+      "addTrack": {
+        "support_level": "untriaged"
+      },
       "close": {},
       "createAnswer": {},
       "createDTMFSender": {},
@@ -11445,7 +14623,13 @@
         "support_level": "untriaged"
       },
       "getLocalStreams": {},
+      "getReceivers": {
+        "support_level": "untriaged"
+      },
       "getRemoteStreams": {},
+      "getSenders": {
+        "support_level": "untriaged"
+      },
       "getStats": {},
       "getStreamById": {},
       "iceConnectionState": {},
@@ -11455,12 +14639,24 @@
       "ondatachannel": {},
       "onicecandidate": {},
       "oniceconnectionstatechange": {},
+      "onicegatheringstatechange": {
+        "support_level": "untriaged"
+      },
       "onnegotiationneeded": {},
       "onremovestream": {},
       "onsignalingstatechange": {},
+      "ontrack": {
+        "support_level": "untriaged"
+      },
       "remoteDescription": {},
       "removeEventListener": {},
       "removeStream": {},
+      "removeTrack": {
+        "support_level": "untriaged"
+      },
+      "setConfiguration": {
+        "support_level": "untriaged"
+      },
       "setLocalDescription": {},
       "setRemoteDescription": {},
       "signalingState": {},
@@ -11472,6 +14668,45 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "RTCPeerConnectionIceEvent": {
+    "members": {
+      "RTCPeerConnectionIceEvent": {},
+      "candidate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "RTCRtpContributingSource": {
+    "members": {
+      "source": {
+        "support_level": "untriaged"
+      },
+      "timestamp": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "RTCRtpReceiver": {
+    "members": {
+      "getContributingSources": {
+        "support_level": "untriaged"
+      },
+      "track": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "RTCRtpSender": {
+    "members": {
+      "track": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RTCSessionDescription": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCSessionDescription",
     "members": {
@@ -11518,6 +14753,21 @@
     },
     "support_level": "experimental"
   },
+  "RTCTrackEvent": {
+    "members": {
+      "RTCTrackEvent": {},
+      "receiver": {
+        "support_level": "untriaged"
+      },
+      "streams": {
+        "support_level": "untriaged"
+      },
+      "track": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RadioNodeList": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/#radionodelist",
     "members": {
@@ -11696,6 +14946,20 @@
     },
     "support_level": "deprecated"
   },
+  "RelatedApplication": {
+    "members": {
+      "id": {
+        "support_level": "untriaged"
+      },
+      "platform": {
+        "support_level": "untriaged"
+      },
+      "url": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RelatedEvent": {
     "members": {
       "RelatedEvent": {},
@@ -11705,6 +14969,84 @@
     },
     "support_level": "untriaged"
   },
+  "RelativeOrientationSensor": {
+    "members": {
+      "RelativeOrientationSensor": {}
+    },
+    "support_level": "untriaged"
+  },
+  "RemotePlayback": {
+    "members": {
+      "cancelWatchAvailability": {
+        "support_level": "untriaged"
+      },
+      "onconnect": {
+        "support_level": "untriaged"
+      },
+      "onconnecting": {
+        "support_level": "untriaged"
+      },
+      "ondisconnect": {
+        "support_level": "untriaged"
+      },
+      "prompt": {
+        "support_level": "untriaged"
+      },
+      "state": {
+        "support_level": "untriaged"
+      },
+      "watchAvailability": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "RemotePlaybackAvailabilityCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "Report": {
+    "members": {
+      "body": {
+        "support_level": "untriaged"
+      },
+      "type": {
+        "support_level": "untriaged"
+      },
+      "url": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ReportBody": {
+    "members": {},
+    "support_level": "untriaged"
+  },
+  "ReportingObserver": {
+    "members": {
+      "ReportingObserver": {},
+      "disconnect": {
+        "support_level": "untriaged"
+      },
+      "observe": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ReportingObserverCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Request": {
     "members": {
       "Request": {},
@@ -11717,6 +15059,9 @@
       "bodyUsed": {
         "support_level": "untriaged"
       },
+      "cache": {
+        "support_level": "untriaged"
+      },
       "clone": {
         "support_level": "untriaged"
       },
@@ -11747,6 +15092,9 @@
       "referrer": {
         "support_level": "untriaged"
       },
+      "referrerPolicy": {
+        "support_level": "untriaged"
+      },
       "text": {
         "support_level": "untriaged"
       },
@@ -11763,6 +15111,40 @@
     },
     "support_level": "stable"
   },
+  "ResizeObserver": {
+    "members": {
+      "ResizeObserver": {},
+      "disconnect": {
+        "support_level": "untriaged"
+      },
+      "observe": {
+        "support_level": "untriaged"
+      },
+      "unobserve": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ResizeObserverCallback": {
+    "members": {
+      "callback": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ResizeObserverEntry": {
+    "members": {
+      "contentRect": {
+        "support_level": "untriaged"
+      },
+      "target": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ResourceProgressEvent": {
     "comment": "https://chromiumcodereview.appspot.com/14773025/",
     "dart_action": "suppress",
@@ -12209,6 +15591,15 @@
       "hasExtension": {
         "comment": "http://www.w3.org/TR/SVG/types.html#InterfaceSVGTests"
       },
+      "onbegin": {
+        "support_level": "untriaged"
+      },
+      "onend": {
+        "support_level": "untriaged"
+      },
+      "onrepeat": {
+        "support_level": "untriaged"
+      },
       "requiredExtensions": {
         "comment": "http://www.w3.org/TR/SVG/types.html#InterfaceSVGTests"
       },
@@ -12466,6 +15857,9 @@
         "support_level": "untriaged"
       },
       "id": {},
+      "nonce": {
+        "support_level": "untriaged"
+      },
       "onabort": {
         "support_level": "untriaged"
       },
@@ -12637,6 +16031,9 @@
       "onwaiting": {
         "support_level": "untriaged"
       },
+      "onwheel": {
+        "support_level": "untriaged"
+      },
       "ownerSVGElement": {},
       "style": {
         "support_level": "untriaged"
@@ -13659,11 +17056,20 @@
   },
   "SVGGeometryElement": {
     "members": {
+      "getPointAtLength": {
+        "support_level": "untriaged"
+      },
+      "getTotalLength": {
+        "support_level": "untriaged"
+      },
       "isPointInFill": {
         "support_level": "untriaged"
       },
       "isPointInStroke": {
         "support_level": "untriaged"
+      },
+      "pathLength": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -13763,6 +17169,12 @@
     "dart_action": "unstable",
     "members": {
       "SVGImageElement": {},
+      "async": {
+        "support_level": "untriaged"
+      },
+      "decode": {
+        "support_level": "untriaged"
+      },
       "externalResourcesRequired": {
         "comment": "http://www.w3.org/TR/SVG/types.html#InterfaceSVGExternalResourcesRequired"
       },
@@ -15509,6 +18921,12 @@
       "isEnding": {
         "support_level": "untriaged"
       },
+      "positionX": {
+        "support_level": "untriaged"
+      },
+      "positionY": {
+        "support_level": "untriaged"
+      },
       "shouldPropagate": {
         "support_level": "untriaged"
       },
@@ -15531,6 +18949,21 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "ScrollTimeline": {
+    "members": {
+      "ScrollTimeline": {},
+      "orientation": {
+        "support_level": "untriaged"
+      },
+      "scrollSource": {
+        "support_level": "untriaged"
+      },
+      "timeRange": {
+        "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": {
@@ -15558,11 +18991,17 @@
       "SecurityPolicyViolationEvent": {},
       "blockedURI": {},
       "columnNumber": {},
+      "disposition": {
+        "support_level": "untriaged"
+      },
       "documentURI": {},
       "effectiveDirective": {},
       "lineNumber": {},
       "originalPolicy": {},
       "referrer": {},
+      "sample": {
+        "support_level": "untriaged"
+      },
       "sourceFile": {},
       "statusCode": {
         "support_level": "untriaged"
@@ -15609,6 +19048,9 @@
       },
       "rangeCount": {},
       "removeAllRanges": {},
+      "removeRange": {
+        "support_level": "untriaged"
+      },
       "selectAllChildren": {},
       "setBaseAndExtent": {
         "support_level": "nonstandard"
@@ -15623,6 +19065,44 @@
     },
     "support_level": "stable"
   },
+  "Sensor": {
+    "members": {
+      "activated": {
+        "support_level": "untriaged"
+      },
+      "hasReading": {
+        "support_level": "untriaged"
+      },
+      "onactivate": {
+        "support_level": "untriaged"
+      },
+      "onerror": {
+        "support_level": "untriaged"
+      },
+      "onreading": {
+        "support_level": "untriaged"
+      },
+      "start": {
+        "support_level": "untriaged"
+      },
+      "stop": {
+        "support_level": "untriaged"
+      },
+      "timestamp": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "SensorErrorEvent": {
+    "members": {
+      "SensorErrorEvent": {},
+      "error": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ServicePort": {
     "members": {
       "close": {
@@ -15718,6 +19198,9 @@
       "installing": {
         "support_level": "untriaged"
       },
+      "oncontrollerchange": {
+        "support_level": "untriaged"
+      },
       "onmessage": {
         "support_level": "untriaged"
       },
@@ -15753,9 +19236,54 @@
       "nativeCaches": {
         "support_level": "untriaged"
       },
+      "onabortpayment": {
+        "support_level": "untriaged"
+      },
+      "onactivate": {
+        "support_level": "untriaged"
+      },
+      "onbackgroundfetchabort": {
+        "support_level": "untriaged"
+      },
+      "onbackgroundfetchclick": {
+        "support_level": "untriaged"
+      },
+      "onbackgroundfetched": {
+        "support_level": "untriaged"
+      },
+      "onbackgroundfetchfail": {
+        "support_level": "untriaged"
+      },
+      "oncanmakepayment": {
+        "support_level": "untriaged"
+      },
+      "onfetch": {
+        "support_level": "untriaged"
+      },
+      "onforeignfetch": {
+        "support_level": "untriaged"
+      },
+      "oninstall": {
+        "support_level": "untriaged"
+      },
       "onmessage": {
         "support_level": "untriaged"
       },
+      "onnotificationclick": {
+        "support_level": "untriaged"
+      },
+      "onnotificationclose": {
+        "support_level": "untriaged"
+      },
+      "onpaymentrequest": {
+        "support_level": "untriaged"
+      },
+      "onpush": {
+        "support_level": "untriaged"
+      },
+      "onsync": {
+        "support_level": "untriaged"
+      },
       "ports": {
         "support_level": "untriaged"
       },
@@ -15797,6 +19325,9 @@
       "active": {
         "support_level": "untriaged"
       },
+      "backgroundFetch": {
+        "support_level": "untriaged"
+      },
       "geofencing": {
         "support_level": "untriaged"
       },
@@ -15806,6 +19337,15 @@
       "installing": {
         "support_level": "untriaged"
       },
+      "navigationPreload": {
+        "support_level": "untriaged"
+      },
+      "onupdatefound": {
+        "support_level": "untriaged"
+      },
+      "paymentManager": {
+        "support_level": "untriaged"
+      },
       "periodicSync": {
         "support_level": "untriaged"
       },
@@ -15846,6 +19386,9 @@
       "elementsFromPoint": {
         "support_level": "untriaged"
       },
+      "fullscreenElement": {
+        "support_level": "untriaged"
+      },
       "getElementById": {},
       "getElementsByClassName": {},
       "getElementsByTagName": {},
@@ -15855,9 +19398,15 @@
         "support_level": "untriaged"
       },
       "innerHTML": {},
+      "mode": {
+        "support_level": "untriaged"
+      },
       "olderShadowRoot": {
         "support_level": "untriaged"
       },
+      "pointerLockElement": {
+        "support_level": "untriaged"
+      },
       "resetStyleInheritance": {},
       "styleSheets": {
         "support_level": "untriaged"
@@ -15913,6 +19462,9 @@
       "TEMPORARY": {
         "support_level": "untriaged"
       },
+      "close": {
+        "support_level": "untriaged"
+      },
       "name": {
         "support_level": "untriaged"
       },
@@ -15989,6 +19541,9 @@
       "appendWindowStart": {
         "support_level": "untriaged"
       },
+      "audioTracks": {
+        "support_level": "untriaged"
+      },
       "buffered": {},
       "dispatchEvent": {
         "support_level": "untriaged"
@@ -15996,6 +19551,21 @@
       "mode": {
         "support_level": "untriaged"
       },
+      "onabort": {
+        "support_level": "untriaged"
+      },
+      "onerror": {
+        "support_level": "untriaged"
+      },
+      "onupdate": {
+        "support_level": "untriaged"
+      },
+      "onupdateend": {
+        "support_level": "untriaged"
+      },
+      "onupdatestart": {
+        "support_level": "untriaged"
+      },
       "remove": {
         "support_level": "untriaged"
       },
@@ -16008,6 +19578,9 @@
       },
       "updating": {
         "support_level": "untriaged"
+      },
+      "videoTracks": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "experimental"
@@ -16019,6 +19592,12 @@
       "dispatchEvent": {},
       "item": {},
       "length": {},
+      "onaddsourcebuffer": {
+        "support_level": "untriaged"
+      },
+      "onremovesourcebuffer": {
+        "support_level": "untriaged"
+      },
       "removeEventListener": {}
     },
     "support_level": "experimental"
@@ -16174,6 +19753,9 @@
         "support_level": "untriaged"
       },
       "getVoices": {},
+      "onvoiceschanged": {
+        "support_level": "untriaged"
+      },
       "pause": {},
       "paused": {},
       "pending": {},
@@ -16260,8 +19842,29 @@
     },
     "support_level": "untriaged"
   },
+  "StaticRange": {
+    "members": {
+      "collapsed": {
+        "support_level": "untriaged"
+      },
+      "endContainer": {
+        "support_level": "untriaged"
+      },
+      "endOffset": {
+        "support_level": "untriaged"
+      },
+      "startContainer": {
+        "support_level": "untriaged"
+      },
+      "startOffset": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "StereoPannerNode": {
     "members": {
+      "StereoPannerNode": {},
       "pan": {
         "support_level": "untriaged"
       }
@@ -16324,6 +19927,15 @@
   },
   "StorageManager": {
     "members": {
+      "estimate": {
+        "support_level": "untriaged"
+      },
+      "persist": {
+        "support_level": "untriaged"
+      },
+      "persisted": {
+        "support_level": "untriaged"
+      },
       "persistentPermission": {
         "support_level": "untriaged"
       },
@@ -16414,6 +20026,23 @@
     },
     "support_level": "untriaged"
   },
+  "StylePropertyMapReadonly": {
+    "members": {
+      "get": {
+        "support_level": "untriaged"
+      },
+      "getAll": {
+        "support_level": "untriaged"
+      },
+      "getProperties": {
+        "support_level": "untriaged"
+      },
+      "has": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "StyleSheet": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-stylesheet-interface",
     "members": {
@@ -16520,6 +20149,26 @@
     },
     "support_level": "untriaged"
   },
+  "TaskAttributionTiming": {
+    "members": {
+      "containerId": {
+        "support_level": "untriaged"
+      },
+      "containerName": {
+        "support_level": "untriaged"
+      },
+      "containerSrc": {
+        "support_level": "untriaged"
+      },
+      "containerType": {
+        "support_level": "untriaged"
+      },
+      "scriptURL": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Text": {
     "comment": "http://dom.spec.whatwg.org/#interface-text",
     "members": {
@@ -16562,6 +20211,15 @@
     },
     "support_level": "untriaged"
   },
+  "TextDetector": {
+    "members": {
+      "TextDetector": {},
+      "detect": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "TextEncoder": {
     "members": {
       "TextEncoder": {},
@@ -16734,6 +20392,9 @@
       "onchange": {
         "support_level": "untriaged"
       },
+      "onremovetrack": {
+        "support_level": "untriaged"
+      },
       "removeEventListener": {}
     },
     "support_level": "experimental"
@@ -17006,6 +20667,36 @@
     },
     "support_level": "stable"
   },
+  "TrustedHTML": {
+    "members": {
+      "escape": {
+        "support_level": "untriaged"
+      },
+      "unsafelyCreate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "TrustedScriptURL": {
+    "members": {
+      "unsafelyCreate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "TrustedURL": {
+    "members": {
+      "create": {
+        "support_level": "untriaged"
+      },
+      "unsafelyCreate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "UIEvent": {
     "comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-UIEvent",
     "members": {
@@ -17101,6 +20792,9 @@
       "search": {
         "support_level": "untriaged"
       },
+      "searchParams": {
+        "support_level": "untriaged"
+      },
       "toString": {
         "support_level": "untriaged"
       },
@@ -17130,6 +20824,9 @@
       },
       "set": {
         "support_level": "untriaged"
+      },
+      "sort": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -17387,6 +21084,7 @@
   },
   "USBInTransferResult": {
     "members": {
+      "USBInTransferResult": {},
       "data": {
         "support_level": "untriaged"
       },
@@ -17410,6 +21108,7 @@
   },
   "USBIsochronousInTransferPacket": {
     "members": {
+      "USBIsochronousInTransferPacket": {},
       "data": {
         "support_level": "untriaged"
       },
@@ -17421,6 +21120,7 @@
   },
   "USBIsochronousInTransferResult": {
     "members": {
+      "USBIsochronousInTransferResult": {},
       "data": {
         "support_level": "untriaged"
       },
@@ -17432,6 +21132,7 @@
   },
   "USBIsochronousOutTransferPacket": {
     "members": {
+      "USBIsochronousOutTransferPacket": {},
       "bytesWritten": {
         "support_level": "untriaged"
       },
@@ -17443,6 +21144,7 @@
   },
   "USBIsochronousOutTransferResult": {
     "members": {
+      "USBIsochronousOutTransferResult": {},
       "packets": {
         "support_level": "untriaged"
       }
@@ -17451,6 +21153,7 @@
   },
   "USBOutTransferResult": {
     "members": {
+      "USBOutTransferResult": {},
       "bytesWritten": {
         "support_level": "untriaged"
       },
@@ -17504,6 +21207,12 @@
       "cancel": {
         "support_level": "untriaged"
       },
+      "notifyLockAcquired": {
+        "support_level": "untriaged"
+      },
+      "notifyLockReleased": {
+        "support_level": "untriaged"
+      },
       "pull": {
         "support_level": "untriaged"
       },
@@ -17513,6 +21222,28 @@
     },
     "support_level": "untriaged"
   },
+  "VR": {
+    "members": {
+      "getDevices": {
+        "support_level": "untriaged"
+      },
+      "ondeviceconnect": {
+        "support_level": "untriaged"
+      },
+      "ondevicedisconnect": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRCoordinateSystem": {
+    "members": {
+      "getTransformTo": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "VRDevice": {
     "members": {
       "deviceId": {
@@ -17523,6 +21254,103 @@
       },
       "hardwareUnitId": {
         "support_level": "untriaged"
+      },
+      "isExternal": {
+        "support_level": "untriaged"
+      },
+      "requestSession": {
+        "support_level": "untriaged"
+      },
+      "supportsSession": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRDeviceEvent": {
+    "members": {
+      "VRDeviceEvent": {},
+      "device": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRDisplay": {
+    "members": {
+      "cancelAnimationFrame": {
+        "support_level": "untriaged"
+      },
+      "capabilities": {
+        "support_level": "untriaged"
+      },
+      "depthFar": {
+        "support_level": "untriaged"
+      },
+      "depthNear": {
+        "support_level": "untriaged"
+      },
+      "displayId": {
+        "support_level": "untriaged"
+      },
+      "displayName": {
+        "support_level": "untriaged"
+      },
+      "exitPresent": {
+        "support_level": "untriaged"
+      },
+      "getEyeParameters": {
+        "support_level": "untriaged"
+      },
+      "getFrameData": {
+        "support_level": "untriaged"
+      },
+      "getLayers": {
+        "support_level": "untriaged"
+      },
+      "isPresenting": {
+        "support_level": "untriaged"
+      },
+      "requestAnimationFrame": {
+        "support_level": "untriaged"
+      },
+      "requestPresent": {
+        "support_level": "untriaged"
+      },
+      "stageParameters": {
+        "support_level": "untriaged"
+      },
+      "submitFrame": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRDisplayCapabilities": {
+    "members": {
+      "canPresent": {
+        "support_level": "untriaged"
+      },
+      "hasExternalDisplay": {
+        "support_level": "untriaged"
+      },
+      "hasPosition": {
+        "support_level": "untriaged"
+      },
+      "maxLayers": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRDisplayEvent": {
+    "members": {
+      "VRDisplayEvent": {},
+      "display": {
+        "support_level": "untriaged"
+      },
+      "reason": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -17541,11 +21369,20 @@
       "minimumFieldOfView": {
         "support_level": "untriaged"
       },
+      "offset": {
+        "support_level": "untriaged"
+      },
       "recommendedFieldOfView": {
         "support_level": "untriaged"
       },
+      "renderHeight": {
+        "support_level": "untriaged"
+      },
       "renderRect": {
         "support_level": "untriaged"
+      },
+      "renderWidth": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -17568,6 +21405,61 @@
     },
     "support_level": "untriaged"
   },
+  "VRFrameData": {
+    "members": {
+      "VRFrameData": {},
+      "leftProjectionMatrix": {
+        "support_level": "untriaged"
+      },
+      "leftViewMatrix": {
+        "support_level": "untriaged"
+      },
+      "pose": {
+        "support_level": "untriaged"
+      },
+      "rightProjectionMatrix": {
+        "support_level": "untriaged"
+      },
+      "rightViewMatrix": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRFrameOfReference": {
+    "members": {
+      "bounds": {
+        "support_level": "untriaged"
+      },
+      "emulatedHeight": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRPose": {
+    "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"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "VRPositionState": {
     "members": {
       "angularAcceleration": {
@@ -17594,6 +21486,83 @@
     },
     "support_level": "untriaged"
   },
+  "VRSession": {
+    "members": {
+      "depthFar": {
+        "support_level": "untriaged"
+      },
+      "depthNear": {
+        "support_level": "untriaged"
+      },
+      "device": {
+        "support_level": "untriaged"
+      },
+      "end": {
+        "support_level": "untriaged"
+      },
+      "exclusive": {
+        "support_level": "untriaged"
+      },
+      "onblur": {
+        "support_level": "untriaged"
+      },
+      "onend": {
+        "support_level": "untriaged"
+      },
+      "onfocus": {
+        "support_level": "untriaged"
+      },
+      "onresetpose": {
+        "support_level": "untriaged"
+      },
+      "requestFrameOfReference": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRSessionEvent": {
+    "members": {
+      "VRSessionEvent": {},
+      "session": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRStageBounds": {
+    "members": {
+      "geometry": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRStageBoundsPoint": {
+    "members": {
+      "x": {
+        "support_level": "untriaged"
+      },
+      "z": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VRStageParameters": {
+    "members": {
+      "sittingToStandingTransform": {
+        "support_level": "untriaged"
+      },
+      "sizeX": {
+        "support_level": "untriaged"
+      },
+      "sizeZ": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "VTTCue": {
     "members": {
       "VTTCue": {},
@@ -17609,6 +21578,9 @@
       "position": {
         "support_level": "untriaged"
       },
+      "region": {
+        "support_level": "untriaged"
+      },
       "regionId": {
         "support_level": "untriaged"
       },
@@ -17636,6 +21608,9 @@
       "id": {
         "support_level": "untriaged"
       },
+      "lines": {
+        "support_level": "untriaged"
+      },
       "regionAnchorX": {
         "support_level": "untriaged"
       },
@@ -17726,6 +21701,9 @@
       },
       "selected": {
         "support_level": "untriaged"
+      },
+      "sourceBuffer": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -17742,15 +21720,53 @@
       "length": {
         "support_level": "untriaged"
       },
+      "onaddtrack": {
+        "support_level": "untriaged"
+      },
       "onchange": {
         "support_level": "untriaged"
       },
+      "onremovetrack": {
+        "support_level": "untriaged"
+      },
       "selectedIndex": {
         "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
   },
+  "VisualViewport": {
+    "members": {
+      "height": {
+        "support_level": "untriaged"
+      },
+      "offsetLeft": {
+        "support_level": "untriaged"
+      },
+      "offsetTop": {
+        "support_level": "untriaged"
+      },
+      "onresize": {
+        "support_level": "untriaged"
+      },
+      "onscroll": {
+        "support_level": "untriaged"
+      },
+      "pageLeft": {
+        "support_level": "untriaged"
+      },
+      "pageTop": {
+        "support_level": "untriaged"
+      },
+      "scale": {
+        "support_level": "untriaged"
+      },
+      "width": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "VoidCallback": {
     "comment": "http://www.w3.org/TR/file-system-api/#the-voidcallback-interface",
     "members": {
@@ -17761,6 +21777,7 @@
   "WaveShaperNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-WaveShaperNode",
     "members": {
+      "WaveShaperNode": {},
       "curve": {},
       "oversample": {}
     },
@@ -18730,6 +22747,9 @@
       "bufferData": {
         "support_level": "untriaged"
       },
+      "bufferData2": {
+        "support_level": "untriaged"
+      },
       "bufferDataTyped": {
         "support_level": "untriaged"
       },
@@ -18739,12 +22759,24 @@
       "bufferSubData": {
         "support_level": "untriaged"
       },
+      "bufferSubData2": {
+        "support_level": "untriaged"
+      },
       "bufferSubDataTyped": {
         "support_level": "untriaged"
       },
       "canvas": {
         "support_level": "untriaged"
       },
+      "canvasElement": {
+        "support_level": "untriaged"
+      },
+      "canvasOffscreen": {
+        "support_level": "untriaged"
+      },
+      "canvasUnion": {
+        "support_level": "untriaged"
+      },
       "checkFramebufferStatus": {
         "support_level": "untriaged"
       },
@@ -18778,21 +22810,42 @@
       "colorMask": {
         "support_level": "untriaged"
       },
+      "commit": {
+        "support_level": "untriaged"
+      },
       "compileShader": {
         "support_level": "untriaged"
       },
       "compressedTexImage2D": {
         "support_level": "untriaged"
       },
+      "compressedTexImage2D2": {
+        "support_level": "untriaged"
+      },
+      "compressedTexImage2D3": {
+        "support_level": "untriaged"
+      },
       "compressedTexImage3D": {
         "support_level": "untriaged"
       },
+      "compressedTexImage3D2": {
+        "support_level": "untriaged"
+      },
       "compressedTexSubImage2D": {
         "support_level": "untriaged"
       },
+      "compressedTexSubImage2D2": {
+        "support_level": "untriaged"
+      },
+      "compressedTexSubImage2D3": {
+        "support_level": "untriaged"
+      },
       "compressedTexSubImage3D": {
         "support_level": "untriaged"
       },
+      "compressedTexSubImage3D2": {
+        "support_level": "untriaged"
+      },
       "copyBufferSubData": {
         "support_level": "untriaged"
       },
@@ -19114,6 +23167,9 @@
       "linkProgram": {
         "support_level": "untriaged"
       },
+      "offscreenCanvas": {
+        "support_level": "untriaged"
+      },
       "pauseTransformFeedback": {
         "support_level": "untriaged"
       },
@@ -19210,6 +23266,9 @@
       "texSubImage2D": {
         "support_level": "untriaged"
       },
+      "texSubImage2D2": {
+        "support_level": "untriaged"
+      },
       "texSubImage2DCanvas": {
         "support_level": "untriaged"
       },
@@ -19234,12 +23293,18 @@
       "uniform1fv": {
         "support_level": "untriaged"
       },
+      "uniform1fv2": {
+        "support_level": "untriaged"
+      },
       "uniform1i": {
         "support_level": "untriaged"
       },
       "uniform1iv": {
         "support_level": "untriaged"
       },
+      "uniform1iv2": {
+        "support_level": "untriaged"
+      },
       "uniform1ui": {
         "support_level": "untriaged"
       },
@@ -19252,12 +23317,18 @@
       "uniform2fv": {
         "support_level": "untriaged"
       },
+      "uniform2fv2": {
+        "support_level": "untriaged"
+      },
       "uniform2i": {
         "support_level": "untriaged"
       },
       "uniform2iv": {
         "support_level": "untriaged"
       },
+      "uniform2iv2": {
+        "support_level": "untriaged"
+      },
       "uniform2ui": {
         "support_level": "untriaged"
       },
@@ -19270,12 +23341,18 @@
       "uniform3fv": {
         "support_level": "untriaged"
       },
+      "uniform3fv2": {
+        "support_level": "untriaged"
+      },
       "uniform3i": {
         "support_level": "untriaged"
       },
       "uniform3iv": {
         "support_level": "untriaged"
       },
+      "uniform3iv2": {
+        "support_level": "untriaged"
+      },
       "uniform3ui": {
         "support_level": "untriaged"
       },
@@ -19288,12 +23365,18 @@
       "uniform4fv": {
         "support_level": "untriaged"
       },
+      "uniform4fv2": {
+        "support_level": "untriaged"
+      },
       "uniform4i": {
         "support_level": "untriaged"
       },
       "uniform4iv": {
         "support_level": "untriaged"
       },
+      "uniform4iv2": {
+        "support_level": "untriaged"
+      },
       "uniform4ui": {
         "support_level": "untriaged"
       },
@@ -19306,6 +23389,9 @@
       "uniformMatrix2fv": {
         "support_level": "untriaged"
       },
+      "uniformMatrix2fv2": {
+        "support_level": "untriaged"
+      },
       "uniformMatrix2x3fv": {
         "support_level": "untriaged"
       },
@@ -19315,6 +23401,9 @@
       "uniformMatrix3fv": {
         "support_level": "untriaged"
       },
+      "uniformMatrix3fv2": {
+        "support_level": "untriaged"
+      },
       "uniformMatrix3x2fv": {
         "support_level": "untriaged"
       },
@@ -19324,6 +23413,9 @@
       "uniformMatrix4fv": {
         "support_level": "untriaged"
       },
+      "uniformMatrix4fv2": {
+        "support_level": "untriaged"
+      },
       "uniformMatrix4x2fv": {
         "support_level": "untriaged"
       },
@@ -19410,6 +23502,21 @@
     "members": {},
     "support_level": "stable"
   },
+  "WebGLCanvas": {
+    "members": {
+      "canvas": {
+        "support_level": "untriaged"
+      },
+      "offscreenCanvas": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "WebGLColorBufferFloat": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "WebGLCompressedTextureASTC": {
     "members": {
       "COMPRESSED_RGBA_ASTC_10x10_KHR": {
@@ -19508,6 +23615,41 @@
     },
     "support_level": "experimental"
   },
+  "WebGLCompressedTextureETC": {
+    "members": {
+      "COMPRESSED_R11_EAC": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_RG11_EAC": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_RGB8_ETC2": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_RGBA8_ETC2_EAC": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_SIGNED_R11_EAC": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_SIGNED_RG11_EAC": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_SRGB8_ETC2": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WebGLCompressedTextureETC1": {
     "members": {
       "COMPRESSED_RGB_ETC1_WEBGL": {
@@ -19538,6 +23680,23 @@
     },
     "support_level": "experimental"
   },
+  "WebGLCompressedTextureS3TCsRGB": {
+    "members": {
+      "COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_SRGB_S3TC_DXT1_EXT": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WebGLContextAttributes": {
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#5.2",
     "dart_action": "unstable",
@@ -19636,6 +23795,14 @@
     "members": {},
     "support_level": "stable"
   },
+  "WebGLGetBufferSubDataAsync": {
+    "members": {
+      "getBufferSubDataAsync": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WebGLLoseContext": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/WEBGL_lose_context/",
     "members": {
@@ -19991,12 +24158,24 @@
       "canvas": {
         "support_level": "untriaged"
       },
+      "canvasElement": {
+        "support_level": "untriaged"
+      },
+      "canvasOffscreen": {
+        "support_level": "untriaged"
+      },
+      "canvasUnion": {
+        "support_level": "untriaged"
+      },
       "checkFramebufferStatus": {},
       "clear": {},
       "clearColor": {},
       "clearDepth": {},
       "clearStencil": {},
       "colorMask": {},
+      "commit": {
+        "support_level": "untriaged"
+      },
       "compileShader": {},
       "compressedTexImage2D": {},
       "compressedTexSubImage2D": {},
@@ -20067,6 +24246,9 @@
       "isTexture": {},
       "lineWidth": {},
       "linkProgram": {},
+      "offscreenCanvas": {
+        "support_level": "untriaged"
+      },
       "pixelStorei": {},
       "polygonOffset": {},
       "readPixels": {},
@@ -21507,7 +25689,20 @@
   },
   "WebGLTexture": {
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#5.9",
-    "members": {},
+    "members": {
+      "lastUploadedVideoFrameWasSkipped": {
+        "support_level": "untriaged"
+      },
+      "lastUploadedVideoHeight": {
+        "support_level": "untriaged"
+      },
+      "lastUploadedVideoTimestamp": {
+        "support_level": "untriaged"
+      },
+      "lastUploadedVideoWidth": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "stable"
   },
   "WebGLTimerQueryEXT": {
@@ -21807,8 +26002,14 @@
       },
       "addEventListener": {},
       "alert": {},
+      "animationWorklet": {
+        "support_level": "untriaged"
+      },
       "applicationCache": {},
       "atob": {},
+      "audioWorklet": {
+        "support_level": "untriaged"
+      },
       "blur": {
         "dart_action": "suppress",
         "support_level": "deprecated"
@@ -21835,6 +26036,9 @@
       "closed": {},
       "confirm": {},
       "console": {},
+      "cookieStore": {
+        "support_level": "untriaged"
+      },
       "createImageBitmap": {
         "support_level": "untriaged"
       },
@@ -21842,6 +26046,9 @@
         "comment": "http://www.w3.org/TR/WebCryptoAPI/",
         "support_level": "experimental"
       },
+      "customElements": {
+        "support_level": "untriaged"
+      },
       "defaultStatus": {
         "support_level": "nonstandard"
       },
@@ -21858,6 +26065,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "external": {
+        "support_level": "untriaged"
+      },
       "fetch": {
         "support_level": "untriaged"
       },
@@ -21871,6 +26081,9 @@
       "frameElement": {},
       "frames": {},
       "getComputedStyle": {},
+      "getComputedStyleMap": {
+        "support_level": "untriaged"
+      },
       "getMatchedCSSRules": {
         "support_level": "nonstandard"
       },
@@ -21909,6 +26122,12 @@
       "onanimationstart": {
         "support_level": "untriaged"
       },
+      "onappinstalled": {
+        "support_level": "untriaged"
+      },
+      "onbeforeinstallprompt": {
+        "support_level": "untriaged"
+      },
       "onbeforeunload": {},
       "onblur": {},
       "oncanplay": {},
@@ -21928,6 +26147,9 @@
         "comment": "http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion",
         "support_level": "experimental"
       },
+      "ondeviceorientationabsolute": {
+        "support_level": "untriaged"
+      },
       "ondoubleclick": {
         "support_level": "untriaged"
       },
@@ -21970,6 +26192,9 @@
       "onmousewheel": {},
       "onoffline": {},
       "ononline": {},
+      "onorientationchange": {
+        "support_level": "untriaged"
+      },
       "onpagehide": {},
       "onpageshow": {},
       "onpause": {},
@@ -22050,6 +26275,9 @@
       "orientation": {
         "support_level": "untriaged"
       },
+      "origin": {
+        "support_level": "untriaged"
+      },
       "outerHeight": {},
       "outerWidth": {},
       "pagePopupController": {
@@ -22116,6 +26344,9 @@
       "toString": {},
       "toolbar": {},
       "top": {},
+      "visualViewport": {
+        "support_level": "untriaged"
+      },
       "webkitCancelAnimationFrame": {
         "support_level": "experimental"
       },
@@ -22190,30 +26421,54 @@
   },
   "WindowEventHandlers": {
     "members": {
+      "onafterprint": {
+        "support_level": "untriaged"
+      },
+      "onbeforeprint": {
+        "support_level": "untriaged"
+      },
       "onbeforeunload": {
         "support_level": "untriaged"
       },
       "onhashchange": {
         "support_level": "untriaged"
       },
+      "onlanguagechange": {
+        "support_level": "untriaged"
+      },
       "onmessage": {
         "support_level": "untriaged"
       },
+      "onmessageerror": {
+        "support_level": "untriaged"
+      },
       "onoffline": {
         "support_level": "untriaged"
       },
       "ononline": {
         "support_level": "untriaged"
       },
+      "onpagehide": {
+        "support_level": "untriaged"
+      },
+      "onpageshow": {
+        "support_level": "untriaged"
+      },
       "onpopstate": {
         "support_level": "untriaged"
       },
+      "onrejectionhandled": {
+        "support_level": "untriaged"
+      },
       "onresize": {
         "support_level": "untriaged"
       },
       "onstorage": {
         "support_level": "untriaged"
       },
+      "onunhandledrejection": {
+        "support_level": "untriaged"
+      },
       "onunload": {
         "support_level": "untriaged"
       }
@@ -22444,6 +26699,9 @@
       "addEventListener": {
         "support_level": "untriaged"
       },
+      "addressSpace": {
+        "support_level": "untriaged"
+      },
       "atob": {
         "support_level": "untriaged"
       },
@@ -22483,6 +26741,9 @@
       "indexedDB": {
         "support_level": "untriaged"
       },
+      "isSecureContext": {
+        "support_level": "untriaged"
+      },
       "location": {
         "support_level": "untriaged"
       },
@@ -22492,12 +26753,21 @@
       "onerror": {
         "support_level": "untriaged"
       },
+      "onrejectionhandled": {
+        "support_level": "untriaged"
+      },
+      "onunhandledrejection": {
+        "support_level": "untriaged"
+      },
       "openDatabase": {
         "support_level": "untriaged"
       },
       "openDatabaseSync": {
         "support_level": "untriaged"
       },
+      "origin": {
+        "support_level": "untriaged"
+      },
       "performance": {
         "support_level": "untriaged"
       },
@@ -22627,9 +26897,15 @@
       "now": {
         "support_level": "untriaged"
       },
+      "onresourcetimingbufferfull": {
+        "support_level": "untriaged"
+      },
       "setResourceTimingBufferSize": {
         "support_level": "untriaged"
       },
+      "timeOrigin": {
+        "support_level": "untriaged"
+      },
       "webkitClearResourceTimings": {
         "support_level": "untriaged"
       },
@@ -22647,6 +26923,21 @@
     },
     "support_level": "untriaged"
   },
+  "WorkletAnimation": {
+    "members": {
+      "WorkletAnimation": {},
+      "cancel": {
+        "support_level": "untriaged"
+      },
+      "play": {
+        "support_level": "untriaged"
+      },
+      "playState": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WorkletGlobalScope": {
     "members": {},
     "support_level": "untriaged"
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index e7e1549..570ccc5 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -20,6 +20,9 @@
   [Custom] Element createElement(DOMString localName, DOMString typeExtension);
   [Custom] Element createElementNS(DOMString namespaceURI, DOMString qualifiedName);
   [Custom] Element createElementNS(DOMString namespaceURI, DOMString qualifiedName, DOMString typeExtension);
+  [DartName=registerElement2] CustomElementConstructor registerElement(DOMString type, optional ElementRegistrationOptions options);
+  [DartSuppress] readonly attribute (HTMLScriptElement or SVGScriptElement)? currentScript;
+  readonly attribute HTMLScriptElement? currentScript;
 };
 
 [DartSupplemental]
@@ -82,8 +85,8 @@
 };
 
 interface HTMLCanvasElement {
-  [DartSuppress] DOMString toDataURL([TreatNullAs=NullString, TreatUndefinedAs=NullString,Default=Undefined] DOMString type);
-  [Custom] DOMString toDataURL([TreatNullAs=NullString, TreatUndefinedAs=NullString,Default=Undefined] DOMString type, optional float quality);
+  [DartSuppress] DOMString toDataURL([TreatNullAs=NullString, Default=Undefined] DOMString type);
+  [Custom] DOMString toDataURL([TreatNullAs=NullString, Default=Undefined] DOMString type, optional float quality);
 };
 
 [DartSupplemental]
@@ -124,6 +127,7 @@
   attribute EventListener ontimeupdate;
   attribute EventListener onvolumechange;
   attribute EventListener onwaiting;
+  attribute EventListener onwheel;
 };
 
 [DartSupplemental]
@@ -131,10 +135,108 @@
   [DartSuppress, RaisesException] void addIceCandidate(RTCIceCandidate candidate);
 };
 
+// See implementation in tools/dom/templates for canvas and offscreenCanvas.
+interface WebGLCanvas {
+};
+
+[DartSupplemental]
+interface WebGL2RenderingContext {
+    [DartSuppress] readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
+    readonly attribute WebGLCanvas canvas;
+};
+
+[DartSupplemental]
+interface WebGLRenderingContext {
+    [DartSuppress] readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
+    readonly attribute HTMLCanvasElement canvas;
+};
+
 [DartSupplemental]
 interface WebGL2RenderingContextBase {
+    [DartSuppress] readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
+    readonly attribute WebGLCanvas canvas;
+    [DartName=bufferData2] void bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, GLuint srcOffset, optional GLuint length = 0);
+    [DartName=bufferSubData2] void bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData, GLuint srcOffset, optional GLuint length = 0);
+    [DartName=compressedTexImage2D2] void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat,
+                              GLsizei width, GLsizei height, GLint border,
+                              [AllowShared] ArrayBufferView data, GLuint srcOffset,
+                              optional GLuint srcLengthOverride = 0);
+    [DartName=compressedTexImage2D3] void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat,
+                              GLsizei width, GLsizei height, GLint border,
+                              GLsizei imageSize, GLintptr offset);
+    [DartName=compressedTexSubImage2D2] void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+                                 GLsizei width, GLsizei height, GLenum format,
+                                 [AllowShared] ArrayBufferView data, GLuint srcOffset,
+                                 optional GLuint srcLengthOverride = 0);
+    [DartName=compressedTexSubImage2D3] void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+                                 GLsizei width, GLsizei height, GLenum format,
+                                 GLsizei imageSize, GLintptr offset);
+    [DartName=compressedTexImage3D2] void compressedTexImage3D(GLenum target, GLint level, GLenum internalformat,
+                              GLsizei width, GLsizei height, GLsizei depth, GLint border,
+                              GLsizei imageSize, GLintptr offset);
+    [DartName=compressedTexSubImage3D2] void compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
+                                 GLsizei width, GLsizei height, GLsizei depth, GLenum format,
+                                 GLsizei imageSize, GLintptr offset);
+    [DartName=readPixels2] void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, ArrayBufferView dstData, GLintptr offset);
     [DartName=readPixels2] void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLintptr offset);
     [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLintptr offset);
+    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, ImageData data);
+    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, HTMLImageElement image);
+    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, HTMLCanvasElement canvas);
+    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, HTMLVideoElement video);
+    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, ImageBitmap bitmap);
+    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset);
+    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLintptr offset);
+    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, ImageData data);
+    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, HTMLImageElement image);
+    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, HTMLCanvasElement canvas);
+    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, HTMLVideoElement video);
+    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, ImageBitmap bitmap);
+    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset);
+    [DartName=uniform1fv2] void uniform1fv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Float32Array v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform1fv2] void uniform1fv(WebGLUniformLocation? location, sequence<GLfloat> v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform2fv2] void uniform2fv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Float32Array v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform2fv2] void uniform2fv(WebGLUniformLocation? location, sequence<GLfloat> v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform3fv2] void uniform3fv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Float32Array v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform3fv2] void uniform3fv(WebGLUniformLocation? location, sequence<GLfloat> v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform4fv2] void uniform4fv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Float32Array v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform4fv2] void uniform4fv(WebGLUniformLocation? location, sequence<GLfloat> v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform1iv2] void uniform1iv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Int32Array v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform1iv2] void uniform1iv(WebGLUniformLocation? location, sequence<GLint> v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform2iv2] void uniform2iv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Int32Array v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform2iv2] void uniform2iv(WebGLUniformLocation? location, sequence<GLint> v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform3iv2] void uniform3iv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Int32Array v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform3iv2] void uniform3iv(WebGLUniformLocation? location, sequence<GLint> v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform4iv2] void uniform4iv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Int32Array v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniform4iv2] void uniform4iv(WebGLUniformLocation? location, sequence<GLint> v,
+                    GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniformMatrix2fv2] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, [AllowShared] Float32Array array,
+                          GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniformMatrix2fv2] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, sequence<GLfloat> array,
+                          GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniformMatrix3fv2] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, [AllowShared] Float32Array array,
+                          GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniformMatrix3fv2] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, sequence<GLfloat> array,
+                          GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniformMatrix4fv2] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, [AllowShared] Float32Array array,
+                          GLuint srcOffset, optional GLuint srcLength = 0);
+    [DartName=uniformMatrix4fv2] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, sequence<GLfloat> array,
+                          GLuint srcOffset, optional GLuint srcLength = 0);
 };
 
 [DartSupplemental]
@@ -158,7 +260,7 @@
 
 [DartSupplemental]
 interface HTMLMediaElement {
-  DOMString canPlayType([Default=Undefined] optional DOMString type, [Default=Undefined, TreatNullAs=NullString, TreatUndefinedAs=NullString, DartForceOptional] optional DOMString keySystem);
+  DOMString canPlayType([Default=Undefined] optional DOMString type, [Default=Undefined, TreatNullAs=NullString, DartForceOptional] optional DOMString keySystem);
 };
 
 [DartSupplemental]
@@ -208,17 +310,16 @@
   [DartStrictTypeChecking, Custom] attribute float value;
 };
 
-// Keep it in to generate Dart code, C++ implementation is filterd out in generator.
-[Callback]
-interface MutationCallback {
-  [Custom] boolean handleEvent(MutationRecordArray mutations, MutationObserver observer);
+[DartSupplemental]
+interface MediaDevices {
+  [DartSuppress] Promise<MediaStream> getUserMedia(optional MediaStreamConstraints constraints);
 };
 
-[DartSupplemental,
-  CustomConstructor,
-  // Provide missing constructor signature.
-  Constructor(MutationCallback callback)]
-interface MutationObserver {
+[DartSupplemental]
+interface Navigator {
+  [DartSuppress] void getUserMedia(MediaStreamConstraints constraints,
+                                   NavigatorUserMediaSuccessCallback successCallback,
+                                   NavigatorUserMediaErrorCallback errorCallback);
 };
 
 [DartSupplemental,
@@ -245,34 +346,14 @@
 [DartSuppress]
 interface AbstractView {};
 
-interface InjectedScriptHost {
-    [Custom] void inspect(any objectId, any hints);
-    [DartSuppress, Custom] any inspectedObject(long num);
-    [DartSuppress, Custom] any internalConstructorName(any obj);
-    [DartSuppress, Custom] boolean isHTMLAllCollection(any obj);
-    [DartSuppress, Custom] DOMString type(any obj);
-    [DartSuppress, Custom] any functionDetails(any obj);
-    [DartSuppress, Custom] any[] getInternalProperties(any obj);
-    [DartSuppress, Custom] EventListener[] getEventListeners(EventTarget target);
-    [DartSuppress, Custom] any evaluate(DOMString text);
-    [DartSuppress, Custom] void debugFunction(any fn);
-    [DartSuppress, Custom] void undebugFunction(any fn);
-    [DartSuppress, Custom] void monitorFunction(any fn);
-    [DartSuppress, Custom] void unmonitorFunction(any fn);
-
-    // Only declarative scope (local, with and catch) is accepted. Returns undefined.
-    [DartSuppress, Custom] any setFunctionVariableValue(any functionObject, long scopeIndex, DOMString variableName, any newValue);
-};
-
-
-
 [DartSuppress]
 interface JavaScriptCallFrame {};
 
-
 [DartSupplemental]
 interface Location {
+  [DartSuppress] attribute URLString href;
   [Custom=Setter] attribute DOMString href;
+  [Custom=Setter] attribute TrustedURL trustedHref;
 
   [Custom] void assign(optional DOMString url);
   [Custom] void replace([Default=Undefined] optional DOMString url);
@@ -292,6 +373,14 @@
 [DartSuppress]
 interface ImageBitmapFactories {};
 
+[DartSupplemental]
+interface ImageData {
+    [DartSuppress] ImageDataColorSettings getColorSettings();
+    // Below needs 'any' because ImageDataArray is union of (Uint8ClampedArray
+    // or Uint16Array or Float32Array) 
+    [DartSuppress] readonly attribute any dataUnion;
+};
+
 // See https://chromiumcodereview.appspot.com/15901002 for the V8 implementation of
 // TextEncoder/TextDecoder
 [DartSuppress]
@@ -370,9 +459,10 @@
 
 [DartSupplemental]
 interface DOMImplementation {
-    [DartSuppress]
-    CSSStyleSheet createCSSStyleSheet([Default=Undefined] optional DOMString title,
+    [DartSuppress] CSSStyleSheet createCSSStyleSheet([Default=Undefined] optional DOMString title,
                                       [Default=Undefined] optional DOMString media);
+    [DartSuppress] Document createHTMLDocument(optional DOMString title);
+    HTMLDocument createHTMLDocument(optional DOMString title);
 };
 
 [DartSupplemental]
@@ -403,8 +493,8 @@
 };
 
 [DartSupplemental]
-interface AudioBufferSourceNode : AudioSourceNode {
-    [DartSuppress] readonly attribute AudioParam gain;
+interface AudioBufferSourceNode {
+    [DartName=start2] void start(optional double when = 0, optional double grainOffset, optional double grainDuration);
 };
 
 // Remove operations webkitRequestFullscreen replaced w/ requestFullscreen.
@@ -415,6 +505,11 @@
 };
 
 [DartSupplemental]
+interface CSS {
+  [DartName=inch] static CSSUnitValue in(double value);
+};
+
+[DartSupplemental]
 interface CSSStyleDeclaration {
     // Expose __propertyQuery__  a getter with a special operation in the IDL
     // when used with Custom=PropertyQuery will emit __propertyQuery__.
@@ -482,10 +577,14 @@
     [MeasureAs=CSSCharsetRuleEncoding] attribute DOMString encoding;
 };
 
+[DartSupplemental]
+interface Event {
+  [DartSuppress] readonly attribute object path;
+};
 
 [DartSupplemental]
 interface EventTarget {
-    [DartSuppress] void addEventListener(DOMString type, EventListener? listener, optional (EventListenerOptions or boolean) options);
+    [DartSuppress] void addEventListener(DOMString type, EventListener? listener, optional (AddEventListenerOptions or boolean) options);
     [DartSuppress] void removeEventListener(DOMString type, EventListener? listener, optional (EventListenerOptions or boolean) options);
     [Custom] void addEventListener(DOMString type, EventListener? listener, optional boolean options);
     [Custom] void removeEventListener(DOMString type, EventListener? listener, optional boolean options);
diff --git a/tools/dom/new_scripts/code_generator_dart.py b/tools/dom/new_scripts/code_generator_dart.py
index d9d86a9..c5a5709 100644
--- a/tools/dom/new_scripts/code_generator_dart.py
+++ b/tools/dom/new_scripts/code_generator_dart.py
@@ -81,7 +81,7 @@
 import idl_types
 from idl_types import IdlType
 from utilities import write_pickle_file
-from v8_globals import includes, interfaces
+from v8_globals import includes
 from dart_utilities import DartUtilities
 
 
@@ -122,10 +122,6 @@
             interface_name
             for interface_name, interface_info in interfaces_info.iteritems()
             if 'GarbageCollected' in interface_info['inherited_extended_attributes']))
-        IdlType.set_will_be_garbage_collected_types(set(
-            interface_name
-            for interface_name, interface_info in interfaces_info.iteritems()
-            if 'WillBeGarbageCollected' in interface_info['inherited_extended_attributes']))
 
     def generate_code(self, definitions, interface_name, idl_pickle_filename,
                       only_if_changed):
diff --git a/tools/dom/new_scripts/dart_utilities.py b/tools/dom/new_scripts/dart_utilities.py
index c01a426..7a57a4f 100644
--- a/tools/dom/new_scripts/dart_utilities.py
+++ b/tools/dom/new_scripts/dart_utilities.py
@@ -151,11 +151,9 @@
 DartUtilities.cpp_name = v8_utilities.cpp_name
 DartUtilities.deprecate_as = _deprecate_as
 DartUtilities.extended_attribute_value_contains = v8_utilities.extended_attribute_value_contains
-DartUtilities.gc_type = v8_utilities.gc_type
 DartUtilities.has_extended_attribute = v8_utilities.has_extended_attribute
 DartUtilities.has_extended_attribute_value = v8_utilities.has_extended_attribute_value
 DartUtilities.measure_as = _measure_as
-DartUtilities.runtime_enabled_function_name = v8_utilities.runtime_enabled_function_name
 DartUtilities.scoped_name = _scoped_name
 DartUtilities.strip_suffix = v8_utilities.strip_suffix
 DartUtilities.uncapitalize = v8_utilities.uncapitalize
diff --git a/tools/dom/scripts/dartgenerator.py b/tools/dom/scripts/dartgenerator.py
index e03a0fa..52ea4b5 100755
--- a/tools/dom/scripts/dartgenerator.py
+++ b/tools/dom/scripts/dartgenerator.py
@@ -98,15 +98,6 @@
               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 6e77214..230c2dd 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -107,8 +107,8 @@
     ],
 
     'Element.getBoundingClientRect': [
-        "@Creates('_ClientRect')",
-        "@Returns('_ClientRect|Null')", # TODO(sra): Verify and remove Null.
+        "@Creates('_DomRect')",
+        "@Returns('_DomRect|Null')", # TODO(sra): Verify and remove Null.
     ],
 
     # Methods returning Window can return a local window, or a cross-frame
diff --git a/tools/dom/scripts/fremontcutbuilder.py b/tools/dom/scripts/fremontcutbuilder.py
index d368470..0bb4b69 100755
--- a/tools/dom/scripts/fremontcutbuilder.py
+++ b/tools/dom/scripts/fremontcutbuilder.py
@@ -5,12 +5,14 @@
 
 import database
 import databasebuilder
+import idlnode
 import logging.config
 import os.path
 import sys
 import time
 import utilities
 import dependency
+from idlnode import IDLType, resolveTypedef
 
 _logger = logging.getLogger('fremontcutbuilder')
 
@@ -36,6 +38,30 @@
     'ENABLE_WEB_AUDIO', # Not on Android
 ]
 
+
+# Resolve all typedefs encountered while parsing (see idlnode.py), resolve any typedefs not resolved
+# during parsing.  This must be done before the database is created, merged, and augmented to
+# exact type matching.  Typedefs can be encountered in any IDL and usage can cross IDL boundaries. 
+def ResolveAllTypedefs(all_interfaces):
+    # Resolve all typedefs.
+    for interface, db_Opts in all_interfaces:
+        def IsIdentified(idl_node):
+            node_name = idl_node.id if idl_node.id else 'parent'
+            for idl_type in idl_node.all(idlnode.IDLType):
+                # 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 True
+
+        interface.constants = filter(IsIdentified, interface.constants)
+        interface.attributes = filter(IsIdentified, interface.attributes)
+        interface.operations = filter(IsIdentified, interface.operations)
+        interface.parents = filter(IsIdentified, interface.parents)
+
 def build_database(idl_files, database_dir, feature_defines=None,
                    logging_level=logging.WARNING, examine_idls=False):
   """This code reconstructs the FremontCut IDL database from W3C,
@@ -54,8 +80,8 @@
   dependency.set_builder(builder)
 
   # TODO(vsm): Move this to a README.
-  # This is the Dart SVN revision.
-  webkit_revision = '1060'
+  # This is the Chrome revision.
+  webkit_revision = '63'
 
   # TODO(vsm): Reconcile what is exposed here and inside WebKit code
   # generation.  We need to recheck this periodically for now.
@@ -88,6 +114,9 @@
 
   start_time = time.time()
 
+  # All typedefs MUST be resolved here before any database fixups (merging, implements, etc.)
+  ResolveAllTypedefs(builder._imported_interfaces)
+
   # Merging:
   builder.merge_imported_interfaces()
 
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 9438b07..4c7ae18 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -16,7 +16,7 @@
 
 _pure_interfaces = monitored.Set('generator._pure_interfaces', [
     'AbstractWorker',
-    'CanvasPathMethods',
+    'CanvasPath',
     'ChildNode',
     'DocumentAnimation',
     'DocumentFontFaceSet',
@@ -153,7 +153,6 @@
     'RTCDTMFSender',
     'RTCDataChannel',
     'RTCDataChannelEvent',
-    'RTCIceCandidateEvent',
     'RTCStatsReport',
     'RTCStatsResponse',
     'ReadableByteStreamReader',
@@ -276,14 +275,12 @@
     'ChannelMergerNode': 'ChannelMergerNode,AudioChannelMerger',
     'ChannelSplitterNode': 'ChannelSplitterNode,AudioChannelSplitter',
 
-    'ClientRectList': 'ClientRectList,DOMRectList',
+    'DOMRectList': 'ClientRectList,DOMRectList',
 
     'CSSStyleDeclaration':
         #                    IE                   Firefox
         'CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties',
 
-    'Clipboard': 'Clipboard,DataTransfer',
-
     'ApplicationCache':
         'ApplicationCache,DOMApplicationCache,OfflineResourceList',
 
@@ -314,8 +311,6 @@
 
     'RTCIceCandidate': 'RTCIceCandidate,mozRTCIceCandidate',
 
-    'RTCIceCandidateEvent': 'RTCIceCandidateEvent,RTCPeerConnectionIceEvent',
-
     'RTCSessionDescription': 'RTCSessionDescription,mozRTCSessionDescription',
 
     'RTCDataChannel': 'RTCDataChannel,DataChannel',
@@ -407,7 +402,7 @@
 def GetCallbackHandlers(interface):
   callback_handlers = []
   callback_handlers = [operation for operation in interface.operations
-      if operation.id == 'handleEvent']
+      if operation.id == 'handleEvent' or operation.id == 'handleMessage']
   if callback_handlers == []:
     callback_handlers = [operation for operation in interface.operations
                          if operation.id == 'handleItem']
@@ -1169,8 +1164,14 @@
   def __init__(self, idl_type, data):
     super(CallbackIDLTypeInfo, self).__init__(idl_type, data)
 
+  def interface_name(self):
+    return self.dart_type()
+
   def implementation_name(self):
-    return ""
+    return self.dart_type()
+
+  def list_item_type(self):
+    return self._data.item_type
 
 
 def array_type(data_type):
@@ -1445,18 +1446,16 @@
     'any': TypeData(clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
     'Array': TypeData(clazz='Primitive', dart_type='List'),
     'custom': TypeData(clazz='Primitive', dart_type='dynamic'),
-    'ClientRect': TypeData(clazz='Interface',
-        dart_type='Rectangle', suppress_interface=True),
+    'DOMRect': TypeData(clazz='Interface',
+         dart_type='Rectangle', suppress_interface=True),
     'Date': TypeData(clazz='Primitive', dart_type='DateTime', native_type='double'),
     'Promise': TypeData(clazz='Primitive', dart_type='Future', native_type='ScriptPromise'),
     'DOMObject': TypeData(clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
     'DOMString': TypeData(clazz='Primitive', dart_type='String', native_type='String'),
+    'ScriptURLString': TypeData(clazz='Primitive', dart_type='String', native_type='String'),
     # TODO(vsm): This won't actually work until we convert the Map to
     # a native JS Map for JS DOM.
     'Dictionary': TypeData(clazz='Primitive', dart_type='Map'),
-    # TODO(terry): It's a dictionary but a very complex dictionary is multiple lists.
-    #              Need to investigate a 1-off solution probably.
-    'MediaKeySystemConfiguration': TypeData(clazz='Primitive', dart_type='Map'),
     'DOMTimeStamp': TypeData(clazz='Primitive', dart_type='int', native_type='unsigned long long'),
     'object': TypeData(clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
     'PositionOptions': TypeData(clazz='Primitive', dart_type='Object'),
@@ -1483,22 +1482,74 @@
         native_type='MutationRecordArray', dart_type='List<MutationRecord>'),
     'StyleSheet': TypeData(clazz='Interface', conversion_includes=['CSSStyleSheet']),
     'SVGElement': TypeData(clazz='Interface', custom_to_dart=True),
-
-    'AudioTrackList': TypeData(clazz='Interface', item_type='AudioTrack',
-        suppress_interface=False, dart_type='List<AudioTrack>'),
-    'ClientRectList': TypeData(clazz='Interface',
-        item_type='ClientRect', dart_type='List<Rectangle>',
-        suppress_interface=True),
     'CSSRuleList': TypeData(clazz='Interface',
         item_type='CSSRule', suppress_interface=True),
     'CSSValueList': TypeData(clazz='Interface',
         item_type='CSSValue', suppress_interface=True),
     'MimeTypeArray': TypeData(clazz='Interface', item_type='MimeType'),
     'PluginArray': TypeData(clazz='Interface', item_type='Plugin'),
+    'DOMRectList': TypeData(clazz='Interface',
+        item_type='DOMRect', dart_type='List<Rectangle>',
+        custom_to_native = True),
     'DOMStringList': TypeData(clazz='Interface', item_type='DOMString',
         dart_type='List<String>', custom_to_native=True),
     'FileList': TypeData(clazz='Interface', item_type='File',
         dart_type='List<File>'),
+    # Handle new FrozenArray Web IDL builtin
+    # TODO(terry): Consider automating this mechanism to map the conversion from FrozenArray<xxx>
+    #              to List<xxx>. Some caveats for double, unsigned int and dictionary.
+    'FrozenArray<BackgroundFetchSettledFetch>': TypeData(clazz='Primitive', item_type='BackgroundFetchSettledFetch',
+        dart_type='List<BackgroundFetchSettledFetch>'),
+    'FrozenArray<DOMString>': TypeData(clazz='Primitive', item_type='DOMString',
+        dart_type='List<String>', custom_to_native=True),
+    'FrozenArray<double>': TypeData(clazz='Primitive', item_type='double',
+        dart_type='List<num>'),
+    'FrozenArray<Entry>': TypeData(clazz='Primitive', item_type='Entry',
+        dart_type='List<Entry>'),
+    'FrozenArray<FillLightMode>': TypeData(clazz='Primitive', item_type='FillLightMode',
+        dart_type='List'),
+    'FrozenArray<FontFace>': TypeData(clazz='Primitive', item_type='FontFace',
+        dart_type='List<FontFace>'),
+    'FrozenArray<GamepadButton>': TypeData(clazz='Primitive', item_type='GamepadButton',
+        dart_type='List<GamepadButton>'),
+    'FrozenArray<Landmark>': TypeData(clazz='Primitive', item_type='Landmark',
+        dart_type='List'),
+    'FrozenArray<MediaImage>': TypeData(clazz='Primitive', item_type='MediaImage',
+        dart_type='List'),
+    'FrozenArray<MediaStream>': TypeData(clazz='Primitive', item_type='MediaStream',
+        dart_type='List<MediaStream>'),
+    'FrozenArray<MessagePort>': TypeData(clazz='Primitive', item_type='MessagePort',
+        dart_type='List<MessagePort>'),
+    'FrozenArray<NotificationAction>': TypeData(clazz='Primitive', item_type='NotificationAction',
+        dart_type='List'),
+    'FrozenArray<PaymentDetailsModifier>': TypeData(clazz='Primitive', item_type='PaymentDetailsModifier',
+        dart_type='List'),
+    'FrozenArray<PaymentMethodData>':TypeData(clazz='Primitive', item_type='PaymentMethodData',
+        dart_type='List'),
+    'FrozenArray<PerformanceServerTiming>': TypeData(clazz='Primitive', item_type='PerformanceServerTiming',
+        dart_type='List<PerformanceServerTiming>'),
+    'FrozenArray<Point2D>': TypeData(clazz='Primitive', item_type='Point2D',
+        dart_type='List'),
+    'FrozenArray<PresentationConnection>': TypeData(clazz='Primitive', item_type='PresentationConnection',
+        dart_type='List<PresentationConnection>'),
+    'FrozenArray<TaskAttributionTiming>': TypeData(clazz='Primitive', item_type='TaskAttributionTiming',
+        dart_type='List<TaskAttributionTiming>'),
+    'FrozenArray<unsigned long>': TypeData(clazz='Primitive', item_type='unsigned long',
+        dart_type='List<int>'),
+    'FrozenArray<USBEndpoint>': TypeData(clazz='Primitive', item_type='USBEndpoint',
+        dart_type='List<USBEndpoint>'),
+    'FrozenArray<USBInterface>': TypeData(clazz='Primitive', item_type='USBInterface',
+        dart_type='List<USBInterface>'),
+    'FrozenArray<USBConfiguration>': TypeData(clazz='Primitive', item_type='USBConfiguration',
+        dart_type='List<USBConfiguration>'),
+    'FrozenArray<USBAlternateInterface>':TypeData(clazz='Primitive', item_type='USBAlternateInterface',
+        dart_type='List<USBAlternateInterface>'),
+    'FrozenArray<USBIsochronousInTransferPacket>':TypeData(clazz='Primitive', item_type='USBIsochronousInTransferPacket',
+        dart_type='List<USBIsochronousInTransferPacket>'), 
+    'FrozenArray<USBIsochronousOutTransferPacket>':TypeData(clazz='Primitive', item_type='USBIsochronousOutTransferPacket',
+        dart_type='List<USBIsochronousOutTransferPacket>'),  
+    'FrozenArray<VRStageBoundsPoint>': TypeData(clazz='Primitive', item_type='VRStageBoundsPoint',
+        dart_type='List<VRStageBoundsPoint>'),
     'Future': TypeData(clazz='Interface', dart_type='Future'),
     'GamepadList': TypeData(clazz='Interface', item_type='Gamepad',
         item_type_nullable=True, suppress_interface=True),
@@ -1602,8 +1653,12 @@
 
   def _TypeInfo(self, type_name):
     match = re.match(r'(?:sequence<([\w ]+)>|(\w+)\[\])$', type_name)
+
+    if match and self._database.HasDictionary(match.group(1)):
+      interface = self._database.GetDictionary(match.group(1))
+
     # sequence<any> should not be List<Object>
-    if match and match.group(1) != 'any':
+    if match and match.group(1) != 'any' and not(self._database.HasDictionary(match.group(1))):
       type_data = TypeData('Sequence')
       if self.HasTypeDef(match.group(1) or match.group(2)):
         # It's a typedef (union)
@@ -1620,17 +1675,21 @@
         return PrimitiveIDLTypeInfo(
             type_name,
             TypeData(clazz='Primitive', dart_type='String', native_type='String'))
-
       if self._database.HasInterface(type_name):
         interface = self._database.GetInterface(type_name)
       elif self._database.HasDictionary(type_name):
-        interface = self._database.GetDictionary(type_name)
+          type_data = _idl_type_registry.get('Dictionary')
+          class_name = '%sIDLTypeInfo' % type_data.clazz
+          return globals()[class_name](type_name, type_data)
       elif type_name.startswith('sequence<('):
         if type_name.find(' or ') != -1:
           # Union type of sequence is an any type (no type).
           type_data = TypeData('Sequence')
           item_info = self.TypeInfo('any')
           return SequenceIDLTypeInfo(type_name, type_data, item_info)
+      elif match and self._database.HasDictionary(match.group(1)):
+          return SequenceIDLTypeInfo(type_name,
+              TypeData('Sequence'), self.TypeInfo(match.group(1)))
       elif type_name.startswith('sequence<sequence<'):
         # TODO(terry): Cleanup up list of list, etc.
         type_data = TypeData('Sequence')
@@ -1639,6 +1698,8 @@
       elif self.HasTypeDef(type_name):
         # It's a typedef (implied union)
         return self.TypeInfo('any')
+      else:
+          print "ERROR: Unexpected interface, or type not found. %s" % type_name
 
       if 'Callback' in interface.ext_attrs:
         return CallbackIDLTypeInfo(type_name, TypeData('Callback',
@@ -1649,7 +1710,10 @@
           self._renamer.RenameInterface(interface),
           self)
 
-    type_data = _idl_type_registry.get(type_name)
+    if (self._database.HasDictionary(type_name)):
+      type_data = _idl_type_registry.get('Dictionary')
+    else:
+      type_data = _idl_type_registry.get(type_name)
 
     if type_data.clazz == 'Interface':
       if self._database.HasInterface(type_name):
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 5bad37f..52b1dfe 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -545,7 +545,6 @@
     # Hack to ignore the constructor used by JavaScript.
     if ((self._interface.id == 'HTMLImageElement' or
          self._interface.id == 'Blob' or
-         self._interface.id == 'TouchEvent' or
          self._interface.id == 'DOMException')
       and not constructor_info.pure_dart_constructor):
       return
@@ -604,8 +603,14 @@
             inits.Emit('    if ($E != null) e.$E = $E;\n', E=param_info.name)
     else:
       custom_factory_ctr = self._interface.id in _custom_factories
-      constructor_full_name = constructor_info._ConstructorFullName(
+      if self._interface_type_info.has_generated_interface():
+        constructor_full_name = constructor_info._ConstructorFullName(
           self._DartType)
+      else:
+        # The interface is suppress_interface so use the implementation_name not
+        # the dart_type.
+        constructor_full_name = self._interface_type_info.implementation_name()
+        factory_name = constructor_full_name
 
       def GenerateCall(
           stmts_emitter, call_emitter,
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 2bf39b6..827a79d 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -115,6 +115,14 @@
   '*.webkitfullscreenerror': ('fullscreenError', 'Event'),
   '*.wheel': ('wheel', 'WheelEvent'),
   'AbstractWorker.error': ('error', 'Event'),
+  'AccessibleNode.accessibleclick': ('accessibleClick', 'Event'),
+  'AccessibleNode.accessiblecontextmenu': ('accessibleContextMenu', 'Event'),
+  'AccessibleNode.accessibledecrement': ('accessibleDecrement', 'Event'),
+  'AccessibleNode.accessiblefocus': ('accessibleFocus', 'Event'),
+  'AccessibleNode.accessibleincrement': ('accessibleIncrement', 'Event'),
+  'AccessibleNode.accessiblescrollintoview': ('accessibleScrollIntoView', 'Event'),
+  'Animation.finish': ('finish', 'Event'),
+  'Animation.cancel': ('cancel', 'Event'),
   'AudioContext.complete': ('complete', 'Event'),
   'ApplicationCache.cached': ('cached', 'Event'),
   'ApplicationCache.checking': ('checking', 'Event'),
@@ -131,6 +139,7 @@
   'Document.pointerlockerror': ('pointerLockError', 'Event'),
   'EventSource.open': ('open', 'Event'),
   'FileReader.abort': ('abort', 'ProgressEvent'),
+  'FileReader.error': ('error', 'ProgressEvent'),
   'FileReader.load': ('load', 'ProgressEvent'),
   'FileReader.loadend': ('loadEnd', 'ProgressEvent'),
   'FileReader.loadstart': ('loadStart', 'ProgressEvent'),
@@ -140,10 +149,9 @@
   'FileWriter.write': ('write', 'ProgressEvent'),
   'FileWriter.writeend': ('writeEnd', 'ProgressEvent'),
   'FileWriter.writestart': ('writeStart', 'ProgressEvent'),
-  'FontLoader.load': ('load', 'CssFontFaceLoadEvent'),
-  'FontLoader.loading': ('loading', 'CssFontFaceLoadEvent'),
-  'FontLoader.loadingdone': ('loadingDone', 'CssFontFaceLoadEvent'),
-  'FontLoader.loadstart': ('loadStart', 'CssFontFaceLoadEvent'),
+  'FontFaceSet.loading': ('loading', 'FontFaceSetLoadEvent'),
+  'FontFaceSet.loadingdone': ('loadingDone', 'FontFaceSetLoadEvent'),
+  'FontFaceSet.loadingerror': ('loadingError', 'FontFaceSetLoadEvent'),
   'HTMLBodyElement.storage': ('storage', 'StorageEvent'),
   'HTMLCanvasElement.webglcontextlost': ('webGlContextLost', 'gl.ContextEvent'),
   'HTMLCanvasElement.webglcontextrestored': ('webGlContextRestored', 'gl.ContextEvent'),
@@ -185,12 +193,16 @@
   'RTCDataChannel.open': ('open', 'Event'),
   'RTCPeerConnection.addstream': ('addStream', 'MediaStreamEvent'),
   'RTCPeerConnection.datachannel': ('dataChannel', 'RtcDataChannelEvent'),
-  'RTCPeerConnection.icecandidate': ('iceCandidate', 'RtcIceCandidateEvent'),
+  'RTCPeerConnection.icecandidate': ('iceCandidate', 'RtcPeerConnectionIceEvent'),
   'RTCPeerConnection.iceconnectionstatechange': ('iceConnectionStateChange', 'Event'),
   'RTCPeerConnection.negotiationneeded': ('negotiationNeeded', 'Event'),
   'RTCPeerConnection.removestream': ('removeStream', 'MediaStreamEvent'),
   'RTCPeerConnection.signalingstatechange': ('signalingStateChange', 'Event'),
   'ScriptProcessorNode.audioprocess': ('audioProcess', 'AudioProcessingEvent'),
+  'ServiceWorkerGlobalScope.activate': ('activate', 'Event'),
+  'ServiceWorkerGlobalScope.fetch': ('fetch', 'Event'),
+  'ServiceWorkerGlobalScope.install': ('install', 'Event'),
+  'ServiceWorkerGlobalScope.foreignfetch': ('foreignfetch', 'ForeignFetchEvent'),
   'SharedWorker.error': ('error', 'Event'),
   'SharedWorkerGlobalScope.connect': ('connect', 'Event'),
   'SpeechRecognition.audioend': ('audioEnd', 'Event'),
@@ -223,6 +235,7 @@
   'Window.pageshow': ('pageShow', 'Event'),
   'Window.progress': ('progress', 'Event'),
   'Window.webkittransitionend': ('webkitTransitionEnd', 'TransitionEvent'),
+  'Window.wheel': ('wheel', 'WheelEvent'),
   'Worker.error': ('error', 'Event'),
   'XMLHttpRequestEventTarget.abort': ('abort', 'ProgressEvent'),
   'XMLHttpRequestEventTarget.error': ('error', 'ProgressEvent'),
@@ -231,7 +244,7 @@
   'XMLHttpRequestEventTarget.loadstart': ('loadStart', 'ProgressEvent'),
   'XMLHttpRequestEventTarget.progress': ('progress', 'ProgressEvent'),
   'XMLHttpRequestEventTarget.timeout': ('timeout', 'ProgressEvent'),
-  'XMLHttpRequest.readystatechange': ('readyStateChange', 'ProgressEvent'),
+  'XMLHttpRequest.readystatechange': ('readyStateChange', 'Event'),
 })
 
 # These classes require an explicit declaration for the "on" method even though
@@ -251,6 +264,7 @@
 
   def EmitStreamProviders(self, interface, custom_events,
       members_emitter, library_name):
+
     events = self._GetEvents(interface, custom_events)
     if not events:
       return
@@ -279,6 +293,7 @@
   def EmitStreamGetters(self, interface, custom_events,
       members_emitter, library_name, stream_getter_signatures_emitter=None,
       element_stream_getters_emitter=None):
+
     events = self._GetEvents(interface, custom_events)
     if not events:
       return
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 12e2de5..9033552 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -24,12 +24,12 @@
 html_interface_renames = monitored.Dict('htmlrenamer.html_interface_renames',
                                         dict({
     'Attr': '_Attr',
+    'BudgetService': '_BudgetService',
     'CDATASection': 'CDataSection',
-    'Clipboard': 'DataTransfer',
+    'Clipboard': '_Clipboard', # TODO(terry): Need to remove when ACX Clipboard is renamed to AcxClipboard.
     'Database': 'SqlDatabase', # Avoid conflict with Index DB's Database.
     'DatabaseSync': 'SqlDatabaseSync',
     'DOMFileSystem': 'FileSystem',
-    'DOMRect': '_DomRect',
     'Entity': '_Entity', # Not sure if we want to expose this yet, may conflict with other libs.
     'EntryCallback': '_EntryCallback',
     'EntriesCallback': '_EntriesCallback',
@@ -47,9 +47,11 @@
     'NavigatorUserMediaErrorCallback': '_NavigatorUserMediaErrorCallback',
     'NavigatorUserMediaSuccessCallback': '_NavigatorUserMediaSuccessCallback',
     'NotificationPermissionCallback': '_NotificationPermissionCallback',
+    'Position': 'Geoposition',
     'PositionCallback': '_PositionCallback',
     'PositionErrorCallback': '_PositionErrorCallback',
     'Request': '_Request',
+    'Report': '_Report',
     'RTCDTMFSender': 'RtcDtmfSender',
     'RTCDTMFToneChangeEvent': 'RtcDtmfToneChangeEvent',
     'RTCErrorCallback': '_RtcErrorCallback',
@@ -68,6 +70,16 @@
     'XMLHttpRequestEventTarget': 'HttpRequestEventTarget',
 }, **typed_array_renames))
 
+
+# Some callback interfaces are not just a simple callback functions.  If the callback
+# interface is in this list then the interface is exposed as a class.
+_gen_callback_interfaces = [
+  'NodeFilter'
+]
+
+def generateCallbackInterface(id):
+  return id in _gen_callback_interfaces
+
 # Interfaces that are suppressed, but need to still exist for Dartium and to
 # properly wrap DOM objects if/when encountered.
 _removed_html_interfaces = [
@@ -80,7 +92,7 @@
   'BluetoothRemoteGATTService',
   'BluetoothUUID',
   'Cache', # TODO: Symbol conflicts with Angular: dartbug.com/20937
-  'CanvasPathMethods',
+  'CanvasPath',
   'CDataSection',
   'CSSPrimitiveValue',
   'CSSUnknownRule',
@@ -104,6 +116,11 @@
   'HTMLFrameSetElement',
   'HTMLMarqueeElement',
   'IDBAny',
+  'Mojo',
+  'MojoHandle',
+  'MojoInterfaceInterceptor',
+  'MojoInterfaceRequestEvent',
+  'MojoWatcher',
   'NFC',
   'Notation',
   'PagePopupController',
@@ -162,7 +179,6 @@
   'WorkerLocation', # Workers
   'WorkerNavigator', # Workers
   'Worklet', # Rendering Workers
-  'WorkletGlobalScope', # Rendering Workers
   'XMLHttpRequestProgressEvent',
   # Obsolete event for NaCl.
   'ResourceProgressEvent',
@@ -323,6 +339,7 @@
   'Element.children',
   'Element.childElementCount',
   'Element.firstElementChild',
+  'Element.getClientRects',
   'Element.getElementsByTagName',
   'Element.insertAdjacentHTML',
   'Element.scrollIntoView',
@@ -404,6 +421,7 @@
   'ParentNode.firstElementChild',
   'ParentNode.lastElementChild',
   'ParentNode.querySelectorAll',
+  'Range.getClientRects',
   'RTCPeerConnection.createAnswer',
   'RTCPeerConnection.createOffer',
   'RTCPeerConnection.getStats',
@@ -440,7 +458,6 @@
   'Touch.screenY',
   'Touch.radiusX',
   'Touch.radiusY',
-  'TouchEvent.initTouchEvent',
   'UIEvent.initUIEvent',
   'UIEvent.layerX',
   'UIEvent.layerY',
@@ -537,7 +554,6 @@
 # number of arguments vary), so we do not rename them as a _raw method.
 keep_overloaded_members = monitored.Set(
     'htmldartgenerator.keep_overloaded_members', [
-  'AudioBufferSourceNode.start',
   'CanvasRenderingContext2D.putImageData',
   'CanvasRenderingContext2D.webkitPutImageDataHD',
   'DataTransferItemList.add',
@@ -707,7 +723,6 @@
     'Element.offsetLeft',
     'Element.offsetWidth',
     'Element.offsetHeight',
-    'Element.on:wheel',
     'Element.outerText',
     'Element.prepend',
     'Element.removeAttributeNode',
@@ -904,14 +919,24 @@
   'AudioBufferSourceNode': 'web_audio',
   'AudioContext': 'web_audio',
   'AudioDestinationNode': 'web_audio',
+  'AudioElement': 'web_audio',
   'AudioListener': 'web_audio',
   'AudioNode': 'web_audio',
   'AudioParam': 'web_audio',
+  'AudioParamMap': 'web_audio',
   'AudioProcessingEvent': 'web_audio',
+  'AudioScheduledSourceNode': 'web_audio',
   'AudioSourceNode': 'web_audio',
+  'AudioTrack': 'web_audio',
+  'AudioTrackList': 'web_audio',
+  'AudioWorkletGlobalScope': 'web_audio',
+  'AudioWorkletNode': 'web_audio',
+  'AudioWorkletProcessor': 'web_audio',
+  'BaseAudioContext': 'web_audio',
   'BiquadFilterNode': 'web_audio',
   'ChannelMergerNode': 'web_audio',
   'ChannelSplitterNode': 'web_audio',
+  'ConstantSourceNode': 'web_audio',
   'ConvolverNode': 'web_audio',
   'DelayNode': 'web_audio',
   'DynamicsCompressorNode': 'web_audio',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index 85d711c..a9b7fd7 100644
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -236,6 +236,7 @@
       'ParentInterface': 'parent',
       'Id': 'name',
       'Interface': 'interfaces',
+      'Callback_Function': 'callback_functions',
       'Callback': 'is_callback',
       'Partial': 'is_partial',
       'Operation': 'operations',
@@ -397,6 +398,23 @@
     self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
     self.dictionaries = self._convert_all(ast, 'Dictionary', IDLDictionary)
 
+    if len(ast.callback_functions) > 0:
+      callback_functions = self._convert_all(ast, 'Callback_Function', IDLCallbackFunction)
+      for callback_function in callback_functions:
+        for annotation in callback_function.annotations:
+          callback = callback_function.annotations[annotation]
+          cb_interface = IDLInterface(None, callback.name)
+          cb_interface.ext_attrs['Callback'] = None
+          op = IDLOperation(None, cb_interface.id, "handleEvent")
+          op.type = IDLType(callback.idl_type)
+          op.type = resolveTypedef(op.type)
+
+          if len(callback.arguments) > 0:
+            op.arguments = self._convert_all(callback, 'Argument', IDLArgument)
+
+          cb_interface.operations = [op]
+          self.interfaces.append(cb_interface)
+
     is_blink = not(isinstance(ast, list)) and ast.__module__ == 'idl_definitions'
 
     if is_blink:
@@ -640,6 +658,7 @@
 
           # TODO(terry): Handled USVString as a DOMString.
           type_name = type_name.replace('USVString', 'DOMString', 1)
+          type_name = type_name.replace('HTMLString', 'DOMString', 1)
 
           # TODO(terry); WindowTimers setInterval/setTimeout overloads with a
           #              Function type - map to any until the IDL uses union.
@@ -693,6 +712,12 @@
 
     # TODO(terry): Need to handle emitting of enums for dart:html
 
+class IDLCallbackFunction(IDLNode):
+  """IDLNode for 'callback [type] [id]' declarations."""
+  def __init__(self, ast):
+    IDLNode.__init__(self, ast)
+    self._convert_annotations(ast)
+    self.type = self._convert_first(ast, 'Type', IDLType)
 
 class IDLTypeDef(IDLNode):
   """IDLNode for 'typedef [type] [id]' declarations."""
@@ -729,6 +754,14 @@
       value = IDLDictionaryMember(member, js_name)
       self[name] = value
 
+def generate_callback(interface_name, result_type, arguments):
+  syn_op = IDLOperation(None, interface_name, 'callback')
+
+  syn_op.type = resolveTypedef(result_type)
+  syn_op.arguments = arguments
+
+  return syn_op
+
 def generate_operation(interface_name, result_type_name, oper_name, arguments):
   """ Synthesize an IDLOperation with no AST used for support of setlike."""
   """ Arguments is a list of argument where each argument is:
@@ -740,8 +773,8 @@
   syn_op.type = resolveTypedef(syn_op.type)
 
   for argument in arguments:
-    arg = IDLArgument(None, argument[1]);
-    arg.type = argument[0];
+    arg = IDLArgument(None, argument[1])
+    arg.type = argument[0]
     arg.optional = argument[2] if len(argument) > 2 else False
     syn_op.arguments.append(arg)
 
@@ -800,8 +833,12 @@
   """IDLInterface node contains operations, attributes, constants,
   as well as parent references."""
 
-  def __init__(self, ast):
+  def __init__(self, ast, id=None):
     IDLNode.__init__(self, ast)
+
+    if id:
+      self.id = id
+
     self._convert_ext_attrs(ast)
     self._convert_annotations(ast)
 
@@ -821,7 +858,7 @@
     self.operations = self._convert_all(ast, 'Operation',
       lambda ast: IDLOperation(ast, self.doc_js_name))
 
-    if ast.setlike:
+    if not(id) and ast.setlike:
       setlike_ops = generate_setLike_operations_properties(self, ast.setlike)
       for op in setlike_ops:
         self.operations.append(op)
@@ -903,7 +940,7 @@
       self.specials = []
       self.is_static = False
       self.arguments = []
-      return;
+      return
 
     self.type = self._convert_first(ast, 'ReturnType', IDLType)
     self.type = resolveTypedef(self.type)
diff --git a/tools/dom/scripts/idlsync.py b/tools/dom/scripts/idlsync.py
index 632e236..e5ac565 100755
--- a/tools/dom/scripts/idlsync.py
+++ b/tools/dom/scripts/idlsync.py
@@ -1,6 +1,6 @@
 # Upgrading Dart's SDK for HTML (blink IDLs).
 #
-# Typically this is done using the Dart integration branch (as it has to be
+# Typically this is done using the Dart WebCore branch (as it has to be
 # staged to get most things working).
 #
 # Enlist in third_party/WebCore:
@@ -9,7 +9,7 @@
 #      > git clone https://github.com/dart-lang/webcore.git WebCore
 #
 # To update all *.idl, *.py, LICENSE files, and IDLExtendedAttributes.txt:
-#      > cd src/dart
+#      > cd sdk
 #      > python tools/dom/scripts/idlsync.py
 #
 # Display blink files to delete, copy, update, and collisions to review:
@@ -30,6 +30,7 @@
 #
 # Finally, commit the files in dart/third_party/WebCore.
 
+import errno
 import optparse
 import os.path
 import re
@@ -40,24 +41,22 @@
 
 from shutil import copyfile
 
-# Dartium DEPS file from the DEPS file checked into the dart-lang/sdk integration
-# branch.
-DEPS_GIT = ('https://raw.githubusercontent.com/dart-lang/sdk/integration/'
-            'tools/deps/dartium.deps/DEPS')
+# Dart DEPS file checked into the dart-lang/sdk master.
+DEPS_GIT = "https://raw.githubusercontent.com/dart-lang/sdk/master/DEPS"
 CHROME_TRUNK = "https://chromium.googlesource.com"
-WEBKIT_URL_PATTERN = r'"dartium_chromium_commit": "(\S+)",'
-DEPS_PATTERNS = {
-    'webkit': (CHROME_TRUNK, WEBKIT_URL_PATTERN),
-}
+WEBKIT_SHA_PATTERN = r'"WebCore_rev": "(\S+)",'
 
-# Dartium/Chromium remote (GIT repository)
-GIT_REMOTES_CHROMIUM = 'https://chromium.googlesource.com/dart/dartium/src.git'
+# Chromium remote (GIT repository)
+GIT_REMOTES_CHROMIUM = 'https://chromium.googlesource.com/chromium/src.git'
 
 # location of this file
-SOURCE_FILE_DIR = 'src/dart/tools/dom/scripts'
+SOURCE_FILE_DIR = 'tools/dom/scripts'
 
 WEBKIT_SOURCE = 'src/third_party/WebKit/Source'
-WEBCORE_SOURCE = 'src/dart/third_party/WebCore'
+WEBCORE_SOURCE = 'third_party/WebCore'
+
+WEBKIT_BLINK_SOURCE = 'src/third_party/blink'
+WEBCORE_BLINK_SOURCE = 'third_party/WebCore/blink'
 
 # Never automatically git add bindings/IDLExtendedAttributes.txt this file has
 # been modified by Dart but is usually changed by WebKit blink too.
@@ -69,6 +68,10 @@
 # is driven from the blink IDL parser AST
 DART_SDK_GENERATOR_SCRIPTS = 'bindings/dart/scripts'
 
+# The __init__.py files allow Python to treat directories as packages. Used to
+# allow Dart's Python scripts to interact with Chrome's IDL parsing scripts.
+PYTHON_INITS = '__init__.py'
+
 # sub directories containing IDLs (core and modules) from the base directory
 # src/third_party/WebKit/Source
 SUBDIRS = [
@@ -89,16 +92,24 @@
 
 warning_messages = []
 
-# Is --check passed in.
-def isChecked():
+# Is --dry_run passed in.
+def isDryRun():
   global options
-  return options['check'] is not None
+  return options['dry_run'] is not None
 
 # Is --verbose passed in.
 def isVerbose():
   global options
   return options['verbose'] is not None
 
+# If --WebKit= is specified then compute the directory of the Chromium
+# source.
+def chromiumDirectory():
+  global options
+  if options['chromium_dir'] is not None:
+    return os.path.expanduser(options['chromium_dir'])
+  return os.cwd()
+
 def RunCommand(cmd, valid_exits=[0]):
   """Executes a shell command and return its stdout."""
   if isVerbose():
@@ -136,8 +147,13 @@
 # source_dir is the src/third_party/WebKit/Source location (blink)
 # destination_dir is the src/dart/third_party/WebCore location
 # returns idls_copied, py_copied, other_copied
-def copy_files(source_dir, destination_dir):
+def copy_files(source_dir, src_prefix, destination_dir):
   original_cwd = os.getcwd()
+  try:
+    os.makedirs(destination_dir)
+  except OSError as e:
+    if e.errno != errno.EEXIST:
+      raise
   os.chdir(destination_dir)
 
   idls = 0                  # *.idl files copied
@@ -161,8 +177,14 @@
           else:
             others += 1
           src_file = os.path.join(root, f)
-          dst_root = root.replace(WEBKIT_SOURCE, WEBCORE_SOURCE)
-          dst_file = os.path.join(dst_root, f)
+
+          # Compute the destination path using sdk/third_party/WebCore
+          subdir_root = src_file[src_file.rfind(src_prefix) + len(src_prefix):]
+          if subdir_root.startswith(os.path.sep):
+            subdir_root = subdir_root[1:]
+          dst_file = os.path.join(destination_dir, subdir_root)
+
+          # Need to make src/third_party/WebKit/Source/* to sdk/third_party/WebCore/*
 
           destination = os.path.dirname(dst_file)
           if not os.path.exists(destination):
@@ -170,16 +192,17 @@
 
           has_Dart_fix_me = anyDartFixMe(dst_file)
 
-          if not isChecked():
+          if not isDryRun():
             copyfile(src_file, dst_file)
           if isVerbose():
-            print('...copying %s' % os.path.split(dst_file)[1])
+            #print('...copying %s' % os.path.split(dst_file)[1])
+            print('...copying %s' % dst_file)
           if f == IDL_EXTENDED_ATTRIBUTES_FILE:
             warning_messages.append(dst_file)
           else:
             if has_Dart_fix_me:
               warning_messages.append(dst_file)
-            if not (isChecked() or has_Dart_fix_me):
+            if not (isDryRun() or has_Dart_fix_me):
               # git add the file
               RunCommand(['git', 'add', dst_file])
 
@@ -196,21 +219,24 @@
   files_to_delete = []
 
   original_cwd = os.getcwd()
-  os.chdir(webcore_dir)
 
-  for (root, _, files) in os.walk(os.path.join(webcore_dir, subdir), topdown=False):
-    dir_portion = subpath(root, webcore_dir)
-    for f in files:
-      # Never automatically deleted any Dart generator scripts (these are the
-      # original sources in WebCore).
-      if dir_portion != DART_SDK_GENERATOR_SCRIPTS:
-        check_file = os.path.join(dir_portion, f)
-        check_file_full_path = os.path.join(webkit_dir, check_file)
-        if not os.path.exists(check_file_full_path):
-          if not isChecked():
-            # Remove the file using git
-            RunCommand(['git', 'rm', check_file])
-          files_to_delete.append(check_file)
+  if os.path.exists(webcore_dir):
+    os.chdir(webcore_dir)
+
+    for (root, _, files) in os.walk(os.path.join(webcore_dir, subdir), topdown=False):
+      dir_portion = subpath(root, webcore_dir)
+      for f in files:
+        # Never automatically deleted any Dart generator scripts (these are the
+        # original sources in WebCore).
+        if dir_portion != DART_SDK_GENERATOR_SCRIPTS:
+          check_file = os.path.join(dir_portion, f)
+          check_file_full_path = os.path.join(webkit_dir, check_file)
+          if not os.path.exists(check_file_full_path) and \
+             not(check_file_full_path.endswith(PYTHON_INITS)):
+            if not isDryRun():
+              # Remove the file using git
+              RunCommand(['git', 'rm', check_file])
+            files_to_delete.append(check_file)
 
   os.chdir(original_cwd)
 
@@ -218,15 +244,18 @@
 
 def ParseOptions():
   parser = optparse.OptionParser()
-  parser.add_option('--verbose', '-v', dest='verbose', action='store_false',
+  parser.add_option('--chromium', '-c', dest='chromium_dir', action='store', type='string',
+                    help='WebKit Chrome directory (e.g., --chromium=~/chrome63', default=None)
+  parser.add_option('--verbose', '-v', dest='verbose', action='store_true',
                     help='Dump all information', default=None)
-  parser.add_option('--check', '-c', dest='check', action='store_false',
+  parser.add_option('--dry_run', '-d', dest='dry_run', action='store_true',
                     help='Display results without adding, updating or deleting any files', default=None)
   args, _ = parser.parse_args()
 
   argOptions = {}
+  argOptions['chromium_dir'] = args.chromium_dir
   argOptions['verbose'] = args.verbose
-  argOptions['check'] = args.check
+  argOptions['dry_run'] = args.dry_run
   return argOptions
 
 # Fetch the DEPS file in src/dart/tools/deps/dartium.deps/DEPS from the GIT repro.
@@ -244,34 +273,68 @@
   print 'ERROR: Unable to find dart/dartium/src repository %s' % GIT_REMOTES_CHROMIUM
   return False
 
-def getCurrentDartiumSHA():
+def getChromiumSHA():
   cwd = os.getcwd()
+  chromiumDir = chromiumDirectory()
+
+  webkit_dir = os.path.join(chromiumDir, WEBKIT_SOURCE)
+  os.chdir(webkit_dir)
+
+  if ValidateGitRemotes():
+    chromium_sha = RunCommand(['git', 'log', '--format=format:%H', '-1'])
+  else:
+    chromium_sha = -1
+
+  os.chdir(cwd)
+  return chromium_sha
+
+def getCurrentDartSHA():
+  cwd = os.getcwd()
+
   if cwd.endswith('dart'):
-    # In src/dart 
+    # In src/dart
     src_dir, _ = os.path.split(cwd)
-  elif cwd.endswith('src'):
+  elif cwd.endswith('sdk'):
     src_dir = cwd
   else:
-    src_dir = os.path.join(cwd, 'src')
+    src_dir = os.path.join(cwd, 'sdk')
   os.chdir(src_dir)
 
   if ValidateGitRemotes():
-    dartium_sha = RunCommand(['git', 'log', '--format=format:%H', '-1'])
+    dart_sha = RunCommand(['git', 'log', '--format=format:%H', '-1'])
   else:
-    dartium_sha = -1
+    dart_sha = -1
 
   os.chdir(cwd)
-  return dartium_sha
+  return dart_sha
 
 # Returns the SHA of the Dartium/Chromiun in the DEPS file.
-def GetDEPSDartiumGitRevision(deps, component):
+def GetDEPSWebCoreGitRevision(deps, component):
   """Returns a tuple with the (dartium chromium repo, latest revision)."""
-  url_base, url_pattern = DEPS_PATTERNS[component]
-  url = url_base + re.search(url_pattern, deps).group(1)
+  foundIt = re.search(WEBKIT_SHA_PATTERN, deps)
+  #url_base, url_pattern = DEPS_PATTERNS[component]
+  #url = url_base + re.search(url_pattern, deps).group(1)
   # Get the SHA for the Chromium/WebKit changes for Dartium.
-  revision = url[len(url_base):]
+  #revision = url[len(url_base):]
+  revision = foundIt.group(1)[1:]
+  print '%s' % revision
   return revision
 
+def copy_subdir(src, src_prefix, dest, subdir):
+  idls_deleted = remove_obsolete_webcore_files(dest, src, subdir)
+  print "%s files removed in WebCore %s" % (idls_deleted.__len__(), subdir)
+  if isVerbose():
+    for delete_file in idls_deleted:
+      print "    %s" % delete_file
+
+  idls_copied, py_copied, other_copied = copy_files(os.path.join(src, subdir), src_prefix, dest)
+  if idls_copied > 0:
+    print "Copied %s IDLs to %s" % (idls_copied, subdir)
+  if py_copied > 0:
+    print "Copied %s PYs to %s" % (py_copied, subdir)
+  if other_copied > 0:
+    print "Copied %s other to %s\n" % (other_copied, subdir)
+
 def main():
   global options
   options = ParseOptions()
@@ -282,29 +345,40 @@
 
   base_directory = current_dir[:current_dir.rfind(SOURCE_FILE_DIR)]
 
-  # Validate that the DEPS SHA matches the SHA of the chromium/dartium branch.
+  # Validate DEPS WebCore_rev SHA DOES NOT match the SHA of chromium master.
   deps = GetDepsFromGit()
-  revision = GetDEPSDartiumGitRevision(deps, 'webkit')
-  dartium_sha = getCurrentDartiumSHA()
-  if not(revision == dartium_sha):
-    print "ERROR: Chromium/Dartium SHA in DEPS doesn't match the GIT branch."
+  webcore_revision = GetDEPSWebCoreGitRevision(deps, 'webkit')
+  chromium_sha = getChromiumSHA()
+  if webcore_revision == chromium_sha:
+    print "ERROR: Nothing to update in WebCore, WebCore_rev SHA in DEPS " \
+          "matches Chromium GIT master SHA in %s" % options['webkit_dir']
     return
 
   start_time = time.time()
+
+  # Copy scripts from third_party/blink/tools to third_party/WebCore/blink/tools
+  #
+  # This also implies that the files:
+  #     WebCore/bindings/scripts/code_generator_web_agent_api.py
+  #     WebCore/bindings/scripts/utilities.py
+  #
+  # Need to have sys.path.append at beginning of the above files changed from:
+  #
+  #    sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', '..',
+  #                                 'third_party', 'blink', 'tools'))
+  # to
+  #
+  #    sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..',
+  #                                 'blink', 'tools'))
+  #
+  webkit_blink_dir = os.path.join(chromiumDirectory(), WEBKIT_BLINK_SOURCE)
+  webcore_blink_dir = os.path.join(base_directory, WEBCORE_BLINK_SOURCE)
+  copy_subdir(webkit_blink_dir, WEBKIT_BLINK_SOURCE, webcore_blink_dir, "")
+
+  chromium_webkit_dir = os.path.join(chromiumDirectory(), WEBKIT_SOURCE)
+  dart_webcore_dir = os.path.join(base_directory, WEBCORE_SOURCE)
   for subdir in SUBDIRS:
-    webkit_dir = os.path.join(base_directory, WEBKIT_SOURCE) 
-    webcore_dir = os.path.join(base_directory, WEBCORE_SOURCE)
-
-    idls_deleted = remove_obsolete_webcore_files(webcore_dir, webkit_dir, subdir)
-    print "%s files removed in WebCore %s" % (idls_deleted.__len__(), subdir)
-    if isVerbose():
-      for delete_file in idls_deleted:
-        print "    %s" % delete_file
-
-    idls_copied, py_copied, other_copied = copy_files(os.path.join(webkit_dir, subdir), webcore_dir)
-    print "Copied %s IDLs to %s" % (idls_copied, subdir)
-    print "Copied %s PYs to %s" % (py_copied, subdir)
-    print "Copied %s other to %s\n" % (other_copied, subdir)
+    copy_subdir(chromium_webkit_dir, WEBKIT_SOURCE, dart_webcore_dir, subdir)
 
   end_time = time.time()
 
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 8ab959c..e100908 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -13,6 +13,7 @@
 import re
 from generator import *
 from htmldartgenerator import *
+from htmlrenamer import generateCallbackInterface
 
 _logger = logging.getLogger('systemhtml')
 
@@ -35,8 +36,6 @@
     ])
 
 _js_custom_members = monitored.Set('systemhtml._js_custom_members', [
-    'AudioBufferSourceNode.start',
-    'AudioBufferSourceNode.stop',
     'AudioContext.createGain',
     'AudioContext.createScriptProcessor',
     'CanvasRenderingContext2D.drawImage',
@@ -128,6 +127,7 @@
     'Blob',
     'Comment',
     'MutationObserver',
+    'PaymentRequest',
     'RTCIceCandidate',
     'RTCPeerConnection',
     'RTCSessionDescription',
@@ -504,6 +504,8 @@
     elif 'Callback' in self._interface.ext_attrs:
       if len(GetCallbackHandlers(self._interface)) > 0:
         self.GenerateCallback()
+      elif generateCallbackInterface(self._interface.id):
+        self.GenerateInterface()
       else:
         return
     else:
@@ -846,6 +848,13 @@
     return argument.optional
 
   def EmitStaticFactoryOverload(self, constructor_info, name, arguments):
+    if self._interface_type_info.has_generated_interface():
+      # Use dart_type name, we're generating.
+      interface_name = self._interface_type_info.interface_name()
+    else:
+      # Use the implementation name the interface is suppressed.
+      interface_name = self._interface_type_info.implementation_name()
+
     index = len(arguments)
     arguments = constructor_info.ParametersAsArgumentList(index)
     if arguments:
@@ -853,7 +862,7 @@
     self._members_emitter.Emit(
         "  static $INTERFACE_NAME $NAME($PARAMETERS) => "
           "JS('$INTERFACE_NAME', 'new $CTOR_NAME($PLACEHOLDERS)'$ARGUMENTS);\n",
-        INTERFACE_NAME=self._interface_type_info.interface_name(),
+        INTERFACE_NAME=interface_name,
         NAME=name,
         # TODO(antonm): add types to parameters.
         PARAMETERS=constructor_info.ParametersAsArgumentList(index),
@@ -931,12 +940,16 @@
           ' JS("void", "#[#] = #", this, index, value); }',
           TYPE=self._NarrowInputType(element_type))
     else:
+      theType = self._NarrowInputType(element_type)
+      if theType == 'DomRectList':
+          theType = '';
+
       self._members_emitter.Emit(
           '\n'
           '  void operator[]=(int index, $TYPE value) {\n'
           '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
           '  }\n',
-          TYPE=self._NarrowInputType(element_type))
+          TYPE=theType)
 
     self.EmitListMixin(self._DartType(element_type), nullable)
 
@@ -1019,7 +1032,7 @@
           RENAME=rename,
           ANNOTATIONS=metadata,
           NAME=html_name,
-          TYPE=output_type)
+          TYPE=input_type if output_type == 'double' else output_type)
 
   def _AddAttributeUsingProperties(self, attribute, html_name, read_only):
     self._AddRenamingGetter(attribute, html_name)
@@ -1124,8 +1137,25 @@
     else:
       self._AddDirectNativeOperation(info, html_name)
 
+  def _computeResultType(self, checkType):
+    # TODO(terry): Work around bug in dart2js compiler e.g.,
+    #     typedef void CustomElementConstructor();
+    #     CustomElementConstructor registerElement(String type, [Map options])
+    # Needs to become:
+    #     Function registerElement(String type, [Map options])
+    resultType = checkType
+    if self._database.HasInterface(resultType):
+        resultInterface = self._database.GetInterface(resultType)
+        if 'Callback' in resultInterface.ext_attrs:
+            resultType = 'Function'
+    return resultType
+
+
   def _AddDirectNativeOperation(self, info, html_name):
     force_optional = True if html_name.startswith('_') else False
+
+    resultType = self._computeResultType(info.type_name)
+
     self._members_emitter.Emit(
         '\n'
         '  $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
@@ -1133,20 +1163,23 @@
         METADATA=self._Metadata(info.type_name, info.declared_name,
             self.SecureOutputType(info.type_name)),
         MODIFIERS='static ' if info.IsStatic() else '',
-        TYPE=self.SecureOutputType(info.type_name, False, True),
+        TYPE=self.SecureOutputType(resultType, False, True),
         NAME=html_name,
         PARAMS=info.ParametersAsDeclaration(self._NarrowInputType, force_optional))
 
   def _AddOperationWithConversions(self, info, html_name):
     # Assert all operations have same return type.
     assert len(set([op.type.id for op in info.operations])) == 1
-    output_conversion = self._OutputConversion(info.type_name,
+
+    resultType = self._computeResultType(info.type_name)
+
+    output_conversion = self._OutputConversion(resultType,
                                                info.declared_name)
     if output_conversion:
       return_type = output_conversion.output_type
       native_return_type = output_conversion.input_type
     else:
-      return_type = self._NarrowInputType(info.type_name)
+      return_type = resultType if resultType == 'Function' else self._NarrowInputType(resultType)
       native_return_type = return_type
 
     parameter_names = [param_info.name for param_info in info.param_infos]
diff --git a/tools/dom/src/WebGLConstants.dart b/tools/dom/src/WebGLConstants.dart
index ae4057a..89d87ce 100644
--- a/tools/dom/src/WebGLConstants.dart
+++ b/tools/dom/src/WebGLConstants.dart
@@ -236,7 +236,6 @@
 const int STENCIL_CLEAR_VALUE = RenderingContext.STENCIL_CLEAR_VALUE;
 const int STENCIL_FAIL = RenderingContext.STENCIL_FAIL;
 const int STENCIL_FUNC = RenderingContext.STENCIL_FUNC;
-const int STENCIL_INDEX = RenderingContext.STENCIL_INDEX;
 const int STENCIL_INDEX8 = RenderingContext.STENCIL_INDEX8;
 const int STENCIL_PASS_DEPTH_FAIL = RenderingContext.STENCIL_PASS_DEPTH_FAIL;
 const int STENCIL_PASS_DEPTH_PASS = RenderingContext.STENCIL_PASS_DEPTH_PASS;
diff --git a/tools/dom/src/dart2js_Console.dart b/tools/dom/src/dart2js_Console.dart
new file mode 100644
index 0000000..6166c0a
--- /dev/null
+++ b/tools/dom/src/dart2js_Console.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of html;
+
+class Console {
+  const Console._safe();
+  static const Console _safeConsole = const Console._safe();
+
+  bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
+
+  @DomName('Console.memory')
+  MemoryInfo get memory =>
+      _isConsoleDefined ? JS('MemoryInfo', 'window.console.memory') : null;
+
+  @DomName('Console.assertCondition')
+  void assertCondition(bool condition, Object arg) => _isConsoleDefined
+      ? JS('void', 'window.console.assertCondition(#, #)', condition, arg)
+      : null;
+
+  @DomName('Console.clear')
+  void clear(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.clear(#)', arg) : null;
+
+  @DomName('Console.count')
+  void count(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.count(#)', arg) : null;
+
+  @DomName('Console.debug')
+  void debug(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.debug(#)', arg) : null;
+
+  @DomName('Console.dir')
+  void dir(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.dir(#)', arg) : null;
+
+  @DomName('Console.dirxml')
+  void dirxml(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.dirxml(#)', arg) : null;
+
+  @DomName('Console.error')
+  void error(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.error(#)', arg) : null;
+
+  @DomName('Console.group')
+  void group(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.group(#)', arg) : null;
+
+  @DomName('Console.groupCollapsed')
+  void groupCollapsed(Object arg) => _isConsoleDefined
+      ? JS('void', 'window.console.groupCollapsed(#)', arg)
+      : null;
+
+  @DomName('Console.groupEnd')
+  void groupEnd() =>
+      _isConsoleDefined ? JS('void', 'window.console.groupEnd()') : null;
+
+  @DomName('Console.info')
+  void info(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.info(#)', arg) : null;
+
+  @DomName('Console.log')
+  void log(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.log(#)', arg) : null;
+
+  @DomName('Console.markTimeline')
+  void markTimeline(Object arg) => _isConsoleDefined
+      ? JS('void', 'window.console.markTimeline(#)', arg)
+      : null;
+
+  @DomName('Console.profile')
+  void profile(String title) =>
+      _isConsoleDefined ? JS('void', 'window.console.profile(#)', title) : null;
+
+  @DomName('Console.profileEnd')
+  void profileEnd(String title) => _isConsoleDefined
+      ? JS('void', 'window.console.profileEnd(#)', title)
+      : null;
+
+  @DomName('Console.table')
+  void table(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.table(#)', arg) : null;
+
+  @DomName('Console.time')
+  void time(String title) =>
+      _isConsoleDefined ? JS('void', 'window.console.time(#)', title) : null;
+
+  @DomName('Console.timeEnd')
+  void timeEnd(String title) =>
+      _isConsoleDefined ? JS('void', 'window.console.timeEnd(#)', title) : null;
+
+  @DomName('Console.timeStamp')
+  void timeStamp(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.timeStamp(#)', arg) : null;
+
+  @DomName('Console.trace')
+  void trace(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.trace(#)', arg) : null;
+
+  @DomName('Console.warn')
+  void warn(Object arg) =>
+      _isConsoleDefined ? JS('void', 'window.console.warn(#)', arg) : null;
+}
diff --git a/tools/dom/src/dart2js_CustomElementSupport.dart b/tools/dom/src/dart2js_CustomElementSupport.dart
index fa1b129..7869ea3 100644
--- a/tools/dom/src/dart2js_CustomElementSupport.dart
+++ b/tools/dom/src/dart2js_CustomElementSupport.dart
@@ -66,8 +66,7 @@
   }
 }
 
-void _registerCustomElement(
-    context, document, String tag, Type type, String extendsTagName) {
+Function _registerCustomElement(context, document, String tag, [Map options]) {
   // Function follows the same pattern as the following JavaScript code for
   // registering a custom element.
   //
@@ -82,6 +81,13 @@
   //    ...
   //    var e = document.createElement('x-foo');
 
+  var extendsTagName = '';
+  Type type;
+  if (options != null) {
+    extendsTagName = options['extends'];
+    type = options['prototype'];
+  }
+
   var interceptorClass = findInterceptorConstructorForType(type);
   if (interceptorClass == null) {
     throw new ArgumentError(type);
@@ -135,13 +141,13 @@
 
   setNativeSubclassDispatchRecord(proto, interceptor);
 
-  var options = JS('=Object', '{prototype: #}', proto);
+  var opts = JS('=Object', '{prototype: #}', proto);
 
   if (extendsTagName != null) {
-    JS('=Object', '#.extends = #', options, extendsTagName);
+    JS('=Object', '#.extends = #', opts, extendsTagName);
   }
 
-  JS('void', '#.registerElement(#, #)', document, tag, options);
+  return JS('=Object', '#.registerElement(#, #)', document, tag, opts);
 }
 
 //// Called by Element.created to do validation & initialization.
diff --git a/tools/dom/src/dart2js_KeyEvent.dart b/tools/dom/src/dart2js_KeyEvent.dart
index 92534a1a..e4bc296 100644
--- a/tools/dom/src/dart2js_KeyEvent.dart
+++ b/tools/dom/src/dart2js_KeyEvent.dart
@@ -187,6 +187,7 @@
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
   int get detail => _parent.detail;
+  bool get isComposing => _parent.isComposing;
   String get key => _parent.key;
   /**
    * Accessor to the part of the keyboard that the key was pressed from (one of
@@ -234,5 +235,6 @@
 
   @Experimental() // untriaged
   bool get repeat => throw new UnimplementedError();
+  bool get isComposed => throw new UnimplementedError();
   dynamic get _get_view => throw new UnimplementedError();
 }
diff --git a/tools/dom/src/dart2js_WrappedEvent.dart b/tools/dom/src/dart2js_WrappedEvent.dart
index e7ab18b..02dab3d 100644
--- a/tools/dom/src/dart2js_WrappedEvent.dart
+++ b/tools/dom/src/dart2js_WrappedEvent.dart
@@ -19,11 +19,9 @@
 
   bool get cancelable => wrapped.cancelable;
 
-  EventTarget get currentTarget => wrapped.currentTarget;
+  bool get composed => wrapped.composed;
 
-  List<EventTarget> deepPath() {
-    return wrapped.deepPath();
-  }
+  EventTarget get currentTarget => wrapped.currentTarget;
 
   bool get defaultPrevented => wrapped.defaultPrevented;
 
@@ -31,15 +29,13 @@
 
   bool get isTrusted => wrapped.isTrusted;
 
-  bool get scoped => wrapped.scoped;
-
   EventTarget get target => wrapped.target;
 
   double get timeStamp => wrapped.timeStamp;
 
   String get type => wrapped.type;
 
-  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) {
+  void _initEvent(String type, [bool bubbles, bool cancelable]) {
     throw new UnsupportedError('Cannot initialize this Event.');
   }
 
@@ -55,6 +51,8 @@
     wrapped.stopPropagation();
   }
 
+  List<EventTarget> composedPath() => wrapped.composedPath();
+
   /**
    * A pointer to the element whose CSS selector matched within which an event
    * was fired. If this Event was not associated with any Event delegation,
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index dfb08cb..0ee1f54 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -46,6 +46,7 @@
 import 'dart:svg' show Matrix;
 import 'dart:svg' show SvgSvgElement;
 import 'dart:web_audio' as web_audio;
+import 'dart:web_audio' show AudioBuffer, AudioTrack, AudioTrackList;
 import 'dart:web_gl' as gl;
 import 'dart:web_gl' show RenderingContext,RenderingContext2;
 import 'dart:web_sql';
@@ -87,6 +88,7 @@
 part '$AUXILIARY_DIR/WrappedList.dart';
 part '$AUXILIARY_DIR/_HttpRequestUtils.dart';
 part '$AUXILIARY_DIR/_ListIterators.dart';
+part '$AUXILIARY_DIR/dart2js_Console.dart';
 part '$AUXILIARY_DIR/dart2js_Conversions.dart';
 part '$AUXILIARY_DIR/dart2js_CustomElementSupport.dart';
 part '$AUXILIARY_DIR/dart2js_DOMImplementation.dart';
@@ -121,7 +123,7 @@
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
 @Native("HTMLElement")
-class HtmlElement extends Element {
+class HtmlElement extends Element implements NoncedElement {
   factory HtmlElement() { throw new UnsupportedError("Not supported"); }
 
   /**
@@ -130,6 +132,10 @@
    * This can only be called by subclasses from their created constructor.
    */
   HtmlElement.created() : super.created();
+
+  // From NoncedElement
+  @DomName('HTMLElement.nonce')
+  String nonce;
 }
 
 createCustomUpgrader(Type customElementClass, $this) => $this;
@@ -142,3 +148,4 @@
 @Experimental() // untriaged
 typedef void FontFaceSetForEachCallback(
     FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
+
diff --git a/tools/dom/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate b/tools/dom/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
deleted file mode 100644
index 7773f8f..0000000
--- a/tools/dom/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
+++ /dev/null
@@ -1,39 +0,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.
-
-part of $LIBRARYNAME;
-
-$(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS {
-
-  // TODO(efortuna): Remove these methods when Chrome stable also uses start
-  // instead of noteOn.
-  void start(num when, [num grainOffset, num grainDuration]) {
-    if (JS('bool', '!!#.start', this)) {
-      if (grainDuration != null) {
-        JS('void', '#.start(#, #, #)', this, when, grainOffset, grainDuration);
-      } else if (grainOffset != null) {
-        JS('void', '#.start(#, #)', this, when, grainOffset);
-      } else {
-        JS('void', '#.start(#)', this, when);
-      }
-    } else {
-      if (grainDuration != null) {
-        JS('void', '#.noteOn(#, #, #)', this, when, grainOffset, grainDuration);
-      } else if (grainOffset != null) {
-        JS('void', '#.noteOn(#, #)', this, when, grainOffset);
-      } else {
-        JS('void', '#.noteOn(#)', this, when);
-      }
-    }
-  }
-
-  void stop(num when) {
-    if (JS('bool', '!!#.stop', this)) {
-      JS('void', '#.stop(#)', this, when);
-    } else {
-      JS('void', '#.noteOff(#)', this, when);
-    }
-  }
-$!MEMBERS
-}
diff --git a/tools/dom/templates/html/dart2js/impl_PaymentRequest.darttemplate b/tools/dom/templates/html/dart2js/impl_PaymentRequest.darttemplate
new file mode 100644
index 0000000..3110cc8
--- /dev/null
+++ b/tools/dom/templates/html/dart2js/impl_PaymentRequest.darttemplate
@@ -0,0 +1,35 @@
+// 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.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
+  factory PaymentRequest(List<Map> methodData, Map details,
+      [Map options]) {
+    var methodData_1 = [];
+    for (var i in methodData) {
+      methodData_1.add(convertDartToNative_Dictionary(i));
+    }
+    if (options != null) {
+      var details_1 = convertDartToNative_Dictionary(details);
+      var options_2 = convertDartToNative_Dictionary(options);
+      return PaymentRequest._create_1(methodData_1, details_1, options_2);
+    }
+    var details_1 = convertDartToNative_Dictionary(details);
+    return PaymentRequest._create_2(methodData_1, details_1);
+  }
+
+  static PaymentRequest _create_1(methodData, details, options) => JS(
+      'PaymentRequest',
+      'new PaymentRequest(#,#,#)',
+      methodData,
+      details,
+      options);
+  static PaymentRequest _create_2(methodData, details) =>
+      JS('PaymentRequest', 'new PaymentRequest(#,#)', methodData, details);
+
+$!MEMBERS
+}
+
diff --git a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
index c290f9e..ce8e678 100644
--- a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
@@ -14,7 +14,9 @@
 import 'dart:html_common';
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, JSName, Native, Returns, convertDartClosureToJS;
+import 'dart:_js_helper' show
+    Creates, JavaScriptIndexingBehavior, JSName, Native, Returns,
+    convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 
diff --git a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
index 4d8ff3c..88023f7 100644
--- a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
@@ -7,6 +7,7 @@
  */
 library dart.dom.web_gl;
 
+import 'dart:async';
 import 'dart:collection' hide LinkedList, LinkedListEntry;
 import 'dart:_internal' show FixedLengthListMixin;
 import 'dart:html';
diff --git a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
index 3c9adbd..a90e62e 100644
--- a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
@@ -17,19 +17,26 @@
     }
   }
 
-  ScriptProcessorNode createScriptProcessor(int bufferSize,
-      [int numberOfInputChannels, int numberOfOutputChannels]) {
-    var function = JS('=Object', '#.createScriptProcessor || '
-        '#.createJavaScriptNode', this, this);
+  ScriptProcessorNode createScriptProcessor([int bufferSize,
+      int numberOfInputChannels, int numberOfOutputChannels]) {
+    var function = JS(
+        '=Object',
+        '#.createScriptProcessor || '
+        '#.createJavaScriptNode',
+        this,
+        this);
     if (numberOfOutputChannels != null) {
       return JS('ScriptProcessorNode', '#.call(#, #, #, #)', function, this,
           bufferSize, numberOfInputChannels, numberOfOutputChannels);
     } else if (numberOfInputChannels != null) {
       return JS('ScriptProcessorNode', '#.call(#, #, #)', function, this,
           bufferSize, numberOfInputChannels);
+    } else if (bufferSize != null) {
+      return JS(
+          'ScriptProcessorNode', '#.call(#, #)', function, this, bufferSize);
     } else {
-      return JS('ScriptProcessorNode', '#.call(#, #)', function, this,
-          bufferSize);
+      return JS(
+          'ScriptProcessorNode', '#.call(#)', function, this);
     }
   }
 
@@ -37,21 +44,27 @@
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
   Future _decodeAudioData(ByteBuffer audioData,
-      [AudioBufferCallback successCallback,
-      AudioBufferCallback errorCallback]) native;
+      [DecodeSuccessCallback successCallback,
+      DecodeErrorCallback errorCallback]) native;
 
   @DomName('AudioContext.decodeAudioData')
-  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
+  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData,
+      [DecodeSuccessCallback successCallback,
+      DecodeErrorCallback errorCallback]) {
+    if (successCallback != null &&  errorCallback != null) {
+      return _decodeAudioData(audioData, successCallback, errorCallback);
+    }
+
     var completer = new Completer<AudioBuffer>();
-    _decodeAudioData(audioData,
-        (value) { completer.complete(value); },
-        (error) {
-          if (error == null) {
-            completer.completeError('');
-          } else {
-            completer.completeError(error);
-          }
-        });
+    _decodeAudioData(audioData, (value) {
+      completer.complete(value);
+    }, (error) {
+      if (error == null) {
+        completer.completeError('');
+      } else {
+        completer.completeError(error);
+      }
+    });
     return completer.future;
   }
 }
diff --git a/tools/dom/templates/html/impl/impl_ClientRect.darttemplate b/tools/dom/templates/html/impl/impl_DOMRect.darttemplate
similarity index 100%
rename from tools/dom/templates/html/impl/impl_ClientRect.darttemplate
rename to tools/dom/templates/html/impl/impl_DOMRect.darttemplate
diff --git a/tools/dom/templates/html/impl/impl_DeviceOrientationEvent.darttemplate b/tools/dom/templates/html/impl/impl_DeviceOrientationEvent.darttemplate
deleted file mode 100644
index 6b4a4f8..0000000
--- a/tools/dom/templates/html/impl/impl_DeviceOrientationEvent.darttemplate
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-part of $LIBRARYNAME;
-$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
-  factory $CLASSNAME(String type,
-      {bool canBubble: true, bool cancelable: true, num alpha: 0, num beta: 0,
-      num gamma: 0, bool absolute: false}) {
-    DeviceOrientationEvent e = document._createEvent("DeviceOrientationEvent");
-    e._initDeviceOrientationEvent(type, canBubble, cancelable, alpha, beta,
-        gamma, absolute);
-    return e;
-  }
-$!MEMBERS
-}
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index d64e858..6957bd3 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -56,6 +56,11 @@
   @deprecated
   bool get supportsRegister => supportsRegisterElement;
 
+  void registerElement(String tag, Type customElementClass,
+      {String extendsTag}) {
+        registerElement2(tag, {'prototype': customElementClass, 'extends': extendsTag});
+  }
+
   @DomName('Document.createElement')
   @ForceInline() // Almost all call sites have one argument.
   Element createElement(String tagName, [String typeExtension]) {
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 4ec5836..47d2ce3 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -782,6 +782,24 @@
   @deprecated
   void enteredView() {}
 
+  @DomName('Element.getClientRects')
+  @DocsEditable()
+  @Returns('DomRectList|Null')
+  @Creates('DomRectList')
+  List<Rectangle> getClientRects() {
+    var value = _getClientRects();
+
+    // If no prototype we need one for the world to hookup to the proper Dart class.
+    var jsProto = JS('', '#.prototype', value);
+    if (jsProto == null) {
+      JS('', '#.prototype = Object.create(null)', value);
+    }
+
+    applyExtension('DOMRectList', value);
+
+    return value;
+  }
+
   /** *Deprecated*: override [detached] instead. */
   @Experimental()
   @deprecated
diff --git a/tools/dom/templates/html/impl/impl_Event.darttemplate b/tools/dom/templates/html/impl/impl_Event.darttemplate
index 9ff5f48..6359078 100644
--- a/tools/dom/templates/html/impl/impl_Event.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Event.darttemplate
@@ -56,5 +56,12 @@
     } while (target != null && target != currentTarget.parent);
     throw new StateError('No selector matched for populating matchedTarget.');
   }
+
+  @DomName('Event.path')
+  @DocsEditable()
+  @Experimental()
+  List<EventTarget> get path =>
+    JS('bool', '!!#.composedPath', this) ? composedPath() : [];
+
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 47451dc..1f95dca 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -158,10 +158,8 @@
    * `<input is="x-bar"></input>`
    *
    */
-  void registerElement(String tag, Type customElementClass,
-      {String extendsTag}) {
-    _registerCustomElement(JS('', 'window'), this, tag, customElementClass,
-        extendsTag);
+  Function registerElement2(String tag, [Map options]) {
+    return _registerCustomElement(JS('', 'window'), this, tag, options);
   }
 
   /** *Deprecated*: use [registerElement] instead. */
diff --git a/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate b/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
index 7488d85..2fba73d 100644
--- a/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
@@ -63,21 +63,9 @@
     }
   }
 
-  @DomName('IDBFactory.getDatabaseNames')
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental()
-  Future<List<String>> getDatabaseNames() {
-    try {
-      var request = _webkitGetDatabaseNames();
-
-      return _completeRequest(request);
-    } catch (e, stacktrace) {
-      return new Future.error(e, stacktrace);
-    }
-  }
-
   /**
    * Checks to see if getDatabaseNames is supported by the current platform.
+   * TODO(terry): Should be able to always return false?
    */
   bool get supportsDatabaseNames {
     return supported && JS('bool',
diff --git a/tools/dom/templates/html/impl/impl_Range.darttemplate b/tools/dom/templates/html/impl/impl_Range.darttemplate
index 82ddf8b..64d01a1 100644
--- a/tools/dom/templates/html/impl/impl_Range.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Range.darttemplate
@@ -13,6 +13,24 @@
       document._caretRangeFromPoint(point.x, point.y);
 $!MEMBERS
 
+  @DomName('Range.getClientRects')
+  @DocsEditable()
+  @Returns('DomRectList|Null')
+  @Creates('DomRectList')
+  List<Rectangle> getClientRects() {
+    var value = _getClientRects();
+
+    // If no prototype we need one for the world to hookup to the proper Dart class.
+    var jsProto = JS('', '#.prototype', value);
+    if (jsProto == null) {
+      JS('', '#.prototype = Object.create(null)', value);
+    }
+
+    applyExtension('DOMRectList', value);
+
+    return value;
+  }
+
   /**
    * Checks if createContextualFragment is supported.
    *
diff --git a/tools/dom/templates/html/impl/impl_TouchEvent.darttemplate b/tools/dom/templates/html/impl/impl_TouchEvent.darttemplate
index 7857dc8..5a30fd4 100644
--- a/tools/dom/templates/html/impl/impl_TouchEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_TouchEvent.darttemplate
@@ -7,19 +7,6 @@
 part of $LIBRARYNAME;
 
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
-  factory $CLASSNAME(TouchList touches, TouchList targetTouches,
-      TouchList changedTouches, String type,
-      {Window view, int screenX: 0, int screenY: 0, int clientX: 0,
-      int clientY: 0, bool ctrlKey: false, bool altKey: false,
-      bool shiftKey: false, bool metaKey: false}) {
-    if (view == null) {
-      view = window;
-    }
-    TouchEvent e = document._createEvent("TouchEvent");
-    e._initTouchEvent(touches, targetTouches, changedTouches, type, view,
-        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
-    return e;
-  }
 $!MEMBERS
   /**
    * Checks if touch events supported on the current platform.
diff --git a/tools/dom/templates/html/impl/impl_WebGLCanvas.darttemplate b/tools/dom/templates/html/impl/impl_WebGLCanvas.darttemplate
new file mode 100644
index 0000000..26e09b6
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_WebGLCanvas.darttemplate
@@ -0,0 +1,21 @@
+// 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.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS {
+$!MEMBERS
+
+  @JSName('canvas')
+  @DomName('WebGLCanvas.canvas')
+  @DocsEditable()
+  final CanvasElement canvas;
+
+  @JSName('canvas')
+  @DomName('WebGLCanvas.offscreenCanvas')
+  @DocsEditable()
+  final OffscreenCanvas offscreenCanvas;
+}
+
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index 9da90cd..cf5ddf9 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -177,7 +177,6 @@
   @DomName('Window.console')
   Console get console => Console._safeConsole;
 
-
   /**
    * Access a sandboxed file system of the specified `size`. If `persistent` is
    * true, the application will request permission from the user to create
@@ -211,6 +210,10 @@
   @DomName('Window.onbeforeunload')
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
+  /// Stream of `wheel` events handled by this [Window].
+  @DomName('Window.onWheel')
+  Stream<WheelEvent> get onWheel => Element.wheelEvent.forTarget(this);
+
   /**
    * Moves this window to a specific position.
    *
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 79ea762..0b7c602 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -39,6 +39,7 @@
   bool get _isStrong => _configuration.isStrong;
   bool get _isHostChecked => _configuration.isHostChecked;
   bool get _useSdk => _configuration.useSdk;
+  bool get _useEnableAsserts => _configuration.useEnableAsserts;
 
   /// Only some subclasses support this check, but we statically allow calling
   /// it on [CompilerConfiguration].
@@ -190,6 +191,9 @@
       args.add('--enable_asserts');
       args.add('--enable_type_checks');
     }
+    if (_useEnableAsserts) {
+      args.add('--enable_asserts');
+    }
     if (_configuration.hotReload) {
       args.add('--hot-reload-test-mode');
     } else if (_configuration.hotReloadRollback) {
@@ -250,6 +254,9 @@
       args.add('--enable_asserts');
       args.add('--enable_type_checks');
     }
+    if (_useEnableAsserts) {
+      args.add('--enable_asserts');
+    }
     if (_configuration.hotReload) {
       args.add('--hot-reload-test-mode');
     } else if (_configuration.hotReloadRollback) {
